4

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

我正在使用这个功能:

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

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

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

谢谢!大卫

4

3 回答 3

4

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

比你可以尝试使用:

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());
于 2011-08-11T01:15:28.730 回答
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

函数 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。只需搜索菜单对象。

于 2012-01-12T07:22:05.897 回答
0

尝试在 joomla 后端创建新菜单,例如“隐藏菜单”。它永远不会显示在前面。但它会被使用JRoute然后添加到这个菜单新的菜单项,名为“searchmenuitem”,链接到com_search。就这些。现在你可以打电话

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

它会被转换成这个

/searchmenuitem.html?searchword=asdsadasdsa
于 2011-07-27T17:44:50.707 回答