View+Layout

Уважаемые all, прошу помощи!

Хочу сделать примерно такое: http://rozetka.com.ua/faq/ (банально с дефолтного проекта сделать парочку статичных страниц и в контенте прилепить боковое меню).

Все получилось, кроме контактов.

Расскажу грубо как приделал боковое меню.

  1. папку page переименовал в static (для удобства)

  2. в сайт контролере написал:




			'static'=>array(

				'class'=>'CViewAction',

                                'layout'=>'static', // определил что мне для моих статичных страниц нужен другой лайоут

			),

здесь все отлично, на основе дефолтного проекта и страницы about.php, наделал нужное мне количество страниц

  1. приведу код моего view/layouts/static.php



<?php $this->beginContent('//layouts/main'); ?>


<div class="container">

	<div class="span-19">


            	<div class="span-5 last">

                    <div id="sidebar" align="left">

                            <?php $this->widget('zii.widgets.CMenu',array(

                                    'items'=>array(

                                            array('label'=>'Помощь', 'url'=>'/faq'),

                                            array('label'=>'Доставка и оплата', 'url'=>'/payments-and-deliveries'),

                                            array('label'=>'Гарантия', 'url'=>'/warranty'),

                                            array('label'=>'Контакты', 'url'=>'/contact'),

                                            array('label'=>'О магазине', 'url'=>'/about'),

                                            array('label'=>'Условия использования сайта', 'url'=>'/terms'),                                            

                                    ),

                            )); ?>


       		   </div><!-- sidebar -->

                </div>


		<div id="content">

			<?php echo $content; ?>

		</div><!-- content -->

	</div>


</div>

<?php $this->endContent(); ?>

получилось как здесь: http://rozetka.com.ua/faq/, боковое меню и контент, все супер!

пытаюсь также туда засунуть contact.php cтраницу, но не получается, как я не танцевал, думал может если в лайоут добавить <?php $this->beginContent(’//layouts/static’); ?> то получится как надо, но получилось что у меня теперь контент в контенте, тоесть 2 шапки 2 футера, а внутри всетаки боковое меню и контакты

в общем не могу понять в чом проблема, что я делаю тут не так?

была идея само боковое меню засунуть в отдельный файл, а из лайоута статики и контактов инклудить это меню, конечно вариант мне не нравится, будет работать конечно, но думаю так не правильно

и еще проблема возникла уже в ходе работы,

напр. есть у меня тоже меню, код которого написал выше, в справке пишет что для формирования тега ‘active’, нужно просто чтобы параметр по Get был в текущем урле, так и есть, напр. зашол урл: http://redbird.te.ua/faq, но актив-стиль не включается почемуто. Работает только если я насильно напишу чтото вроде:


array('label'=>'Помощь', 'url'=>'/faq', 'active'=>'faq'),

шустрый по поиску, но так внятно и не понял, как мне коректно сделать active-стиль, поделитесь примером пожалуйста

возможно здесь понадобится мой урл-менеджер, приведу и его код:


		'urlManager'=>array(

			'urlFormat'=>'path',

			'rules'=>array(                                

				//'<controller:\w+>/<id:\d+>'=>'<controller>/view',

				//'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

				//'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

                                '<_c:(contact|login|logout)>'=>'site/<_c>',

                                '<_c:(faq|payments-and-deliveries|warranty|about|terms|service-centers)>' =>'site/static/view/<_c>',

			),

		),

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

Спасибо!

Что бы рендерить страницы без рендера основного layout’а(хедер и футер) используйте Controller->renderPartial(‘view’);


$this->render('contact',array('model'=>$model));

переписал на:


$this->renderPartial('contact',array('model'=>$model));

абалдеть, получилось!))) Громадное спасибо!

если вас не затруднит помогите еще разобратся с CSS Active стилем меню.

Доки по меню

http://www.yiiframework.com/doc/api/1.1/CMenu

у вас неправильная ссылка.

пробуйте


array('label'=>'Помощь', 'url'=>'faq'),

ссылки поправил, ничего не изменилось, все по прежнему, может чтото в урл-менеджере нужно настроить, у меня полностью на ЧПУ сделано, вот позавчераняя версия (так чтобы просто посмотреть на урлы): http://redbird.te.ua/

Читал неоднократно, информации крайне мало, цитирую все что есть по этому поводу:

active: boolean, optional, whether this menu item is in active state (currently selected). If a menu item is active and activeClass is not empty, its CSS class will be appended with activeClass. If this option is not set, the menu item will be set active automatically when the current request is triggered by url. Note that the GET parameters not specified in the ‘url’ option will be ignored.

Я это понимаю так:

active: тип boolean, задается опционально, используется для указания текущего выбранного пункта меню ("подсветки").

Если пункт меню активный и activeClass не пустой, то в CSS-класс пунта меню будет добавлен CSS-стиль указанный в activeClass (для визуального эффекта подсвечивания пункта меню, такой то пункт меню активен).

Если эта данная настройка не указана, то пункт меню будет автоматически "подсвечен" при запросе вызвавшего его.

Приметка: Если при Get-запросе не указан параметр ‘url’, то данная настройка будет проигнорирована.

Сильно не бейте за перевод, перевел как сам понимаю.

