вторник, 30 августа 2011 г.

Меню модуля статических страниц

Продолжаю работать над модулем статических страниц. В первой части «Генерация кода модуля в gii» я создал средствами gii стандартный модуль и добавил в него модели и контроллеры из таблиц «страницы» и «сообщения» (tbl_sppages, tbl_spmessage и таблица связей many-to-many tbl_sprelations). Во второй части «Модуль статических страниц» я определил связи этих таблиц и заполнил их тестовыми данными, так же сделал красивые url для моего модуля.
Сегодня, в третьей части моего рассказа, я покажу, как я сделал главное меню с использованием модуля. В модели sppage (файл Z:\home\catalog.loc\www\protected\modules\staticpage\models\Sppage.php) добавляю функцию Staticpages_menu(). Она сгенерирует и возвратит массив пунктов меню динамических страниц.

/**
* Returns all staticpages.
*/
// Буду генерировать массив пунктов меню $r. 
public function Staticpages_menu()
{
//Первый пункт меню: Каталог. 
$r[] =   array('label'=>'Catalog', 'url'=>array('/assortiment/'), 
 'active' => Yii::app()->controller->getId() == 'assortiment');
//Далее беру все записи из модели  sppage отсортированные по полю 'sorting' 
//  и имеющие атрибут 'shown'=yes
$models = sppage::model()->findAll(
array('order' => 'sorting',
'condition' => 'shown = "yes"',
)
);
//Прохожусь по всем строкам и генерую на их основе меню (элементы массива $r)
foreach($models as $val)
{
$r[] =   array(
'label'=>$val->name, 
'url'=>array('/page='.$val->url),
'active' => ($val->url == preg_replace("|[^a-z0-9]|i", NULL,$_GET['id'])),
);
}
//В конец меню добавляю пункт Контакт, логин, логофф.
$r[] =	array('label'=>'Contact', 'url'=>array('/site/contact'));
$r[] =	array('label'=>'Login', 'url'=>array('/site/login'), 
'visible'=>Yii::app()->user->isGuest);
$r[] =	array('label'=>'Logout', 'url'=>array('/site/logout'), 
'visible'=>!Yii::app()->user->isGuest);    				

//Данный метод возвращает массив пунктов меню
return $r;
}

Использую данный метод в файле представления Z:\home\catalog.loc\www\protected\views\layouts\main.php То есть там, где главное меню выводится. Заменяю код, тот что был, на на этот:
<div id="mainmenu">
<?php
//Без этой строки модуль не будет найден (ох как долго я это искал!)
Yii::app()->getModule('staticpage');
$this->widget('zii.widgets.CMenu',array(
//Так запуская метод из модуля 
//Сначала у меня была ошибка: Sppage было написано с 
//маленькой буквы, работало только в windows, а в linux 
//вылетала ошибка
'items'=>Sppage::Staticpages_menu() )); ?>
 </div><!-- mainmenu -->

Всё! Получилось меню, которое генерируется из страниц, которые создал администратор сайта.

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

В файле Z:\home\catalog.loc\www\protected\views\layouts\column2.php
Перед меню, которое выводится для действий с моделью вставляю еще одно меню:

$this->beginWidget('zii.widgets.CPortlet', array(
 'title'=>'Operations',
));
$this->widget('zii.widgets.CMenu', array(
'items'=>array(
array('label'=>'Manage Category', 'url'=>array('/category/admin'), 
'visible'=>!Yii::app()->user->isGuest),
array('label'=>'Manage Assortiment', 'url'=>array('/assortiment/admin'), 
'visible'=>!Yii::app()->user->isGuest),
array('label'=>'Manage Pages', 'url'=>array('/staticpage/sppage/admin'), 
'visible'=>!Yii::app()->user->isGuest),
array('label'=>'Manage Messages', 'url'=>array('/staticpage/spmessage/admin'), 
'visible'=>!Yii::app()->user->isGuest),)    
 
 ,
 'htmlOptions'=>array('class'=>'operations'),
 ));
 $this->endWidget(); 

Для создания красивых url моего модуля изменил в файле Z:\home\catalog.loc\www\protected\config\main.php раздел правил. Теперь он выглядит так:

'rules'=>array(
'page=<id:\w+>'=>'staticpage/sppage/view',
'page/<action:\w+>/<id:\w+>'=>'staticpage/sppage/<action>',		
'page/<action:\w+>'=>'staticpage/sppage/<action>',
		
'message'=>'staticpage/spmessage',
'message/<id:\d+>'=>'staticpage/spmessage/view',
'message/<action:\w+>/<id:\d+>'=>'staticpage/spmessage/<action>',		
'message/<action:\w+>'=>'staticpage/spmessage/<action>',

'<_c:(assortiment|category)>/<id:\d+>'=>'<_c>/view',
'assortiment/category=<category:\d+>'=>'assortiment/index',
),

Приятно было видеть, что кто-то зашел в мой каталог и попробовал там поадминить :) Если вы тоже попробовали зайти в админскую часть этого сайта, напишите в каментах, что вы про это думаете.

А я попробую сделать метод, возвращающий мой каталог в исходный вид.
Продолжение следует.

2 комментария:

  1. Привет, хотел поделиться с тобой своими наработками, http://yiicatalog.px6.ru/ на гите выложены исходники, думаю тебе может быть интересно.

    ОтветитьУдалить
  2. Привет Alex! Твой каталог был (и есть) для меня образцом для подражания. А теперь и в исходники загляну! Супер!
    PS. Несколько раз порывался написать тебе в личку на yiiframework.ru, спросить, как ты это все сделал, но стеснялся :)

    ОтветитьУдалить