Инструменты пользователя

Инструменты сайта


projects:yii:friendlyurl_extension

Расширение FriendlyUrl - Разработка прекращена!

FriendlyUrl Extension

Справка по классам FriendlyUrl Extension

Версия: 2009-04-13

Лицензия: BSD

В некоторых случая некорректно определяется ссылка на страницу сайта по-умолчанию. Для исправления этого в версии 2009-04-13 необходимо наложить патч:

--- FriendlyUrlMenu.php.orig    2009-04-14 09:14:47.000000000 +0400
+++ FriendlyUrlMenu.php    2009-04-14 09:10:47.000000000 +0400
@@ -113,8 +113,8 @@
             }
         }

-        $this->currentUrl = Yii::app()->urlManager->createUrl($this->controller->furl->url,
-            array(), NULL, $this->controller->furl->action);
+        $this->currentUrl = Yii::app()->urlManager->createUrl(
+            -$this->controller->furl->page->uniqueId);

         $this->buildSubMenu($parent, 0);

История изменений

Исправления и заделы на будущее смотрите в конце страницы, там тоже ведётся своеобразная история.

2009-04-13

  • Изменён метод работы расширения с контроллера-перехватчика на замену адресного менеджера (Yii::app()→urlManager).

Описание

Это расширение добавляет возможность использовать по-настоящему дружественные к пользователю адреса страниц.

Внутренние процессы

Расширение включает в себя класс-замену текущему CUrlManager (с версии 2009-04-13!). Поэтому большинство операций с URL будет происходить прозрачно для остальных классов и расширений Yii.

Адрес строится/разбивается по следующей схеме (на примере адреса «http://yousitename.tdl/beauty/url/delete.2.html»):

  • Путь до страницы и страница - берутся все каталоги адреса: «beauty/url/»;
  • Действие - имя запрашиваемой страницы без пути, с расширением .html: «action»;
  • Идентификатор элемента, над которым будет производиться действие - часть запрошенной страницы сразу после действия и точки, до расширения: 2;

Таким образом, для приведённого адреса мы получаем следущие параметры:

  • $path = beauty/url;
  • $action = delete;
  • $item = 2;

После такого разбора, производится поиск запрошенной страницы путём иерархического обхода дерева страниц, созданного из PHP-файла или базы данных. На этом этапе мы получаем, допустим, переменные переменные:

  • $parentsArray = array('beauty');
  • $page = mixed('pageId'⇒1, 'cname'⇒'url', 'controller'⇒'site', 'pageTitle'⇒'Тестовая страница', 'menuTitle'⇒'Тест');

После того, как контроллер для страницы определен, при создании его экземпляра добавляется (при учёте, что контроллер расширяет поставляемый класс CFriendlyUrlController) переменная $furl, хранящая результат последнего разбора адреса.

С версии 2009-04-03 появилась мозможность указывать в качестве cname пару cname/action для указания, что страница доступна только при указании соответствующего действия.

Также можно теперь можно динамически формировать пункты меню и заголовки страниц путём указания в начале соответствующих полей магической последовательности @@, а вслед за ней - PHP код, который в конце должен вернуть строку значения. Например, при значении поля menuTitle равном '@@return Yii::app()→user→name;', именем пункта меню будет имя текущего пользователя.

Использование

Для того, чтобы использовать данное расширение необходимо внести следующие изменения в файл конфигурации:

<?php
 
return array(
    ...
    'import'=>array(
        ...
        'application.extensions.FriendlyUrl.*',
        ),
    'components'=>array(
        ...
        'urlManager'=>array(
            'class'=>'CFriendlyUrlManager',
            ),
        ),
    ...
    );
 
?>

Также необходимо изменить родительский класс для всех используемых контроллеров с CController на CFriendlyUrlController.

Для работы с контроллером, переработан метод CController.createUrl. Его описание теперь такое:

createUrl($url=NULL, $params=array(), $item=NULL, $action=NULL)

,где

  • $url - путь до страницы или её идентификатор (точнее, читайте в документации по классам),
  • $params - дополнительные параметры запроса,
  • $item - числовое значение элемента для работы,
  • $action - имя запрашиваемого действия.

Ну, и во всех запросах надо использовать идентификатор ($this→furl→page→pageId) страницы для ограничивания результатов только принадлежащими текущей странице.

Пример использование виджета FriendlyUrlMenu

$this->widget('FriendlyUrlMenu', array(
    'levels'=>1,
    'tpl'=>array(
        'innerBegin'=>'<li $class>'
        ),
    ));

Основные параметры:

  • parent - указывает родительскую страницу, дети которой будут выведены в меню;
  • levels - максимальный уровень вложенности, например, 1 - вывести страницы только первого уровеня вложенности, 3 - также второго и третьего уровней вложенности, 0 - все вложенные страницы;
  • tpl - массив оформления вывода меню: array('outerBegin', 'outerEnd', 'innerBegin', 'innerEnd');
  • style - массив указания стилей текущей и всех других страниц: array('inactive', 'active');

Исправления

  • Возникает ошибка: Parse error: syntax error, unexpected ';', expecting T_FUNCTION (2009-04-03).
  • FriendlyUrlMenu неправильно определяет активный пункт меню (2009-04-03).

Заделы на будущее

  • Добавить возможность указания идентификатора страницы вместо $url в вызове createUrl (2009-04-09). * <del>Добавить возможность указания действия у страницы (2009-04-03).
  • Поддержка выполнения PHP кода при определении полей title и menuTitle страницы (2009-04-03).
  • Придумать как обмануть CCaptchaValidator - он определяет текущий контроллер как Yii::app()→getController(), что в данном случае неправильно, т.к. он всегда будет FriendlyUrlCatcher (2009-04-13).

Дискуссия

Enter your comment
 
projects/yii/friendlyurl_extension.txt · Последние изменения: 17.02.2011 08:57 (внешнее изменение)

Инструменты страницы