Как получить Itemid по URL-адресу и передать его JRoute

У меня есть пункт меню для определенного вида в настраиваемом компоненте. К этому элементу меню добавлен другой Template Style, а не стандартный шаблон. Доступ к просмотру через меню работает хорошо, поскольку он прикрепляет к URL-адресу Itemid.

Теперь я хочу связать, используя JRoute, представление с другим, однако JRoute не создает желаемый URL.

echo JRoute::_('index.php?option=com_example&view=reporting');

/index.php?option=com_example&view=reporting

JRoute не добавит Itemid к URL-адресу, в результате чего выбранный стиль шаблона для элемента меню не будет работать.

Есть ли способ «вычислить» Itemid (помимо выполнения запроса в таблице jos_menu в колонке link) и прикрепить его к JRoute?

13 голосов | спросил Valentin Despa 7 Maypm14 2014, 15:55:06

4 ответа


18

Вот техника, которую я использовал (не могу вспомнить, где я ее нашел).

$app = JFactory::getApplication(); 
$menu = $app->getMenu();
$menuItem = $menu->getItems( 'link', 'index.php?option=com_example&view=reporting', true );
echo JRoute::_('index.php?Itemid='.$menuItem->id);

Это сработало для меня чудеса.

ответил Jordan Ramstad 7 Maypm14 2014, 23:14:49
4

вывод JRoute будет зависеть от того, что вы его подаете.

JRoute::_("index.php?option=com_content&view=article&id=10"); 

может вернуть что-то еще, чем

JRoute::_("index.php?option=com_content&view=article&id=10&catid=5"); 

Фактически, если у вас есть список блога категории элементов для catid = 5, последний может дать вам URL-адрес (я не тестировал этот точный URL-адрес). Попробуйте с различными параметрами get-parameters получить разные результаты (иногда очень неправильно, как сказал @Fedik)

ответил jonasfh 7 Maypm14 2014, 18:15:24
3

Ключевым моментом здесь является настройка вашего файла router.php компонентов (который должен быть найден в корневой папке вашего компонента на лицевой стороне) с логикой, которая будет искать и выбирать соответствующий пункт меню. Мне бы очень хотелось, чтобы это произошло автоматически, но насколько я знаю, это не так.

Вероятно, лучше всего использовать этот блок кода для некоторого типа вспомогательной функции, которая может использоваться для автоматического поиска пункта меню наилучшего соответствия для контента.

Вот код, который я использовал в нескольких моих пользовательских компонентах, чтобы получить пункт меню наилучшего соответствия:

// I use this first empty array to avoid having unset properties in my query
$base_array = array('Itemid'=>'', 'option'=>'', 'view'=>'', 'layout'=>'', 'id'=>'');

$app =& JFactory::getApplication();
$menu       = $app->getMenu();
$active = $menu->getActive();

// hack to protect the actual current item as well as the search module or other places that use JRoute::_('index.php');
if (count($query)==2 && isset($query['option']) && isset($query['Itemid']) && $query['option'] && $query['Itemid']) {
    return $segments;
}

// start with no match found
$match = false;
$match_level = 0;

$query += $base_array;

// we want to find a menu item for this if possible. If the active menu item is the current menu item then we should see if there is a better match.
if (empty($query['Itemid']) || ($query['Itemid'] == $active->id && empty($query['task']))) {
    // load all menu items
    $items = $menu->getMenu();

    // use the current item over others if it ties for the best match
    if ($active->query['option'] == $query['option']) {
        $match_level = 1;
        $match = $active;
        if ($active->query['view'] == $query['view']) {
            $match_level = 2;
            if ($active->query['layout'] == $query['layout'] || ($query['layout']=='default' && !$active->query['layout'])) {
                $match_level = 3;
                if ($active->query['id'] == $query['id']) {
                    $match_level = 4;
                }
            }
        }
    }

    // loop through each menu item in order
    foreach ($items as $item) {
        $item->query += $base_array;
        // base check is that it is for this component
        // then cycle through each possibility finding it's match level
        if ($item->query['option'] == $query['option']) {
            $item_match = 1;
            if ($item->query['view'] == $query['view']) {
                $item_match = 2;
                if (!$query['layout'] && $item->query['layout']) {
                    $query['layout'] = 'default';
                }
                if ($item->query['layout'] == $query['layout'] || ($query['layout']=='default' && !$item->query['layout'])) {
                    $item_match = 3;
                    if ($item->query['id'] == $query['id']) {
                        $item_match = 4;
                    }
                }
            }
        }

        // if this item is a better match than our current match, set it as the best match
        if ($item_match > $match_level) {
            $match = $item;
            $match_level = $item_match;
        }

    }

    // if there is a match update Itemid to match that menu item
    if ($match) {
        $query['Itemid'] = $match->id;
        $menuItem = $menu->getItem($match->id);
    } else {
        $menuItem = $menu->getActive();
    }
}

Все это вроде беспорядка (и мне бы хотелось улучшить, если у кого их есть!), но он выполняет свою работу. Если текущий пункт меню лучше всего подходит, он всегда будет придерживаться этого.

В противном случае он должен найти наилучшее соответствие на основе имени компонента -> view name -> имя макета -> id. Чем дальше вправо, тем лучше я считаю матч!

ответил David Fritsch 7 Maypm14 2014, 21:57:07
2

Afaik JRoute примет активный Itemid (а также активную опцию option), если ни один не предоставлен. Если это не работает, это означает, что вызов вашего кода начинается без Itemid. Если это так, то проще всего добавить Itemid к внутреннему вызову.

Если вам нужно найти элемент меню, я бы не сделал прямого запроса, но вместо этого использовал JMenu.

ответил Bakual 7 Maypm14 2014, 16:13:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132