Как вы используете JRoute в Joomla для перехода к элементу меню поиска?

Я пытаюсь создать коробку в шаблоне Joomla! который отобразит все ключевые слова и свяжет их с соответствующей страницей поиска. У меня есть набор элементов меню, однако я не хочу жестко кодировать элемент меню в шаблоне, поэтому я хочу использовать объект JRoute для создания URL-адреса SEF.

Я использую эту функцию:

JRoute::_('index.php?option=com_search&searchword='.$keyword);

или это:

JRoute::_('index.php?option=com_search&view=search&searchword='.$keyword);

однако это генерирует такой URL-адрес:

/component/search/?searchword=africa

когда он должен создать URL-адрес поиска следующим образом:

/searchmenuitem?searchword=africa

Я много искал в Интернете и не нашел решения этой проблемы. Любые идеи очень приветствуются.

Итак, немного дополнительной информации для вас. Проблема возникает только тогда, когда я пытаюсь перенаправить URL-адрес из шаблона в com_content. Если я попытаюсь перенаправить URL-адрес из шаблона в com_search, все будет работать отлично. Итак, что такого в com_content, из-за чего это не работает должным образом?

Спасибо! Дэйвид


person David Barratt    schedule 26.07.2011    source источник
comment
У кого-нибудь есть ответ на это?   -  person David Barratt    schedule 02.08.2011


Ответы (3)


На странице администрирования joomla перейдите к пункту меню, который вы выбрали для страницы результатов поиска, и получите идентификатор этого пункта меню (itemId).

Чем вы можете попробовать использовать:

JRoute::_('index.php?option=com_search&view=search&Itemid=256&searchword=asdsadasdsa');

или даже

JRoute::_('index.php?Itemid=256&searchword=asdsadasdsa');

оба должны привести к: /searchmenuitem.html?searchword=asdsadasdsa

EDIT: Чтобы сделать его более удобным, вы можете добавить itemId в качестве параметра в свой шаблон.

Есть еще один способ, где вы можете получить itemId из базы данных (этот метод требуется на многоязычных сайтах). Дайте мне знать, если хотите.

EDIT2: Вот оно:

$db   =& JFactory::getDBO();
$lang =& JFactory::getLanguage()->getTag();
$uri  = 'index.php?option=com_search&view=search';

$db->setQuery('SELECT id FROM #__menu WHERE link LIKE '. $db->Quote( $uri .'%' ) .' AND language='. $db->Quote($lang) .' LIMIT 1' );

$itemId = ($db->getErrorNum())? 0 : intval($db->loadResult());
person WooDzu    schedule 11.08.2011
comment
да, это было бы очень полезно, так как идентификатор меню может измениться на сайте. - person David Barratt; 11.08.2011
comment
если вы не используете многоязычную функцию, вы можете не проверять язык в запросе БД - person WooDzu; 11.08.2011
comment
угу.. не работает. Первый пример, который вы привели, выдает пустую страницу, а второй, который вы привели, просто добавляет ее в конец пути меню к статье. - person David Barratt; 12.08.2011
comment
можете ли вы сказать мне, как выглядит окончательный uri и правильно ли указан itemId из запроса (соответствует ли он из Manu Manager) - person WooDzu; 12.08.2011
comment
да, первый, который вы предоставили.. JRoute::_('index.php?option=com_search&view=search&itemId=256&searchword=asdsadasdsa'); возвращает этот URL-адрес (в шаблоне статьи): /component/search/?itemId=1008&searchword=natural%20disasters возвращает пустую страницу. второй, который вы дали: JRoute::_('index.php?itemId=256&searchword=asdsadasdsa');, возвращает этот URL: /[category_menu]/[category_menu]?itemId=1008&searchword=natural%20disasters (я использовал [category_menu] в качестве заполнителя. - person David Barratt; 12.08.2011
comment
неважно... разобрался... у вас неправильное имя переменной... это Itemid, а не itemId, спасибо! - person David Barratt; 12.08.2011

Я использую этот метод, чтобы получить идентификатор пункта меню определенного компонента и представления.

 function getSearchItemId() {

        $menu = &JSite::getMenu();
        $component = &JComponentHelper::getComponent('com_search');
        //get only com_search menu items
            $items  = $menu->getItems('componentid', $component->id);

        foreach ($items as $item) {
            if (isset($item->query['view']) && $item->query['view'] === 'search') {
                        return $item->id;

                    }
        }

        return false;

        }

Затем я использую этот метод, чтобы получить URL-адрес sef

функция getRouteUrl($route) {

    jimport('joomla.application.router');

    // Get the global site router.
    $config = &JFactory::getConfig();
    $router = JRouter::getInstance('site');
    $router->setMode($config->getValue('sef', 1));

    $uri    = &$router->build($url);
    $path   = $uri->toString(array('path', 'query', 'fragment'));

    return $path;
}

Это просто работает в любом шаблоне.

использовать вот так

$itemid = getSearchItemId();

//returns valid sef url
$url = getRouteUrl('index.php?Itemid='.$itemid);

Вам действительно не нужно делать sql в таблице меню, чтобы получить идентификаторы. Просто найдите объект меню.

person Andy N    schedule 12.01.2012

Попробуйте создать новое меню в бэкенде joomla, например, «скрытое меню». Его никогда не покажут спереди. Но он будет использоваться JRoute. Затем добавьте в это меню новый пункт меню под названием «searchmenuitem» со ссылкой на com_search. Вот и все. Теперь вы можете позвонить

JRoute::_('index.php?option=com_search&view=search&searchword=asdsadasdsa');

и он будет преобразован в это

/searchmenuitem.html?searchword=asdsadasdsa
person Ruslan Polutsygan    schedule 27.07.2011
comment
Я уже создал пункт меню. При использовании модуля окна поиска он отправляет его в правильный пункт меню, но для этого он использует POST. поэтому даже с пунктом меню я все равно получаю это /component/search/?searchword=africa - person David Barratt; 27.07.2011
comment
Мне непонятно.it uses POST to achieve this - чего добиться? URL SEF? И что? I'm still getting this - что ты получаешь? Просьба уточнить. - person Ruslan Polutsygan; 27.07.2011
comment
Извините, я не видел вашего полного комментария. Я представил свой до того, как ваш был отредактирован. Можно редактировать форму поиска? Если да, вы просто устанавливаете methos="get" и action="<?php echo JRoute::_('index.php?option=com_search&view=search'); ?>" в облаке. Это должно помочь. - person Ruslan Polutsygan; 27.07.2011
comment
Я только что посмотрел на форму поиска в качестве примера того, как перейти к URL-адресу поиска, но он использует POST, а не GET, поэтому пример не помогает. Я понимаю, что вы пишите, но если вы посмотрите на мой оригинальный пост, я взял именно то, что вы дали, и это не работает должным образом в Joomla 1.6. - person David Barratt; 28.07.2011
comment
Итак, немного дополнительной информации для вас. Проблема возникает только тогда, когда я пытаюсь перенаправить URL-адрес из шаблона в com_content. Если я попытаюсь перенаправить URL-адрес из шаблона в com_search, все будет работать отлично. Итак, что такого в com_content, из-за чего это не работает должным образом? - person David Barratt; 28.07.2011