Для компонента каталога необходимо организовать красивые ссылки. Я опишу на живом примере, что для этого необходимо сделать. Статья пишется на ходу. Пишу код, тестирую, если все работает, дописываю статью.
Для начала нужно создать 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.
Спасибо!