Dúvida Com Validação Detalhada De Formulário

Olá! Sou novo no Yii Framework e estou fazendo um formulário de cadastro em etapas.

Na primeira página a validação vai ser somente nome,sobrenome e email.

Nessa parte estou validando os três campos corretamente, pois editei o método rules() do modelo Usuario para isso.

Minha controller está dessa forma:




	$usuario = new Usuario();

	// Se o cadastro foi submetido

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

	{

		$usuario->step = 1;

		$usuario->attributes=$_POST['Usuario'];

		if($usuario->validate())

			$this->redirect(Yii::app()->createUrl('conta/step2'));

	}



Ele está validando tudo corretamente, porém eu quero que nessa validação, antes de tudo verifique se o email já existe no banco de dados, para que não haja duplicidade de email.

Eu devo fazer isso no modelo ou devo fazer isso no método validate() ?

Outra coisa, como eu posso disparar um erro para o errorSummary() na view?

Desde já agradeço

Habilite a validação Ajax no Controller e no form da view.

Agora no seu modelo adicione nas regras de validação o código abaixo que irá validar se já existe cadastro para o e-mail informado.





public function rules()

{

  return array(

    ...

    array('email', 'unique', 'on'=>'step1', 'message'=>'Já existe um cadastro para este e-mail!'), // adicione esta linha

    ...

  );

}



No seu controller quando você faz:




$usuario = new Usuario();



Mude o cenário passando "step1" para o construtor da classe Usuário




$usuario = new Usuario('step1');



Tacno,

Você faz essa validação de email existente na função validate() (beforeValidate()), mais é bom você fazer essa validação somente na actionCreate, por que se você for editar alguma informação do usuario, ele vai validar e não vai deixar salvar, e bom você bloquear a edição de email na actionUpdate.

Segue abaixo o modelo da função que você deve seguir como exemplo:


public function beforeValidate() {

	if($this->scenario == 'insert') {

		$email = self::model()->find('email = :email', array(':email' => $this->email));

		if (!is_null($email))

			$this->addError('email', 'E-mail já cadastrado.');

	}

	return parent::beforeValidate();

}

Por padrão, a inserção de dados, o Yii interpreta o cenário como ‘insert’, e a atualização de dados como ‘update’, então por isso que foi definido somente no scenario insert

Funcionou perfeitamente!!

=D

Muito obrigado pela ajuda.

Um abraço!