cms для меню

раньше (без Yii) для редактирования, добавления пунктов в меню

сайта была таблица в базе данных. добавили в таблицу пункт меню,

таблица сформировала id. и система работает.

при Yii надо создавать контроллер, вид. програмно Yii позволяет

это сделать. но если контроллер должен содержать специфический

код, например фильтры, то такой подход отменяется.

вопрос: есть ли возможность или какая стратегия наращивания

меню пользователем в CMS (админке)?

А варианты:

  • устанавливать модуль (с заранее написанной логикой)

  • перенправлять все обращения в один контроллер, после чего вызывать что надо

не катят?

Я просто не совсем понимаю, что надо сделать. Если юзеру страничку текстовую добавить, то можно добавить в таблицу меню что-то типа:

TextController      actionView          [сериализованный массив параметров, среди которых ИД твоей страницы]

Тогда при посторении ссылок ты просто делаешь:

$this->controller->createUrl($menu['controller'].'/'.$menu['action'], unserialize($menu['params']));

А если сложная логика работы, то юзер этого не добавит в любом случае

А еще, ничто не мешает формировать таблицу меню с ГОТОВЫМИ УРЛами. То есть вызывать createUrl() до записи в таблицу, тогда ты в таблице меню можешь держать и ссылки на копоненты и просто любые ссылки. В джумле что-то типа такого сделано.

Посмотри: http://www.yiiframew…on/friendlyurl/

В базе данных хранятся имя страницы в иерархии, имя контроллера и имя страницы. Также в комплекте идёт виджет FriendlyUrlMenu, который построит меню по этим данным.

ну пока делаю так: вместо привычного ?id=999 подставляется

псевдоним, например /about. и это должен обрабатывать 1

контролер. вроде должно получится. доложу позжее, если не забуду

я даю юзеру в таблицу CMS ввести URL, которій он хотел бі видеть для страниці (понятное дело, что есть список стоп-слов, что бі они не пересекались с существующими action). потом в контролере отлавливаю єти сообщения и в упрощеном виде примерно таким образом відаю страницу:




// сюда попадают все єкшині для которіх не описан метод

public function missingAction($action) {

	$content = Content::model()->find('url_alias=?', array($action)); // ищу есть ли в таблице content нужная страница

	if($content === NULL) // если запрашиваемой страниці нет, то 404

		throw new CHttpException(404,'The requested page does not exist.');

	$this->action = $action; // устанавливаю єкшн (кстати кто знает как єто сделать более грамотно?)

	$this->render('cms', array('content'=>$content)); // рендерю страницу

}



А я сделал следующим образом:

У меня есть таблица Url - в которой собраны все общие свойства всех страниц сайта (id, parentId, url, name_eng, name_rus, pageTitle, title, keywords, description,

где name_eng - латинское имя страницы, в зависимости от parentId строится url автоматически,

name_rus - Название страницы, именно оно выводится в меню,

а также поля, необходимые для того, чтобы вызвались необходимые controller/action и параметры, которые им необходимо передать -

route - строка вида module/controller/action,

params - сериализованный массив параметров)

Переписал модуль CUrlManager, и у меня теперь все пути ищутся в таблице Url, при нахождении вызывается необходимый route, а в $_GET помещается params.

Далее сделал себе хелпер, в котором есть статические функции, которые строят мне по этой информации меню, хлебные крошки, карту сайта и т.д. Для большего удобства управления меню я добавил в таблицу Url поле tags, в котором через пробел добавляю ключевые слова, например hide - чтобы не выводить пункт меню, и так далее, добавляя необходимые в зависимости от сайта. Таким образом все меню, хлебные крошки у меня строятся всего за два запроса к БД, планирую еще приделать своего рода кэш, чтобы можно было обходится без запросов.

И еще пока не определился как поступить с построением url. Пока в конфиге передаю своему UrlManager параметр route в котором ключ - строка вида module/controller/action, а значение - url, который вернуть, параметры будут переданы через ?. Если для строящегося url нету такого соответствия, тогда ссылка имеет вид ?route=controller/action&параметр=значение и т.д.