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?
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
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