Форма в layout-e

Есть идея поместить форму в layout-e, к примеру форма авторизации, в хедере, должна отображаться на всех страницах, пока юзер не авторизировался.

Где я должен создавать объект модели для генерации формы (с помощью виджета CActiveForm) это же не дело - писать его в каждом экшне каждого контроллера, есть идея поместить все это в виджет, но в таком случае - вопрос, где делать обработчик формы, там же в виджете?

Обработчик формы делать в соответствующем контроллере/экшене (напр. user/login).

Обработчик - ок, а инициализацию формы где проводить?

Для того чтобы потом строить поля, мне же нужен объект формы. например в CActiveForm::TextField. Либо в таком случае нужно инициализировать объект формы прямо в вьюсе? Вроде как не труъ получается.

Форма - виджет. У виджета есть своя вьюха, где выводятся поля формы (копия стандартного _form.php). Данные формы отправляются указанному контроллеру. Вроде так :)

Оке, в виджите я смогу проинициализировать форму, построить ее, напишу отдельно обработчик формы, но в случае отправки формы обработчику, и возникновении ошибки, корректно ли будет обработана форма? ведь получается что виджет инициализирует пустой объект формы, а экшн инициализирует и валидирует, добавляя ошибки в форму. после этого объект формы ( с ошибками, например "не верное имя пользователя" ) должен быть передан во вьюс, и если виджет будет запущен позже, то он перетрет объект с ошибками, заменит его своим, пустым. нипанятна…

Можно заметить, что практически на всех сайтах в случае неверно введенных данных пользователь перенаправляется на отдельную страницу входа (где, возможно, его поджидает каптча). Это и есть контроллер user/login.

Если же вы хотите показывать ошибку прямо в виджете, то попробуйте вынести логику контроллера в метод run() виджета. Ведь массив $_POST доступен и там.

В случае отдельного контроллера все просто.

Обработку формы я всетаки вынес в виджет, но столкнулся с тем, что там не работает $this->redirect() (после успешной авторизации) , вероятно придется его воспроизводить иначе.

Попробуйте:




$this->owner->redirect();

// или

Yii::app()->controller->redirect();



Спасибо огромное за ответы!

еще вопрос созрел, каким образом подключить в layout кусок другого шаблона???? например есть два layout-а, которые имеют общий хедер, было бы более правильно включать его из отдельного файла в каждый.

<?php echo $this->renderPartial(’_header’); ?>

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

Разобрался = подключил через <?php echo $this->renderPartial(’/layouts/_header’); ?>

Всем спасибо за помощь! :)

В стандартном приложении, сгенерированном с помощью yiic, используется следующий подход:

column1.php ("под"-layout)




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

<div class="container">

	<div id="content">

		<?php echo $content; ?>

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

</div>

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



Советую сделать yiic webapp test и изучить эти примерчики :)