sábado, 27 de setembro de 2014

Campos customizados para autenticação com Laravel 4.2

Olá galera,

O Laravel, por padrão, utiliza os campos username e password para autenticação. Dessa forma, nós podemos utilizar o método Auth::attempt sem que seja necessário fazer nenhuma alteração.

Agora supondo que a nossa tabela utilize campos como email e senha, quais alterações precisam ser feitas para que o método Auth::attempt passe a funcionar?

A primeira delas deve ser feita no seu model de usuário, onde é implementado o método getAuthPassword com o meu atributo.

    public function getAuthPassword()
    {
       return $this->senha;
    }
  

Abaixo eu implementei um método, no controller de usuário, chamado validate que será chamado quando um formulário de login foi submetido.

    public function validate()
    {
       $user = array(
            'email' => Input::get('email'),
            'password' => Input::get('senha'),
            'ativo' => 1
        );

        if (Auth::attempt($user, false)) {
            echo 'Logado com sucesso!';
        } else {
            echo 'Não foi possível efetuar o login.';
        }
    }
  

Note que o segredo está no campo da senha. A chave que eu utilizo no array tem que ser exatamente password. Os demais parâmetros terão que ser o nome dos nossos campos na tabela de usuários. Inclusive podem ser passados vários atributos para serem validados como foi o caso do ativo.

Fica aí a dica. Grande abraço

segunda-feira, 8 de setembro de 2014

Trabalhando com Openlayers e Mapserver no Windows

Olá galera,

Esse post é atendendo a solicitação de uma leitora aqui do blog, nossa amiga Fernanda Franciele. Não vou entrar em muitos detalhes sobre os códigos porque não é o foco. Quem tiver interesse em saber mais, pode ler o post Criando e exibindo um WMS com MapServer, PostGIS e Openlayer.

Vamos começar com a instalação do MS4W. Faça o download do instalador ms4w-3.0.6-setup.exe no link http://www.maptools.org/ms4w/index.phtml?page=downloads.html e instale conforme as telas abaixo.

Após a instalação, adicionaremos a projeção do Google que não vem por padrão. Abra o arquivo epsg com o bloco de notas que se encontra no diretório abaixo.

Inclua o código abaixo na última linha.

# Google Maps
<900913> +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs <>

Abaixo segue a organização dos arquivos criados no MS4W.

Você pode fazer o download do arquivo utilizado AQUI. A diferença dele pra o post Criando e exibindo um WMS com MapServer, PostGIS e Openlayer é que estou utilizando um shapefile ao invés do banco e não estou utilizando labels no mapa.

O resultado final deve ter ficado como abaixo.

Espero ter ajudado aos usuários que trabalham com o Windows.

Grande abraço a todos.

domingo, 7 de setembro de 2014

Trabalhando com mutators no Laravel 4.2

Olá galera,

O Eloquent fornece um forma de modificar os atributos do model. Para exemplificar seu uso, vamos analisar o UsuariosController.php da série Autenticação e ACL com Laravel 4.1.

Nos métodos que salvam e atualizam os dados do usuário, o hash da senha é feito manualmente antes de salvá-la no banco de dados.

$input['password'] = Hash::make(Input::get('password'));

Utilizando mutator, nós podemos remover essa "transformação" e criar um método no model Usuario.php.

    public function setPasswordAttribute($value) {
    $this->attributes['password'] = Hash::make($value);
    }
  

A partir de agora quando for atualizar ou inserir uma senha no banco o hash dela será feito automaticamente.

Vale lembrar que o nome do método deve seguir o padrão setNomedoatributoAttribute

Fica aí a dica. Grande abraço

segunda-feira, 1 de setembro de 2014

Exibindo menu de acordo com o perfil

Olá galera,

Após receber inúmeras solicitações, vou mostrar como exibir somente itens do menu que o usuário tem permissão.

Recomendo que você dê uma olhada nos comentários do post Autenticação e ACL com Laravel 4.1 - Final para saber do que estamos falando.

Tomando como base os códigos da série Autenticação e ACL com Laravel 4.1, abra o arquivo app/macros.php e adicione a macro abaixo.

    HTML::macro('mountMenu', function() {
      $menu = null;
      $cache = Cache::get('actions' . Auth::user()->id);
      $index = preg_grep('/index|\*/', $cache);

      $links = array(
        'veiculo' => 'Veículos',
        'usuario' => 'Usuários',
        'perfil' => 'Perfis',
      );

      foreach($links as $key => $value) {
        foreach($index as $i) {
          if($key == current(explode('.', $i)) || $i == '*')
            $menu .= '
  • ' . link_to($key, $value) . '
  • '; } } return $menu; });

    Já no arquivo app/views/partials/_navigation.blade.php, remova as tags 'li' que contém os links do menu e adicione {{ HTML::mountMenu() }}

    Explicando a macro que gera o menu.

    Linha 3: Recuperando as permissões do usuário logado

    Linha 4: Retorno as entradas do array de acordo com o padrão que pode ser o 'index' ou '*'

    Linhas 6 a 10: Array de itens do menu com chave e valor, sendo que a chave é minha rota e o valor é o label a ser exibido.

    Linhas 12 a 14: Percorro os dois arrays comparando se as chaves são iguais

    Linha 15: Concateno os itens de menu que atendem a minha condição

    Bastante simples não é verdade? Fica aí a dica.

    Um grande abraço e até a próxima.

    terça-feira, 12 de agosto de 2014

    Salvando uma imagem com background a partir de canvas

    Olá galera,

    Esses dias precisei salvar uma imagem a partir do canvas. Só clicando com o botão direito e pedindo para salvar como imagem funciona. Então qual o problema? O click com o botão direito já tinha um evento mapeado e o background do PNG gerado era transparente.

    O problema foi solucionado com Javascript através de uma simples página HTML com um botão.

    Código HTML:

        <!DOCTYPE html>
        <html lang="pt-br">
          <head>
            <title>Canvas</title>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
          </head>
          <body>
            <canvas id="canvas" width="200" height="200"></canvas>
            <button>Baixar</button>
            <script defer="defer" src="canvas.js"></script>
          </body>
        </html>
      

    Código Javascript:

        var button = document.getElementsByTagName('button');
    
        button[0].addEventListener('click', function() {
          var canvas = document.getElementById("canvas");
          var w = canvas.width;
          var h = canvas.height;
          var context = canvas.getContext('2d');
          var data = context.getImageData(0, 0, w, h);
          context.fillStyle = "rgb(255,0,0)"; 
          context.fillRect(0,0,w,h);
          window.location.href = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream");
    
          context.clearRect (0,0,w,h);
          context.putImageData(data, 0,0);
        });
      

    Explicando o código do Javascript:

    Linha 3 - Adicionando o evento de click ao botão.
    Linha 7 - Retorna o objeto com métodos e propriedades para desenhar na tela.
    Linha 8 - Retorna o objeto ImageData que copia os dados do pixel para a geometria com largura e alturas definidas.
    Linha 9 - Retorna a cor usada para preencher o desenho.
    Linha 10 - Desenha o retângulo "cheio".
    Linha 11 - Conversão e exportação do desenho do canvas em uma URL codificada PNG de 64 bits.
    Linha 13 - Limpa os pixels especificado dentro do retângulo.
    Linha 14 - Coloca os dados da imagem (a partir do objeto ImageData especificado) de volta para a tela.

    Fica aí a dica de hoje.

    Um grande abraço a todos.