Для компонента каталога необходимо организовать красивые ссылки. Я опишу на живом примере, что для этого необходимо сделать. Статья пишется на ходу. Пишу код, тестирую, если все работает, дописываю статью.
Для начала нужно создать router.php в папке компонента (/components/com_catalog/router.php).
Добавим в него функцию которая будет генерировать url:
Вторая функция будет разбирать url на составные части:
Генерация URL в компоненте:
JRoute::_('index.php?view=item&id='. $row->id);
Теперь компонент понимает ссылки вида /catalog/item/1
Это пример из документации. Модифицируем его для более интересной задачи.
Требуется подставлять URL прописанный пользователем.
Url этот хранится в таблице каталога.
Добавим еще одну функцию которая будет выдергивать элемент:
И так теперь наша функция для парсинга будет выглядеть так:
При переходе по ссылке /catalog/test_alias открывется нужная страница.
Функция для генерация url стала такой:
Теперь JRoute::_('index.php?view=item&id=1' ); буде�� отдавать нужный нам url /catalog/test_alias.
Спасибо!
Для начала нужно создать 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.
Спасибо!
