вопросы по CForm

Всем привет, с 1.1.х веткой не работал, был долго занят на проекте где использовалась 1.0.х ветка.

Ну а тут вот пришлось… пару часов посидел почитал что-то решил сам, документация как обычно радует :)

благо что то можно найти в гугл код, что то на форуме, НО

не смог найти ответов на несколько вопросов (да кстати ниже речь пойдет о вложенных формах)

1. Не показывает ошибки валидации

2. Не сохраняет значения полей (видимо это как-то связано с п.1)

  1. Как подружить аякс ?

что у меня есть на данный момент:

контроллер




		$form = new CForm('application.views.register.buyerRegisterForm');

		

		$form['user']->model = new Buyer('register');

		$form['auth']->model = new UAuth('register');

		

		if ($form->submitted('submit') && $form->validate()) {

	                $user = $form['user']->model;

	                $auth = $form['auth']->model;

                        # code here

			$this->redirect(array('register/thanks'));

		} else {

			$this->render('buyerForm', array('form'=>$form));

		}




ага поа поисал текст 1й и 2й пункты разрешились, вот эта строчка




		if ($form->submitted('submit') && $form->validate()) {



надо что б кнопка была названа именно как тут - $form->submitted(‘submit’)

т.е. код в конфиге надо иметь таким вот




	'buttons' => array(

		'submit' => array(

			'type' => 'submit',

			'label' => 'Зарегистрироваться',

		)

	),



только из АПИ это можно понять :)

остается только 3й вопрос.

Полазив по АПИ видно что у CFrom есть св-во и метод связанные с CActiveForm

а CActiveForm как раз (если я все правильно понимаю) и может генерировать правила валидации на клиенте (через аякс конечно).

Так вопрос как-то их подружить можно ?

Спасибо.

В API вроде довольно много по CActiveForm написано: http://www.yiiframework.com/doc/api/CActiveForm

Можете также создать новое приложение через yiic, там контактная логин форма уже использует AJAX валидацию, будет наглядный пример :)

Наверное мой вопрос не понят был…

попробую еще раз.

с CActiveForm я ни каких проблем не испытываю.

Я хочу что бы форма сгенерированная через CForm обращалась через аякс на сервер за валидацией.

по умолчанию сгенерированная через CForm форма сабмити данные либо постом либо гетом… А я спрашиваю

может ли CForm перед сабмитом делать аякс валидацию, то как ее делает CActiveForm.

Извините, что затестить сейчас не могу, но, судя по API, нужно сконфигурировать свойство activeForm таким образом:




array(

    'class'=>'CActiveForm',

    'enableAjaxValidation'=>true,

);



Затем, соответственно, нужно добавить код обработки AJAX запроса в контроллер.

Спасибо andy_s, но я пробывал это до того как написал на форуме… и не работает :(

или я не там пробывал ?

CForm config file

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

через этот метод activeFormWidget можно получить доступ к виджету, однако как его выводить … хм

непонятно, пойду рыться в исходниках :)

Да нет, всё так делаем, потому что у меня работает :rolleyes:

Контроллер:




$model = new LoginForm;


$config = array(

    'activeForm'=>array(

        'id'=>'login-form', // Важный момент.

        'class'=>'CActiveForm',

        'enableAjaxValidation'=>true,

    ),

    'elements'=>array(

        'username'=>array('type'=>'text', 'maxlength'=>80),

        'password'=>array('type'=>'password', 'maxlength'=>80),

    ),

    'buttons'=>array(

        'login'=>array(

            'type'=>'submit',

            'label'=>'Login',

        ),

    ),

);

$form = new CForm($config, $model);


// Дальше стандартный код.


// if it is ajax validation request

if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')

{

    echo CActiveForm::validate($model);

    Yii::app()->end();

}


// collect user input data

if(isset($_POST['LoginForm']))

{

    $model->attributes=$_POST['LoginForm'];

    // validate user input and redirect to the previous page if valid

    if($model->validate() && $model->login())

        $this->redirect(Yii::app()->user->returnUrl);

}

// display the login form

$this->render('login', array(

    'form'=>$form,

));




Вид (тут важно заключить форму в div класса "form", если используете стандартный form.css) :




<h1>Login</h1>


<div class="form">

<?php echo $form; ?>

</div>



Маленькое замечание: лучше поставить ajax валидацию до создания объекта $form, т.к. форма нам в случае ajax запроса все равно не пригодится.

Спасибо, заработа.

Оказывается в конфиге CForm определени activeForm необходимо осуществлять на высшем уровне…

а т.к. как у меня вложенны формы, я подумал что необходимо для каждой формы описывать :)

еще раз, Спасибо