Yii – Gerando código de forma "automática" e personalizando o login | Recursividade Yii – Gerando código de forma "automática" e personalizando o login – Recursividade
Postado em: 24/04/2013 por: Wagner — 4 Comments ↓
Neste artigo iremos aprender a personalizar o acesso ao nosso sistema. Mudaremos a forma em que o login é feito, passando a utilizar nossa tabela usuarios, criada anteriormente.
Para isso, vamos conhecer uma ferramenta muito útil do Yii: o Gii
O que é o Gii e como usá-lo
Gii é um gerador de código para o Yii. Com ele, podemos criar, rapidamente, models, controllers, módulos, forms e outros tipos de código (você pode expandir as funcionalidades do Gii). Outra coisa que ele faz muito bem é criar CRUD. Ou seja, é uma ferramenta bastante complexa. Para acessá-la, entre em http://localhost:8080/yii/primeiraapp/index.php?r=gii (lembre-se sempre de substituir a url dos exemplos pela que url que você estiver usando). Você provavelmente irá se deparar com uma mensagem de erro, dizendo que tal "local" não foi encontrado:
O motivo para o erro é que o Gii, por padrão não vem habilitado. Iremos habilitá-lo agora. Para isso, abra o arquivo de configuração (protected\config\main.php) e procure pela linha 21 (ou próxima):
Como você deve imaginar, iremos alterar a seção modules da nossa config. Nessa seção definimos quais módulos "extras" funcionarão em nosso sistema. Por padrão, a chamada para o Gii está comentada. Descomente o bloco (removendo o conteúdo das linhas 23 e 30). Como você deve ter percebido, todas (ou quase todas) as configurações do Yii são baseadas em arrays. no caso do array modules, aqui já há outro array, cuja key é gii. Esse "sub-array" possui outros 3 elementos: class, que indica a classe a qual ele se refere (no caso, system.gii.GiiModule), password, que é onde definimos uma senha de acesso ao Gii e ipFilters, onde iremos colocar os ips que terão acesso ao Gii (por padrão, somente o localhost tem esse acesso). Para uma segurança maior, coloque uma senha no parâmetro password.
Feito isso, salve a config e tente acessar o Gii novamente. Dessa vez, você verá a tela de login:
Logue-se com a senha que você cadastrou. A página principal do Gii será exibida:
Temos aqui, um menu com 5 opções:
Controller Generator – Gera o esqueleto de um controller
Crud Generator – Gera o código necessário para criarmos, editarmos, excluirmos e gerenciarmos dados de uma tabela
Form Generator – Cria formulários
Model Generator – Gera models baseados em tabelas do nosso banco de dados
Module Generator – Cria um esqueleto para nossos próprios módulos
Das opções acima, iremos utilizar, neste momento, o Model Generator e o Crud Generator.
Primeiramente, clique em "Model Generator":
Em "Table Name", digite "usuarios". Repare que o próprio Gii tenta "adivinhar" de qual tabela você está criando o model. Ele irá sugerir "Usuarios" como o nome da classe. Deixe como ele sugere. A checkbox "Build Relations" serve para indicar se as relações (FKs) da tabela devem ser colocadas também no módulo. Mas isso é assunto para algum artigo futuro. Clique em Preview. O Gii irá mostrar o caminho da classe que será criada (no caso, models\Usuarios.php). Como essa classe ainda não existe, na coluna "Generate", a caixa "new" estará marcada:
Se fosse uma classe existente, o Gii indicaria que seriam feitas alterações (caso necessárias) na mesma.
Clique então no botão "Generate".O Gii deverá exibir a mensagem "The code has been generated successfully.".
Antes de partirmos para o CRUD, vamos criar o model para a tabela clientes. Repita os passos acima, mas ao invés da tabela usuarios, digite o nome da tabela clientes. Pronto, nossas tabelas agora tem models representando-as. Para ter uma idéia de como elas ficaram, abra os arquivos models\Usuarios.php e models\Clientes.php. Os comentários (em inglês, sorry) das classes geradas pelo Yii te darão uma base para que serve cada parte da classe. Caso tenha alguma dúvida, comente ao final do artigo, que, na medida do possível, tentarei explicar.
Agora sim. no menu do Gii, clique em "Crud Generator". Em "Model Class", digite Usuarios. Novamente, o Gii irá sugerir o nome para o Controller, no caso, "usuarios". Clique em preview:
Como você pode ver, dessa vez o Gii criou bem mais código para nós. Ele criou um controller (UsuariosController.php) e várias views, que serão usadas para gerenciarmos a tabela de usuários. Mas no momento não entraremos em detalhes sobre o funcionamento dessas views. Isso ficará mais para a frente, quando customizaremos esse gerenciamento. Sugiro que repita o processo de geração do CRUD para a tabela de clientes.
Personalizando o login
Como vimos no artigo anterior, o login inicial criado pelo Yii é "estático", com um array indicando os usuários e suas respectivas senhas. Para alterá-lo, abra o arquivo protected\components\UserIdentity.php. Altere a function authenticate, deixando-a como o código abaixo:
$this->errorCode=self::ERROR_NONE; //inicialmente, não há erros no login
$record=Usuarios::model()->findByAttributes(array('email'=>$this->username));
else if($record->senha!=md5($this->password))
else //logou
Acrescente também o método getId:
Agora, faça o teste: acesse a aplicação, logue-se como admin (conforme os dados que você inseriu na tabela anteriormente) e como usuário. Você conseguirá logar-se com ambos.
O código do login é fácil de entender, mas basicamente:
Na linha 18 definimos o valor inicial da variável de retorno do método authenticate.
Na linha 20, fazemos uma busca. Fazemos com que a classe Usuarios retorne para nós uma instância, onde fazemos uma busca pelo e-mail que digitamos no login ($this->username). As classes modelque utilizamos são extensões da Classe CActiveRecord. Para mais detalhes sobre essa classe, veja a documentação do Yii.
A linha 22 verifica se $record não é um objeto. Caso não tenha sido encontrado nenhum usuário cujo e-mail seja o mesmo que digitamos, o método findByAttributesirá retornar null. Caso $record seja null, alteramos o código de retorno, indicando que é um usuário inválido (linha 23).
Já a linha 24 verifica se a senha digitada (após aplicar md5) é a mesma senha cadastrada no banco de dados. Se não for, alteramos o código de retorno (linha 25) informando que a senha é inválida.
Obs: O método findByAttributesretorna (caso encontre) o primeiro resultado da tabela que satisfaça aos critérios utilizados. Em nosso código, apenas verificamos se ele retornou algum usuário e se a senha dele é a mesma digitada. Então, caso existissem dois usuários com o mesmo e-mail cadastrado, ele retornaria o primeiro encontrado. Com isso, caso o usuário que tenha digitado seja o segundo da "fila", nosso código retornaria um erro. O ideal seria fazer uma checagem, seja criando uma regra no BD, seja ao cadastrar o usuário pelo sistema. Ou ainda, fazer a checagem da senha e do login juntos, na mesma query, mas deixo isso como um exercício futuro (falaremos mais sobre consultas e parâmetros em outro artigo). Somente lembre-se desse "porém".
A linha 27 seta nossa variável privada $_id com o valor da id do usuário (usaremos essa variável e o método getId no próximo artigo).
A linha 29, enfim, executa o retorno do método, retornando True caso a autenticação seja bem sucedida, ou retornando False, caso haja algum erro.
Como foi visto, é fácil gerar código e alterar os métodos de autenticação do Yii.
No próximo artigo iremos trabalhar com as permissões dos usuários.
This entry was posted in crud, gii, login, MVC, MYSQL, PHP, Programação, RAD, Tutorial, Yii by Wagner. Bookmark the permalink.
12/12/2013 às 10:53
Table 'usuarios' does not exist.
devo criar a tabela ou a aplicação deveria criá-la ?
12/12/2013 às 11:51
Você precisa criá-la. Veja a estrutura da tabela no passo 4: http://recursividade.wesoft.com.br/2013/02/yii-comecando-nossa-aplicacao.html#.UbVNH9zUmcc