Opa, Newerton Valeu pelas dicas.
Estou com umas dúvidas na implementação desses códigos que você me passou.
PROBLEMAS:
1 - A função beforeValidate() funcionou corretamente, ao digitar um login que já existe no Banco de dados ele lança um erro informando que o login já existe, como já esperado. Só que ao digitar um login diferente ocorre que o mesmo não é atualizado no banco de dados ao lançar o formulário. Eu acredito que ele não está conseguindo executar a função actionUpdate() do UsuarioController, pois a página não é redirecionada para o View do usuario alterado.
2 - Com relação a senha toda a interação de erros está funcionando corretamente:
-
está exigindo que a senha tenha no mínimo 5 caracteres e no máximo 10, tanto no textfield senha como no textfield confirmar senha.
-
está exigindo que o campo senha seja idêntico ao campo confirmar senha
Só que também não ta executando a alteração junto ao banco de dados. e quando eu consegui fazer com que alterasse, ao deslogar e tentar relogar ficava informando que o a senha ou o usuário estavam incorretos no momento do login.
3 - Percebi também que estas funções interferiram tanto no login como em todas as ações que precisam acessar o banco de dados para fazer alterações ou cadastros.
Ex: como descrevi no problema 2 o login parou de funcionar após tentar alterar senha e a actionLogout() do SiteController que eu havia implementado para alterar o banco de dados com informações de lastlogintime antes de deslogar parou de funcionar também.
Segue abaixo o textfield que criei no _form.php:
<div class="row">
<?php echo $form->labelEx($model,'confirmPassword'); ?>
<?php echo $form->textField($model,'confirmPassword',array('size'=>15,'maxlength'=>10)); ?>
<?php echo $form->error($model,'confirmPassword'); ?>
</div>
Segue abaixo meu MODEL - usuario, já com a implementação que você passou.
<?php
/**
* This is the model class for table "usuario".
*
* The followings are the available columns in table 'usuario':
* @property integer $id_user
* @property string $nm_user
* @property string $psw_user
* @property string $email_user
* @property string $dt_acesso_user
* @property string $hr_acesso_user
* @property integer $tp_sistema_user
* @property string $dt_criacao_user
*/
class Usuario extends CActiveRecord
{
public $old_password;
public $confirmPassword;
//FUNÇÃO QUE CONFERE SE O LOGIN DIGITADO NA ALTERAÇÃO OU NO CADASTRO JÁ EXISTE.
public function beforeValidate() {
$login = self::model()->find('nm_user = :nm_user', array(':nm_user' => $this->nm_user));
if(!is_null($login)) {
$this->addError('nm_user', 'Este login já está sendo usado.');
return parent::beforeValidate();
}
//Se a senha não for digitada, a ação é não recriar uma nova senha
if(!empty($this->psw_user) && $this->psw_user != $this->old_password)
$this->psw_user = sha1($this->psw_user);
return parent::beforeValidate();
}
public function afterFind() {
//Atribuindo a senha atual a uma nova variavel, caso ele mude a senha, você pode comparar com a senha digitada
$this->old_password = $this->psw_user;
$this->psw_user = '';
return parent::afterFind();
}
/**
* @return string the associated database table name
*/
public function tableName()
{
return 'usuario';
}
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('nm_user, psw_user, email_user, dt_acesso_user, hr_acesso_user, tp_sistema_user', 'required'),
array('tp_sistema_user', 'numerical', 'integerOnly'=>true),
array('nm_user, psw_user, email_user', 'length', 'max'=>255),
array('dt_criacao_user', 'safe'),
// The following rule is used by search().
// @todo Please remove those attributes that should not be searched.
array('id_user, nm_user, psw_user, email_user, dt_acesso_user, hr_acesso_user, tp_sistema_user, dt_criacao_user', 'safe', 'on'=>'search'),
array('psw_user, confirmPassword', 'length', 'max' => 10, 'min' => 5),
array('confirmPassword', 'compare', 'compareAttribute' => 'psw_user'),
/* MODELO DE COMO ADICIONAR A DATA DE CRIACAO NO BD AO CRIAR USUARIO
array('dt_acesso_user','default',
'value'=>new CDbExpression('NOW()'),
'setOnEmpty'=>false,'on'=>'create'),
*/
);
}
/**
* @return array relational rules.
*/
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
);
}
/**
* @return array customized attribute labels (name=>label)
*/
public function attributeLabels()
{
return array(
'id_user' => 'Id',
'nm_user' => 'Login',
'psw_user' => 'Senha',
'email_user' => 'E-mail',
'dt_acesso_user' => 'Data do último Acesso',
'hr_acesso_user' => 'Hora do último Acesso',
'tp_sistema_user' => 'Tipo de Sistema',
'dt_criacao_user' => 'Data da Criação',
'confirmPassword' => 'Confirmar Senha',
);
}
/**
* Retrieves a list of models based on the current search/filter conditions.
*
* Typical usecase:
* - Initialize the model fields with values from filter form.
* - Execute this method to get CActiveDataProvider instance which will filter
* models according to data in model fields.
* - Pass data provider to CGridView, CListView or any similar widget.
*
* @return CActiveDataProvider the data provider that can return the models
* based on the search/filter conditions.
*/
public function search()
{
// @todo Please modify the following code to remove attributes that should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('id_user',$this->id_user);
$criteria->compare('nm_user',$this->nm_user,true);
$criteria->compare('psw_user',$this->psw_user,true);
$criteria->compare('email_user',$this->email_user,true);
$criteria->compare('dt_acesso_user',$this->dt_acesso_user,true);
$criteria->compare('hr_acesso_user',$this->hr_acesso_user,true);
$criteria->compare('tp_sistema_user',$this->tp_sistema_user);
$criteria->compare('dt_criacao_user',$this->dt_criacao_user,true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
/**
* Returns the static model of the specified AR class.
* Please note that you should have this exact method in all your CActiveRecord descendants!
* @param string $className active record class name.
* @return Usuario the static model class
*/
public static function model($className=__CLASS__)
{
return parent::model($className);
}
}
Todo código que manipulei esta logo acima, não sei mais o que devo fazer.