%PDF- %PDF-
Direktori : /home1/lightco1/upgrade.lightco.com.au/libraries/cms/component/router/rules/ |
Current File : //home1/lightco1/upgrade.lightco.com.au/libraries/cms/component/router/rules/standard.php |
<?php /** * @package Joomla.Libraries * @subpackage Component * * @copyright Copyright (C) 2005 - 2017 Open Source Matters, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('JPATH_PLATFORM') or die; /** * Rule for the standard handling of component routing * * @since 3.4 */ class JComponentRouterRulesStandard implements JComponentRouterRulesInterface { /** * Router this rule belongs to * * @var JComponentRouterView * @since 3.4 */ protected $router; /** * Class constructor. * * @param JComponentRouterView $router Router this rule belongs to * * @since 3.4 */ public function __construct(JComponentRouterView $router) { $this->router = $router; } /** * Dummymethod to fullfill the interface requirements * * @param array &$query The query array to process * * @return void * * @since 3.4 */ public function preprocess(&$query) { } /** * Parse the URL * * @param array &$segments The URL segments to parse * @param array &$vars The vars that result from the segments * * @return void * * @since 3.4 */ public function parse(&$segments, &$vars) { // Get the views and the currently active query vars $views = $this->router->getViews(); $active = $this->router->menu->getActive(); if ($active) { $vars = array_merge($active->query, $vars); } // We don't have a view or its not a view of this component! We stop here if (!isset($vars['view']) || !isset($views[$vars['view']])) { return; } // Copy the segments, so that we can iterate over all of them and at the same time modify the original segments $tempSegments = $segments; // Iterate over the segments as long as a segment fits foreach ($tempSegments as $segment) { // Our current view is nestable. We need to check first if the segment fits to that if ($views[$vars['view']]->nestable) { if (is_callable(array($this->router, 'get' . ucfirst($views[$vars['view']]->name) . 'Id'))) { $key = call_user_func_array(array($this->router, 'get' . ucfirst($views[$vars['view']]->name) . 'Id'), array($segment, $vars)); // Did we get a proper key? If not, we need to look in the child-views if ($key) { $vars[$views[$vars['view']]->key] = $key; array_shift($segments); continue; } } else { // The router is not complete. The get<View>Key() method is missing. return; } } // Lets find the right view that belongs to this segment $found = false; foreach ($views[$vars['view']]->children as $view) { if (!$view->key) { if ($view->name === $segment) { // The segment is a view name $parent = $views[$vars['view']]; $vars['view'] = $view->name; $found = true; if ($view->parent_key && isset($vars[$parent->key])) { $parent_key = $vars[$parent->key]; $vars[$view->parent_key] = $parent_key; unset($vars[$parent->key]); } break; } } elseif (is_callable(array($this->router, 'get' . ucfirst($view->name) . 'Id'))) { // Hand the data over to the router specific method and see if there is a content item that fits $key = call_user_func_array(array($this->router, 'get' . ucfirst($view->name) . 'Id'), array($segment, $vars)); if ($key) { // Found the right view and the right item $parent = $views[$vars['view']]; $vars['view'] = $view->name; $found = true; if ($view->parent_key && isset($vars[$parent->key])) { $parent_key = $vars[$parent->key]; $vars[$view->parent_key] = $parent_key; unset($vars[$parent->key]); } $vars[$view->key] = $key; break; } } } if (!$found) { return; } array_shift($segments); } } /** * Build a standard URL * * @param array &$query The vars that should be converted * @param array &$segments The URL segments to create * * @return void * * @since 3.4 */ public function build(&$query, &$segments) { // Get the menu item belonging to the Itemid that has been found $item = $this->router->menu->getItem($query['Itemid']); if (!isset($query['view'])) { return; } // Get all views for this component $views = $this->router->getViews(); // Return directly when the URL of the Itemid is identical with the URL to build if (isset($item->query['view']) && $item->query['view'] === $query['view']) { $view = $views[$query['view']]; if (isset($item->query[$view->key]) && $item->query[$view->key] == (int) $query[$view->key]) { unset($query[$view->key]); while ($view) { unset($query[$view->parent_key]); $view = $view->parent; } unset($query['view']); if (isset($item->query['layout']) && isset($query['layout']) && $item->query['layout'] === $query['layout']) { unset($query['layout']); } return; } if (!$view->key) { if (isset($item->query['layout']) && isset($query['layout']) && $item->query['layout'] === $query['layout']) { unset($query['view'], $query['layout']); return; } } } // Get the path from the view of the current URL and parse it to the menu item $path = array_reverse($this->router->getPath($query), true); $found = false; $found2 = false; for ($i = 0, $j = count($path); $i < $j; $i++) { reset($path); $view = key($path); if ($found) { $ids = array_shift($path); if ($views[$view]->nestable) { foreach (array_reverse($ids, true) as $id => $segment) { if ($found2) { $segments[] = str_replace(':', '-', $segment); } elseif ((int) $item->query[$views[$view]->key] == (int) $id) { $found2 = true; } } } elseif (is_bool($ids)) { $segments[] = $views[$view]->name; } else { $segments[] = str_replace(':', '-', array_shift($ids)); } } elseif ($item->query['view'] !== $view) { array_shift($path); } else { if (!$views[$view]->nestable) { array_shift($path); } else { $i--; $found2 = false; } if (count($views[$view]->children)) { $found = true; } } unset($query[$views[$view]->parent_key]); } if ($found) { unset($query['layout'], $query[$views[$query['view']]->key], $query['view']); } } }