How do you use JRoute in Joomla to route to a Search menu item?

15,432

Solution 1

In joomla administration page go to the menu item you've chosen for the search results page and get the id of that menu item (itemId).

Than you can try using:

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

or even

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

both should result in: /searchmenuitem.html?searchword=asdsadasdsa

EDIT: To make it more comforable you could add itemId as a param to your template.

There is another way, where u can get the itemId from the database (this method is required on multilingual websites). Let me know if you want it.

EDIT2: Here it is:

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

Solution 2

I use this kind of method to get a menu item id of specific component and view

 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;

        }

Then I use this method to get the 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;
}

This just works in any template.

use like this

$itemid = getSearchItemId();

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

You really do not need to do sql on the menu table to get ids. Just search the menu object.

Share:
15,432
David Barratt
Author by

David Barratt

Updated on August 20, 2022

Comments

  • David Barratt
    David Barratt almost 2 years

    I am trying to create a a box in a template in Joomla! that will display all of the keywords and link them to their appropriate search page. I have a menu item set, however, I don't want to hard-code the menu item into the template, so I want to use the JRoute object to generate the SEF url.

    I am using this function:

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

    or this:

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

    however, this generates a url like this:

    /component/search/?searchword=africa
    

    when it ought to create a search url like this:

    /searchmenuitem?searchword=africa
    

    I have searched extensivly online and havn't found a solution to this problem. Any ideas would be greatly appreciated.

    Ok, so some additional information for you.. I am only experiencing the problem when I try and route the URL from a template in com_content. If I try and route the url from a template in com_search everything works perfectly. So, what is it about com_content that is causing this to not work properly?

    thanks! david