Admin — Voltando ao Gii (CRUD) — Parte 3

Cálcio Heavy Metal
5 min readMay 22, 2021

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.

Remova os campos desnecessários: Auth Key, Password Reset Token, Created At e Updated At

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'),    ];}
Seu model deve estar parecendo com o script acima.

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,    ]);}
Seu UserController deve ficar assim

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.

O fomulário de usuário deve ficar assim.
Seu código deve ficar assim

Criando a View nova Update

No formulário de update vamos usar somente os campos username, email e status.

Veja o código completo

Seu código deve ficar assim

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.

--

--