Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!
Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!
Joomla может создавать и синтаксически разбирать URL-адреса в разных форматах, в том числе и в человекопонятном. Одно из преимуществ заключается в том, что преобразование ссылок работает, даже если на сервере нет apache-модуля mod_rewrite.
Хорошим примером этого является статья "Добро пожаловать в Joomla". Первая ссылка создана без mod_rewrite, а вторая с mod_rewrite:
Первым шагом является формирование так называемого псевдонима. Псевдоним используется в URL вместо заголовка "(заголовок это текст, который вы хотите видеь в URL). Псевдоним должен быть URI-безопасным, что означает замену UTF-8 символов их эквивалентами ASCII7, пробельных - дефисами и т.д.
Псевдоним может быть определен самим пользователем, но вы должны обеспечить, чтобы были соблюдены вышеуказанные требования к безопасному URL. Хороший способ сделать это заключается в использовании метода JTable::check() в процесе сохранения. Вы можете посмотреть на этот пример кода:
Если поле псевдонима будет пусто, то заголовок будет использоваться как псевдоним. Тогда псевдоним будет сделан методом JFilterOutput::stringURLSafe().
Продолжая тот же самый пример, "строка" - "1-welcome-to-joomla" состоит из двух частей. Первая часть - идентификатор статьи, и вторая - псевдоним. Они отделены дефисом. Эти два элемента были объединены во время запроса к базе данных в модели:
После этого шага строка используется вместо иденитификатора.
Метод JRoute::_() преобразует внутренние ссылки Joomla в SEF-ссылки. JRoute имеет три параметра, вот её прототип:
JRoute::_($url, $xhtml = true, $ssl = 0);
Где:
$url - абсолютный или относительной внутренний URL Joomla.$xhtml - булевое значение, которое указывает, должен ли вывод быть в XHTML. Этот параметр не обязательный, и равен true по умолчанию.$ssl - целое число, которое определяет должен ли URI быть безопасным.Наиболее важным параметром является $url.
Пример вызова этого метода:
$row->slug это значение, полученное сочетанием id и псевдонима во втором шаге.
Еще одно преимущество использования JRoute состоит в том, что теперь маршрутизатор обрабатывает $option (имя компонента) и $Itemid (id пункта меню). Компонент сам по себе не должен знать своё имя ($option) или id активного пункта меню ($Itemid), как это было в предыдущей версии Joomla.
Очень важно, что вы думаете по поводу последовательности в URL параметра в этой стадии. Это будет более понятно, когда мы глубже взглянем на router.php в следующем разделе.
Процесс создания JRouter делится на два этапа:
У нас будут две функции в router.php. Одна отвечает за создание URL, и другая за его синтаксический разбор. В следующих примерах, очень основном и более продвинутом, мы предполагаем, что у нас есть три представления, на которые могут вести ссылки. Первым представлением является краткий обзор категорий (view=categories), вторым является единственная категория (view=category), и третьей является единственная статья (view=article).
Файл router.php должен быть в области сайта вашего компонента. Это не используется на страницах администрации / внутренних страницах. Не забывайте добавлять router.php к своей инсталляции XML в папке сайта.
Этот простой пример показывает основы работы маршрутизатора вашего компонента.
JRouter передает массив $query в функцию [componentname]BuildRoute. Эта функция добавит соответствующие части массива массиву $segments в правильном порядке и возвратит должным образом полученный массив.
Элементы массива $query должны быть удалены, иначе JRouter добавит их в URL в виде строки запроса (т.е. любые переменные, которые не обрабатываются маршрутизатором будут использованы как параметры в строке запроса).
Следующая функция в router.php разбирает URL:
Что происходит здесь? В функции [componentname]BuildRoute мы упорядочили элементы в массив в определенной последовательности. Это означает, что в этом примере представление является первым, catid является вторым, и идентификатор третьим в массиве. Читая $segments[0], мы получаем название представления. Мы устанавливаем правильное представление и/или идентификатор в зависимости от его значения, и мы возвращаем массив $vars в JRouter. $vars должен быть ассоциативным массивом, подобным массиву, который передали к методу BuildRoute.
Вышеупомянутый пример router.php очень простой способ генерировать sef URL, он должен показать принцип работы маршрутизатора.
Сгенерированный URL в этом примере содержит название представления и не отражает иерархию информационного наполнения:
http://www.example.com/[псевдоним_пункта_меню]/[представление]/[slug]
В следующем примере мы попытаемся избавиться от потребности в представлении, и попытаемся отразить в URL текущий уровень иерархии.
Цель состоит в том, что URL должен выглядеть следующим образом:
http://www.example.com/[псевдоним пункта меню]/[категория]/[статья]http://www.example.com/[псевдоним пункта меню]/[категория]http://www.example.com/[псевдоним пункта меню]Давайте представим, что мы сделали шаг 1 и 2, также для данной категории.
Ссылка на статьи будет выглядеть следующим образом:
И ссылка на категорию будет выглядеть так:
Соответствующий router.php:
Разница заключается в том, что сейчас мы не добавляем имя представления к массиву $segments. Мы по-прежнему отключаем представление, поскольку в противном случаеJRouter добавил бы его в качестве части URL в строке запроса. Еще одним нововведением является параметр catid, который мы добавляем в массив $segments.
Вы видете, что у этой функции ParseRoute в коде есть много отличий по сравнению с предыдущей. Причина для этого проста. У нас нет названия представления в массиве $segments, и мы должны определить его другим способом.
Мы должны узнать, в каком уровне иерархии мы находимся, получая корневой элемент. Мы делаем это, обращаясь к названию представления активного пункта меню:
Также мы должны знать число элементов в массиве $segments:
Имея эту информацию мы можем правильно установить представление для всех возможных трех случаев:
$segments есть два элемента ($catid и $id), мы знаем, что должны анализировать ссылку на статью.$id, мы знаем что должны анализировать ссылку на категорию.$segments - идентификатор для статьи.Результат всего этого кода - хороший и человеческий читаемый URL.
Спасибо большое за статью! Очень полезно и познавательно, особенно понравилось объяснение про разницу функций ParseRoute в разных вариантах. Добавил в избранное ;)
Огромное спасибо автору - действительно очень доступно, по делу и самое главное, то что я искала!
Зачитав статью раз на 5 не пойму как работает router.php.
Вы многое не объясняете и перескакиваете. Ничего не понятно!!!!
Может я не понимаю, но в заголовке статьи написано: Маршрутизация в компоненте. Где об этом рассказывают??
Вот у меня есть компонент. В нём есть разные файлы. И как мне на них смаршрутизировать ссылку?? А не на главный файл компонента??
почитайте про идеологию http://ru.wikipedia.org/wiki/Model-View-Controller
точка входа всегда одна - это контроллер
делаются две функции, одна собирает ссылку в sef, другая разбирает её из sef - в этом основной смысл роутера (маршрутизации)
вход всегда происходит на один и тот же файл /components/com_mycomp/mycomp.php в котором должен создаться контроллер (наследник JController) и выполниться.
Так как мне открыть через ЧПУ, СЕФ или контроллеры простой файлик с расширением php. Что бы в нём НЕ было меню и шаблонов джумлы. КАК????? Я уже всё перерыл...
Мне кажется в учебниках по джумле это должно быть на первой странице! Иначе не понятно, как вообще можно, что-то допиливать в джумле.
Сделайте пустой шаблон или добавьте параметр "?tmpl=raw" (или "?tmpl=component") или вызовите jexit() в методе контроллера
PS sef тут совсем не причем ;)
Чувствую себя недочеловеком. Что за параметр? Я не понимаю вас. Вы объясняете со средины.
Давайте по порядку. У меня уже сейчас есть свой шаблон.
называется tranz. В нём есть файл tranz.php и роутер - router.php
Роутер билдит ссылки и парсит их и передаёт tranz.php.
Далее у меня есть второй файл - prodaja.php - этот файл мне надо открыть посередине экрана в маленьком окошке, что бы не было меню и.т.д., а только мой код. Куда мне этот файл положить и какие параметры прописать к компоненту, что бы напрямую обратиться к prodaja.php??
Создание второго компонента не предлагать. Надо в одном.
Судя по описанию, вы превратили свой сайд в одну большую кашу кода.
Роутер никак не может быть в шаблоне или это большая ошибка!
Параметр я предложил вам добавлять в ссылку, например так http://joomla-book.ru/development/classes/jroute-creating-sef-links-routing-component?tmpl=raw - загрузиться текущая страница, только компонент. Это стандартная возможность Joomla.
Зачем отдельный компонент, сделайте в одном два контроллера, каждый будет отвечать за свое (prodaja, tranz). Контроллер пусть выбирается внешним параметром.
PS очень сложно из вас получать всю информацию, чтобы верно ответить на вопрос ;)
PSS Всеж почитайте о MVC и посмотрите как такое сделано например в com_users.
Нет, нет. Никакой каши. У меня всё по полочкам.
Вы не верно меня поняли наверное...Не правильно написал - у меня свой не шаблон, а компонент tranz. И вообще сайт-то у меня большой...целый портал.
Версия джумлы 1.7.3
Как можно создать два контроллера для одного компонента??
И что-то ?tmpl=raw у меня не работает. Добавляю в конец любой ссылки - открывается чистая - белая страница.
Посмотрите как сделано в com_users
/components/com_users/users.php
/components/com_users/controllers/*
С контроллерами разобрался установив чистый шаблон. И потом посмотрев на users. Но:
?tmpl=component работает, но не до конца!
При открытии остаётся стиль. А в стиле проблема - ширина окна 1000 пикселей фиксированная. И получается что ширина окна 1000 пикселей.
Вопрос!: как отключить цепляние css??? и различных стилей.
Не забывайте joomla 1.7. Может raw где надо использовать? Куда копать???
Вы можете создать в своем шаблоне любой подшаблон, подобно Вашему index.php, только определив в нем иную, нужную вам разметку. Таким образом вы можете вывести компонетт или(и) модуль в нужной разметке или вовсе без нее. Чтобы не грузился стиль - не подключайте стандартную шапку в <head></head>, а вручную пропишите то что Вам нужно. Создайте ваш_подшаблон.php и поместите в папку шаблона. Обращайтесь к нему с помощью параметра в ссылке ?tmpl=ваш_подшаблон
то о чем вы говорите это глупость!!! Нахера такие костыли если есть параметр no_html=1. Нужно его задать и переименовать вьюшку в raw и будет вам счастье. только об этом мало где пишут почему то
Откровенно говоря, вы тоже сказали глупость :) есть параметр выбора главного layout.
чтобы выбрать версию для печати, то в ссылку добавляется параметр tmpl=component
чтобы вернуть только компонент tmpl=raw
чтобы свой любимый шаблон tmpl=mytemplate
по умолчанию выбирается index
Таким образом выбирается файл который будет рендериться из папки /templates/ВАШ ШАБЛОН/. Например для tmpl=mytemplate будет выбран /templates/ВАШ ШАБЛОН/mytemplate.php
В этом файле будут работать все так же как и в /templates/ВАШ ШАБЛОН/index.php
А зачем тогда no_html=1??
Элементарный поиск по Joomla 1.7.3 дал следующее: /libraries/joomla/factory.php, строка 691
"Keep backwards compatibility with Joomla! 1.0" => Для совместимости расширений с Joomla 1.0
Отлично! спасибо за просвещение. жаль в мануале этого не было
НЕ РАБОТАЕТ! Как написали вы! Убираю no_html. Пишу в контроллере: JRequest::setVar('tmpl','raw'); Красная страница с текстом, что нет такого шаблона
ВСЁ перепробовал! Только родимый no_html=1 спасает
Читайте внимательнее то, что я писал выше. Все работает.
Видимо вы скрываете что-то. Не работает у меня:
index.php?option=com_tranz&view=pokupka&layout=pokupka&tmpl=raw&id=45
и
index.php?option=com_tranz&view=pokupka&layout=raw&tmpl=raw&id=45
и
index.php?option=com_tranz&view=pokupka&tmpl=raw&id=45
Никак не работает!
Работает: index.php?option=com_tranz&view=pokupka&layout=pokupka&no_html=1&id=45
raw.php файла есть в шаблоне? в нем должна быть объявлена единственная позиция <jdoc:include type="component" />
в краце об это я написал выше. Читайте внимательнее про mytemplate