Back to MenuRules class

Method preprocess

public void
preprocess
(mixed &$query)
Finds the right Itemid for this query
Parameters
  • array & $query The query array to process
Returns
  • void
Since
  • 3.4
Class: MenuRules
Project: Joomla

Method preprocess - Source code

/**
 * Finds the right Itemid for this query
 *
 * @param   array  &$query  The query array to process
 *
 * @return  void
 *
 * @since   3.4
 */
public function preprocess(&$query)
{
    $active = $this->router->menu->getActive();
    /**
     * If the active item id is not the same as the supplied item id or we have a supplied item id and no active
     * menu item then we just use the supplied menu item and continue
     */
    if (isset($query['Itemid']) && ($active === null || $query['Itemid'] != $active->id)) {
        return;
    }
    // Get query language
    $language = isset($query['lang']) ? $query['lang'] : '*';
    // Set the language to the current one when multilang is enabled and item is tagged to ALL
    if (Multilanguage::isEnabled() && $language === '*') {
        $language = $this->router->app->get('language');
    }
    if (!isset($this->lookup[$language])) {
        $this->buildLookup($language);
    }
    // Check if the active menu item matches the requested query
    if ($active !== null && isset($query['Itemid'])) {
        // Check if active->query and supplied query are the same
        $match = true;
        foreach ($active->query as $k => $v) {
            if (isset($query[$k]) && $v !== $query[$k]) {
                // Compare again without alias
                if (\is_string($v) && $v == current(explode(':', $query[$k], 2))) {
                    continue;
                }
                $match = false;
                break;
            }
        }
        if ($match) {
            // Just use the supplied menu item
            return;
        }
    }
    $needles = $this->router->getPath($query);
    $layout = isset($query['layout']) && $query['layout'] !== 'default' ? ':' . $query['layout'] : '';
    if ($needles) {
        foreach ($needles as $view => $ids) {
            $viewLayout = $view . $layout;
            if ($layout && isset($this->lookup[$language][$viewLayout])) {
                if (\is_bool($ids)) {
                    $query['Itemid'] = $this->lookup[$language][$viewLayout];
                    return;
                }
                foreach ($ids as $id => $segment) {
                    if (isset($this->lookup[$language][$viewLayout][(int) $id])) {
                        $query['Itemid'] = $this->lookup[$language][$viewLayout][(int) $id];
                        return;
                    }
                }
            }
            if (isset($this->lookup[$language][$view])) {
                if (\is_bool($ids)) {
                    $query['Itemid'] = $this->lookup[$language][$view];
                    return;
                }
                foreach ($ids as $id => $segment) {
                    if (isset($this->lookup[$language][$view][(int) $id])) {
                        $query['Itemid'] = $this->lookup[$language][$view][(int) $id];
                        return;
                    }
                }
            }
        }
    }
    // Check if the active menuitem matches the requested language
    if ($active && $active->component === 'com_' . $this->router->getName() && ($language === '*' || \in_array($active->language, array('*', $language)) || !Multilanguage::isEnabled())) {
        $query['Itemid'] = $active->id;
        return;
    }
    // If not found, return language specific home link
    $default = $this->router->menu->getDefault($language);
    if (!empty($default->id)) {
        $query['Itemid'] = $default->id;
    }
}