Есть идея поместить форму в layout-e, к примеру форма авторизации, в хедере, должна отображаться на всех страницах, пока юзер не авторизировался.
Где я должен создавать объект модели для генерации формы (с помощью виджета CActiveForm) это же не дело - писать его в каждом экшне каждого контроллера, есть идея поместить все это в виджет, но в таком случае - вопрос, где делать обработчик формы, там же в виджете?
Обработчик - ок, а инициализацию формы где проводить?
Для того чтобы потом строить поля, мне же нужен объект формы. например в CActiveForm::TextField. Либо в таком случае нужно инициализировать объект формы прямо в вьюсе? Вроде как не труъ получается.
Форма - виджет. У виджета есть своя вьюха, где выводятся поля формы (копия стандартного _form.php). Данные формы отправляются указанному контроллеру. Вроде так
Оке, в виджите я смогу проинициализировать форму, построить ее, напишу отдельно обработчик формы, но в случае отправки формы обработчику, и возникновении ошибки, корректно ли будет обработана форма? ведь получается что виджет инициализирует пустой объект формы, а экшн инициализирует и валидирует, добавляя ошибки в форму. после этого объект формы ( с ошибками, например "не верное имя пользователя" ) должен быть передан во вьюс, и если виджет будет запущен позже, то он перетрет объект с ошибками, заменит его своим, пустым. нипанятна…
Можно заметить, что практически на всех сайтах в случае неверно введенных данных пользователь перенаправляется на отдельную страницу входа (где, возможно, его поджидает каптча). Это и есть контроллер user/login.
Если же вы хотите показывать ошибку прямо в виджете, то попробуйте вынести логику контроллера в метод run() виджета. Ведь массив $_POST доступен и там.
Обработку формы я всетаки вынес в виджет, но столкнулся с тем, что там не работает $this->redirect() (после успешной авторизации) , вероятно придется его воспроизводить иначе.
еще вопрос созрел, каким образом подключить в layout кусок другого шаблона? например есть два layout-а, которые имеют общий хедер, было бы более правильно включать его из отдельного файла в каждый.
<?php echo $this->renderPartial(’_header’); ?>
не хочет подключать, т.к. ищет подключаемый файл в папке вьюсов контроллера