Admin — Voltando ao Gii (CRUD) — Parte 3
No artigo anterior implementamos o CRUD de Produtos, utilizando as relações geradas pelo Yii para integra Produtos com categorias.
Nesse artigo irei implementar o CRUD de User e também irei criar suas telas de update uma para os dados gerais do usuário e outra para alterar somente a senha.
Customizando o Create User
Nosso Create User tem uma peculiaridade interessante. No momento do cadastro o campo de senha precisa estar presente, já no update, iremos movê-los para outra view. Isso se dá pelo fato das senhas serem criptografadas e também para fazermos a alteração da senha somente depois de entrar com a senha antiga. No update de usuário só conterá os campos Username, Email e Status
Vamos começar a customizar o formulário de cadastro/alteração/trocar senha. Abra o arquivo \modules\admin\views\user\_form.php e remova os campos descritos na imagem abaixo.
Criando o ComboBox — dropdownList() e RadioButton radioList() de Status do usuário
Abra o arquivo \modules\admin\models\User.php para criamos o método getStatusUser(). Abaixo da linha que contém const STATUS_ACTIVE = 10; (linha 28) adicione mais 2 constantes e mais 2 atributos (que serão usados no form de resetPassword).
const STATUS_ACTIVE_STRING = 'Active';const STATUS_DELETED_STRING = 'Deleted';
public $confirmPassword = '';public $password = '';
Abaixo do método behaviors() crie o método getStatusUser()
public function getStatusUser(){ return [ self::STATUS_DELETED => self::STATUS_DELETED_STRING, self::STATUS_ACTIVE => self::STATUS_ACTIVE_STRING, ];}
Limpando as regras de validações
Como feito nos outros CRUDs tivemos que limpar o método rules() para tirar as validações desnecessárias. Retiramos a obrigatoriedade dos campos authKey, created_at, updated_at e também removemos todas as chamadas desses atributos. Pois eles serão preenchidos diretamente e não pelo formulário. Adicione também as regras para o scenario (vermos mais abaixo o que é isso). Segue abaixo como deve ficar nesse momento.
public function rules(){ return [ [['username', 'email', 'passwordHash'], 'filter', 'filter' => 'trim'], [['username', 'passwordHash', 'email'], 'required'], [['status'], 'integer'], [['username', 'passwordHash', 'passwordResetToken', 'email'], 'string', 'max' => 255], [['username'], 'unique'], [['email'], 'unique'], [['passwordResetToken'], 'unique'], ['status', 'default', 'value' => self::STATUS_ACTIVE], ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]], //Tratando o scenario resetPassword
[['password', 'passwordHash', 'confirmPassword'], 'filter', 'filter' => 'trim', 'on' => 'reset-password'], [['password', 'passwordHash', 'confirmPassword'], 'required', 'on' => 'resetPassword'], ];}
Remova o método behaviors(). Isso está sendo feito porque na criação da tabela User definimos que os campos created_at e updated_at seria preenchido pelo próprio MySQL.
Crie o método beforeSave() como o código abaixo.
public function beforeSave($insert) { if ($insert) { $this->generateAuthKey(); } if (isset(Yii::$app->request->post()['User']['passwordHash'])) { $this->setPassword(Yii::$app->request->post()['User']['passwordHash']); } return parent::beforeSave($insert);}
Esse código vai permitir que se gere o authkey e também fazer a senha ficar criptografada tanto na criação quanto na rotina de resetPassword.
Scenario
Primeiramente… O que é scenario? O scenario é a forma de criar situações diferentes para aplicar validações nos formulários. Vamos usar nosso caso como exemplo.
Temos o cadastro de usuário cujo campos precisam ser obrigatórios são: nome, email, password e status. Porém no update será um form diferente e os campos obrigatórios serão: nome, email e status.
Já no reset password as validações estarão nos campos: password, newpassword e repeatpassword.
Como fazer esse monte de validações no model User? É aí que entra o scenario. Isso vai te permitir fazer validações diferentes no msm contexto, nesse caso o User.
public function scenarios(){ $scenarios = parent::scenarios(); $scenarios['resetPassword'] = ['password', 'passwordHash', 'confirmPassword']; return $scenarios;}
Pode adicionar esse trecho de código abaixo do método attributeLabels() por exemplo. Por enquanto esse código não vai funcionar pois precisamos ainda criar o método para fazer o resetPassword().
No método attributeLabels() adicione os atributos novos criados.
public function attributeLabels(){ return [ ... 'password' => Yii::t('app', 'Old Password'), 'newPassword' => Yii::t('app', 'New Password'), ];}
Preparando o UserController para as novas funcionalidades
Abra o arquivo \modules\admin\controllers\UserController.php. Adicione o código abaixo.
public function actionResetPassword($id){ $model = $this->findModel($id); $model->scenario = 'resetPassword'; if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } return $this->render('resetPassword', [ 'model' => $model, ]);}
Formulário de cadastro de usuário (Creat User)
Nese formulário iremos apenas deixar os campos username, password, email e status. Todos os outros remova.
Em status faremos como já fizemos em Categoria e Produtos.
Criando a View nova Update
No formulário de update vamos usar somente os campos username, email e status.
Veja o código completo
Criando a View nova resetPassword
Formatando a GridView de usários
Nesse arquivo vamos fazer uma bela de rapaginada, assim como os outros. Criação de um ícone novo somente para alteração de senha.
Veja como ficou o código abaixo:
Nesse projeto já foi feito alterações de ícones, cores etc. Nesse somente para exemplificar, foi criado o cadiado que leva o usuário para a tela de alteração de senha.
Não preciso dizer que em um sistema real essa tela ou não existira, ou seria gerada uma senha automaticamnte e um email enviado para o usuário, preciso????
Ajustando o ModelSearch
Nesse arquivo basicamente são feitos os ajustes para que os campos de pesquisa do grid funcione corretamente.
Formatando a DetailView de usuários
Nesse arquivo foi retirados os dados sensíveis como senha, token etc. Eles não precisam estar na tela para qualquer um ver.
Também foi formatado a grid para ficar mais apresentável, o titulo da página e foi adicionado o botão “Novo”.
Com isso finalizamos as formatações e ajustes no CRUD User e basicamente todos os CRUDs vão ser formatados e configurados da mesma maneira. Vendo isso é notório que no Yii se desenvolve muito mais rápido que qualquer outro framework do mercado e de forma elegante e respeitando as boas práticas de desenvolvimento.
Mais uma etapa concluída do projeto. Acompanhe o projeto e vejas os arquivos no GitHub: https://github.com/Calcio/vitrine
Espero que tenham gostado desse post. A partir daqui, você já está apto a criar qualquer projeto no Yii. O Yii não para por aqui, ele oferece mt mais recursos, estabilidade etc. Calma não estou dizendo que finalizei o projeto, ainda tem bastante coisa interessante a ser abordada e feita.