Потдержка SEO URL в MVC компоненте Joomla 3

в 16:33, , рубрики: Песочница, метки: ,

Для компонента каталога необходимо организовать красивые ссылки. Я опишу на живом примере, что для этого необходимо сделать. Статья пишется на ходу. Пишу код, тестирую, если все работает, дописываю статью.

Для начала нужно создать router.php в папке компонента (/components/com_catalog/router.php).

Добавим в него функцию которая будет генерировать url:

function catalogBuildRoute(&$query)
{
       $segments = array();
       if (isset($query['view']))
       {
                $segments[] = $query['view'];
                unset($query['view']);
       }
       if (isset($query['id']))
       {
                $segments[] = $query['id'];
                unset($query['id']);
       };
       return $segments;
}

Вторая функция будет разбирать url на составные части:

function catalogParseRoute($segments)
{
       $vars = array();
       switch($segments[0])
       {
               case 'catalog':
                       $vars['view'] = 'catalog';
                       break;
             
               case 'item':
                       $vars['view'] = 'item';
                       $id = explode(':', $segments[1]);
                       $vars['id'] = (int) $id[0];
                       break;
       }
       return $vars;
}

Генерация URL в компоненте:

JRoute::_('index.php?view=item&id='. $row->id);

Теперь компонент понимает ссылки вида /catalog/item/1

Это пример из документации. Модифицируем его для более интересной задачи.

Требуется подставлять URL прописанный пользователем.
Url этот хранится в таблице каталога.

Добавим еще одну функцию которая будет выдергивать элемент:

function getCatalogItemByRow($row, $value){
    $db = JFactory::getDbo();
    $query = $db->getQuery(true);
    $query->select('id, url');
    $query->from($db->quoteName('#__catalog'));
    $query->where($db->quoteName($row)." = ".$db->quote($value));
    $db->setQuery($query);
    return $db->loadRow();
}

И так теперь наша функция для парсинга будет выглядеть так:

function catalogParseRoute($segments)
{  
       $vars = array();
       $vars['view'] = 'catalog';
      
            
       if($segments[0]!="catalog"){
           
           $item = getCatalogItemByRow("url",$segments[0]);
          
           if(isset($item['1']) && $item['1']) {
               $vars['view'] = 'item';
               $vars['id'] = (int) $item['0'];
           }
       }
   
       return $vars;
}

При переходе по ссылке /catalog/test_alias открывется нужная страница.

Функция для генерация url стала такой:

function catalogBuildRoute(&$query)
{
       $segments = array();
      
        unset($query['view']);
      
       if (isset($query['id']))
       {   
           
           $id = (int) $query['id'];
           if($id){
                $item = getCatalogItemByRow("id",$id);    
                $segments[] = $item['1'];
                unset($query['id']);
           }
       }
       return $segments;
}

Теперь JRoute::_('index.php?view=item&id=1' ); будет отдавать нужный нам url /catalog/test_alias.

Спасибо!

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js