Тоесть фактически если пишу код:


		<?php $this->widget('zii.widgets.CMenu',array(

			'items'=>array(

                                //array('label'=>'Мобильная версия', 'url'=>Yii::app()->params['myWAPURL']),

                                array('label'=>'Помощь', 'url'=>'faq'),

                                array('label'=>'Доставка и оплата', 'url'=>'payments-and-deliveries'),

                                array('label'=>'Гарантия', 'url'=>'warranty'),

				array('label'=>'Контакты', 'url'=>'contact'),

				array('label'=>'Вход', 'url'=>'login', 'visible'=>Yii::app()->user->isGuest),

				array('label'=>'Выход ('.Yii::app()->user->name.')', 'url'=>'logout', 'visible'=>!Yii::app()->user->isGuest),

                                array('active'=>Yii::app()->getController()),

			),

		)); ?>

и у меня настройки в сорцах, конечно нигде их не меняю


public $activeCssClass='active';


public $activateItems=true;

(по идее больше ничто не влияет на эту возможность)

и захожу на страницу: http://redbird.te.ua/faq

то должен автоматически подсветить (задатся CSS свойством active) пункт меню ‘faq’!

Так? Но у меня этого не происходит, и не знаю почему.


array('label'=>'Помощь', 'url'=>'faq', 'active'=>Yii::app()->getController()=='faq'),

както так или как нужно сделать? чтоб насильно подкрасить если автоматом не получается, или как… :unsure:

Внимательно смотрим на исходный код zii/widgets/CMenu.php

Пример инициализации




* $this->widget('zii.widgets.CMenu', array(

 *     'items'=>array(

 *         array('label'=>'Home', 'url'=>array('site/index')),

 *         array('label'=>'Products', 'url'=>array('product/index'), 'items'=>array(

 *             array('label'=>'New Arrivals', 'url'=>array('product/new', 'tag'=>'new')),

 *             array('label'=>'Most Popular', 'url'=>array('product/index', 'tag'=>'popular')),

 *         )),

 *         array('label'=>'Login', 'url'=>array('site/login'), 'visible'=>Yii::app()->user->isGuest),

 *     ),

 * ));



Внимательно смотрим на этот код




protected function isItemActive($item,$route)

	{

		if(isset($item['url']) && is_array($item['url']) && !strcasecmp(trim($item['url'][0],'/'),$route))

		{

			if(count($item['url'])>1)

			{

				foreach(array_splice($item['url'],1) as $name=>$value)

				{

					if(!isset($_GET[$name]) || $_GET[$name]!=$value)

						return false;

				}

			}

			return true;

		}

		return false;

	}



А конкретно на код: is_array($item[‘url’])

Удачи;)

ага, заработало, както чертовскы странно, но пашет, пришлось убрать свой урл-менеджер (теперь у меня очень странные и странные урлы), причом пашет фича непонятно как… буду разбиратся(((

получилось, только частично, привожу код меню:

view\layouts\main.php


		<?php $this->widget('zii.widgets.CMenu',array(                     			'items'=>array(                                 

//array('label'=>'Мобильная версия', 'url'=>Yii::app()->params['myWAPURL']),

array('label'=>'Помощь', 'url'=>array('site/static/view/faq')),                                 

array('label'=>'Доставка и оплата', 'url'=>array('site/static/view/payments-and-deliveries')),                                 

array('label'=>'Гарантия', 'url'=>array('site/static/view/warranty')), 				

array('label'=>'Контакты', 'url'=>array('site/contact')), 				

array('label'=>'Вход', 'url'=>array('site/login'), 'visible'=>Yii::app()->user->isGuest), 				

array('label'=>'Выход ('.Yii::app()->user->name.')', 'url'=>array('site/logout'), 'visible'=>!Yii::app()->user->isGuest), 			), 		)); ?>

переписал все на array, как в документации

урл-менеджер:


'urlManager'=>array(

'urlFormat'=>'path',

'showScriptName'=>false,

'urlSuffix' => '/', 			

'rules'=>array(                                 				//'<controller:\w+>/<id:\d+>'=>'<controller>/view', 				//'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', 				

//'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

'<_c:(contact|login|logout)>'=>'site/<_c>',

'<_c:(faq|payments-and-deliveries|warranty|about|terms|service-centers)>' =>'site/static/view/<_c>', 			), 		),

урлы все нормального ЧПУ-вида, напр:

http://redbird.te.ua/faq/

http://redbird.te.ua/payments-and-deliveries/

и т.д. все отлично, кроме подсветки, почемуто подсвечивается только при урлах:

http://redbird.te.ua/contact/

http://redbird.te.ua/login/

(ссылки для примера!)

пытался дебагером пройтись, и вот что нащупал:

подсветка будет срабатывать только если $route совпадает с [‘url’][0]

проверяю урлы не логина и контактов, $route там всегда один и тотже site/static :blink:

почему так и как правильно сделать я не понимаю

если брать с базового приложения созданого Yii, то фактически мне нужно чтобы about.php, открывался через http://redbird.te.ua/about/, вся загвоздка только в подсветке меню

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

Потыкал пунткам меню, ничего не подсвечивается.

http://redbird.te.ua/contact/

http://redbird.te.ua/login/

При переходе на faq получаю 404 ошибку.

Опять же, вы невнимательно читаете исходный код:)

Попробуйте это


array('label'=>'Доставка и оплата', 'url'=>array("site/static", "view/payments-and-deliveries")),     

По моему так, в любом случае у вас юрл должен быть как массив, первый елемент это контроллер/екшн, второй елемент это параметры.