如何在Joomla中使用JRoute路由到搜索菜单项?

时间:2011-07-26 22:08:13

标签: joomla joomla-extensions joomla1.6 joomla-template joomla-sef-urls

我正在尝试在Joomla的模板中创建一个框!这将显示所有关键字并将其链接到相应的搜索页面。我有一个菜单项集,但是,我不想将菜单项硬编码到模板中,所以我想使用JRoute对象来生成SEF网址。

我正在使用此功能:

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

或者这个:

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

然而,这会产生这样的网址:

/component/search/?searchword=africa

什么时候应该创建一个这样的搜索网址:

/searchmenuitem?searchword=africa

我在网上搜索过,并没有找到解决这个问题的方法。任何想法都将不胜感激。

好的,所以有一些额外的信息。我只是在尝试从com_content中的模板路由URL时遇到问题。如果我尝试从com_search中的模板路由url,一切都很完美。那么,com_content是什么导致它无法正常工作?

谢谢! 大卫

3 个答案:

答案 0 :(得分:4)

在joomla管理页面中,转到您为搜索结果页面选择的菜单项,并获取该菜单项(itemId)的ID。

比你可以尝试使用:

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

甚至

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

两者都应该导致:/searchmenuitem.html?searchword=asdsadasdsa

修改 为了使其更有趣,您可以将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());

答案 1 :(得分:1)

我使用这种方法获取特定组件和视图的菜单项ID

 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;

        }

然后我用这个方法来获取sef url

function 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来获取id。只需搜索菜单对象。

答案 2 :(得分:0)

尝试在joomla后端创建新菜单,例如“hidden-menu&#39;”。它永远不会出现在前面。但它会被JRoute使用然后在此菜单中添加名为&#39; searchmenuitem&#39;的新菜单项。链接到com_search。就这些。现在你可以打电话了

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

它将被转换为此

/searchmenuitem.html?searchword=asdsadasdsa