【问题标题】:How do you use JRoute in Joomla to route to a Search menu item?您如何在 Joomla 中使用 JRoute 路由到搜索菜单项?
【发布时间】:2011-10-13 19:28:22
【问题描述】:

我正在尝试在 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 呢?

谢谢! 大卫

【问题讨论】:

  • 有人对此有答案吗?

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


【解决方案1】:

在 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());

【讨论】:

  • 是的,这将非常有帮助,因为菜单 ID 可以在网站上更改。
  • 如果您没有使用多语言功能,您可以在数据库查询中省略检查语言
  • 呃..它不起作用。您给出的第一个示例抛出一个空白页面,而您给出的第二个示例只是将其添加到文章菜单路径的末尾。
  • 你能告诉我最终的 uri 是什么样子,以及查询中的 itemId 是否正确(与 Manu Manager 中的匹配)
  • 是的,您提供的第一个。JRoute::_('index.php?option=com_search&view=search&itemId=256&searchword=asdsadasdsa'); 返回此网址(在文章模板中):/component/search/?itemId=1008&searchword=natural%20disasters 这将返回一个空白页面。您给的第二个:JRoute::_('index.php?itemId=256&searchword=asdsadasdsa'); 返回此网址:/[category_menu]/[category_menu]?itemId=1008&searchword=natural%20disasters(我使用 [category_menu] 作为占位符。
【解决方案2】:

我使用这种方法来获取特定组件和视图的菜单项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。只需搜索菜单对象。

【讨论】:

    【解决方案3】:

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

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

    它会被转换成这个

    /searchmenuitem.html?searchword=asdsadasdsa
    

    【讨论】:

    • 我已经创建了一个菜单项。使用搜索框模块时,它会将其发送到正确的菜单项,但它使用 POST 来实现这一点。所以即使有一个菜单项,我仍然得到这个/component/search/?searchword=africa
    • 我不清楚。it uses POST to achieve this - 实现什么?海基会网址?什么? I'm still getting this - 你得到了什么?请澄清。
    • 对不起,我没有看到你的完整评论。我在你的编辑之前提交了我的。可以编辑搜索表单吗?如果是,您只需设置methos="get"action="<?php echo JRoute::_('index.php?option=com_search&view=search'); ?>"。这应该会有所帮助。
    • 我只是将搜索表单作为如何路由到搜索 url 的示例,但它使用 POST 而不是 GET,因此该示例没有帮助。我明白你在写什么,但如果你看看我原来的帖子,我完全按照你给的东西,它在 Joomla 1.6 中不能正常工作。
    • 好的,给你一些额外的信息。我只是在尝试从 com_content 中的模板路由 URL 时遇到问题。如果我尝试从 com_search 中的模板路由 url,一切正常。那么,是什么导致它无法正常工作的 com_content 呢?
    猜你喜欢
    • 2014-08-31
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    相关资源
    最近更新 更多