1 Criando um blog com o CodeIgniter 1.1 Criando e acessando métodos nos controladores Nesta seção vamos ver os primeiros passos na prática com o CodeIgniter. Após descompactá-lo em uma pasta do seu servidor local acessando a URL relativa a essa pasta, você visualizará a página de boas-vindas do framework. Essa tela é o resultado da execução do método index() do controller Welcome.php da pasta application/controllers. O método index() simplesmente carrega a view welcome_message.php. Vamos alterar o código do controller Welcome.php para este código fonte: 1 <? php 2 defined( BASEPATH ) OR exit( No direct script access allowed ); 3 4 class Welcome extends CI_Controller { 5 public function index() 6 { 7 //$this->load->view( welcome_message ); 8 $data[ mensagem ] = "Olá Mundo!!"; 9 $this->load->view( ola_mundo,$data); 10 } Note que não é necessário fechar o arquivo PHP com?>; de fato, é uma boa prática não fazê-lo, evitando assim a possibilidade de erro na interpretação em função de algum espaço ou alguma quebra de linha após o?>. Isso não é um requisito do framework, apenas uma boa prática da escrita do PHP. Você verá que os arquivos do framework não são fechados com?>. Após modificar o controller, crie um arquivo chamado ola_mundo.php na pasta views com o códigofonte a seguir: 1 <html> 2 <head> 3 <title> 4 <?php echo $mensagem?> 5 </title> 8 <h1><?php echo $mensagem?></h1> 9 </body> 10 </html> Note que o controller não tem um construtor, mas ainda assim é possível acessar a instância do $this do framework; isso ocorre porque, ao declarar a classe, foram herdadas as características de um controller por meio da instrução extends CI_Controller, e isso faz com que o framework entenda que a classe Welcome.php é um controller. Na linha $data[ mensagem ] = Olá Mundo ; criamos de maneira implícita um array com o índice mensagem e o valor Olá mundo. Posteriormente, passamos essa variável para a view ao adicionar o array com um parâmetro ao carregar a view em $this->load->view( ola_mundo,$data); Esse é o modo como passamos dados dos controllers para as views, podendo ser um simples array com um único índice ou um array multidimensional com várias dimensões de dados. O próximo exercício é ainda mais simples. Adicione ao mesmo controller Welcome.php um novo método chamado teste() com esse código-fonte: 1 public function teste(){ 2 echo "Isto é apenas um teste"; 3 } O objetivo desse teste é entender como acessar esse método. Para visualizar o resultado desse código, você deve acessar o endereço completo, conforme esta URL: http://localhost/codeigniter/index.php/welcome/teste. Note no endereço que estamos indicando o caminho completo incluindo o front controller do framework, que é o arquivo index.php. Se você ainda não incluiu o arquivo.htaccess na pasta-raiz do
projeto e tentar retirar o index.php da URL, você verá a mensagem de erro HTTP 404, do Apache, não do framework. Para corrigir o carregamento do framework sem precisar digitar o index.php, basta adicionar o arquivo.htaccess conforme já exposto. Adicione este código a um arquivo chamado.htaccess e salve-o na pasta-raiz da aplicação: 1 <IfModule mod_rewrite.c> 2 RewriteEngine On 3 RewriteCond %{REQUEST_FILENAME}!-f 4 RewriteCond %{REQUEST_FILENAME}!-d 5 RewriteRule ^(.*)$ index.php?$1 [L] 6 </ IfModule > Ao fazer isso, você conseguirá acessar o método teste() sem precisar digitar o segmento index.php da URL. Caso você adicione o arquivo.htaccess e continue vendo o mesmo erro HTTP 404 de página não encontrada do Apache, certifique-se que o módulo mod_rewrite está sendo carregado; você pode fazer isso usando a função phpinfo() do PHP. Você também pode passar parâmetros para os métodos por meio das URLs. Para testar essa funcionalidade, vamos alterar o método teste() para este código-fonte: 1 public function teste($parametro1, $parametro2){ 2 echo $parametro1; 3 echo "<br/>"; 4 echo $parametro2; 5 } Agora o método recebe dois parâmetros por meio da URL e mostra o texto informado nos parâmetros no navegador. Basta adicionar duas strings à URL para testar, como por exemplo a URL http://localhost/codeigniter/welcome/teste/iron/maiden 1.2 Criando e conectando o banco de dados O primeiro passo é criar o banco de dados que utilizaremos para o blog. Para essa tarefa, basta usar o software de sua preferência e executar este comando SQL: 1 CREATE DATABASE blog /*!40100 DEFAULT CHARACTER SET utf8 */; Com o banco de dados já criado, vamos adicionar a tabela que armazenará os dados das postagens. Esta tabela deve ter um campo para o título, um para a data em que a postagem foi criada e um para o texto da postagem. Também é de praxe ter um campo do tipo ID, autonumeração e chave primária da tabela. Veja neste script SQL o comando para criar a tabela: 1 CREATE TABLE blog.postagens ( 2 id int(10) unsigned NOT NULL AUTO_INCREMENT, 3 titulo varchar(255) NOT NULL, 4 texto text NOT NULL, 5 datacadastro timestamp NOT NULL DEFAULT current_timestamp, 6 PRIMARY KEY (id) 7 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Observe que o mapa de caracteres escolhido tanto para o banco de dados quanto para a tabela é o UTF-8, o qual dá suporte a caracteres como cedilha, acentuação etc. Antes de conectar o CodeIgniter ao banco de dados, é conveniente adicionar algum conteúdo fictício ao blog, pelo menos duas ou três entradas de dados para ter com o que fazer os primeiros testes. Faça isso adicionando registros à tabela postagens utilizando qualquer um dos programas para manipulação de dados mencionados anteriormente. Então o próximo passo é conectar o CodeIgniter ao banco de dados. Para isso, primeiro é necessário carregar a biblioteca de conexão a banco de dados; faremos isso adicionando a biblioteca ao arquivo de configuração autoload.php. Localize a variável que recebe o array de libraries e adicione database assim: 1 $autoload[ libraries ] = array( database );
Outras bibliotecas serão adicionadas mais tarde, mas neste momento precisamos apenas desta. Ao tentar acessar o website neste momento, verá uma página de erro indicando que não foram informados os parâmetros de conexão com um banco de dados. Para corrigir o erro, devemos adicionar os parâmetros de conexão ao arquivo de configuração database.php. Note este exemplo: 1 $active_group = default ; 2 $query_builder = TRUE; 3 4 $db[ default ] = array( 5 dsn =>, 6 hostname => localhost, 7 username => root, 8 password => admin, 9 database => blog, 10 dbdriver => mysqli, 11 dbprefix =>, 12 pconnect => TRUE, 13 db_debug => TRUE, 14 cache_on => TRUE, 15 cachedir =>, 16 char_set => utf8, 17 dbcollat => utf8_general_ci, 18 swap_pre =>, 19 encrypt => FALSE, 20 compress => FALSE, 21 stricton => FALSE, 22 failover => array(), 23 save_queries => TRUE 24 ); Alguns parâmetros já vêm preenchidos com valores-padrão, que são os mais comuns e provavelmente se encaixarão bem nesta aplicação de exemplo, bastando na prática adicionar o servidor, o banco de dados, o usuário e a senha. 1.3 Recuperando informações do banco de dados Vamos alterar o controller Welcome.php em seu método teste() conforme este código-fonte: 1 public function teste(){ 2 $data[ postagens ] = $this->db->get( postagens )->result(); 3 echo "<pre>"; 4 print_r($data); 5 } Agora, ao acessar a URL http://localhost/codeigniter/welcome/teste você verá na tela do seu navegador os dados previamente cadastrados em nosso BD. Nesse código estamos utilizando o método get() da classe de banco de dados db para recuperar a tabela inteira. É possível adicionar cláusulas where, limitar o número de registros exibidos, ordenar os resultados etc. O método result() retorna o resultado da consulta, mas é possível acessar o método get() diretamente, e você terá acesso a outras informações sobre a tabela, a conexão etc. Agora que já temos acesso aos dados da tabela, vamos alterar o método para que isso seja passado para uma view e que ela seja carregada. Altere novamente o método teste() do controller Welcome.php conforme este trecho de código: 1 public function teste(){ 2 $data[ postagens ] = $this->db->get( postagens )->result(); 3 $this->load->view( postagens,$data); 4 }
Agora, em vez de mostrar o retorno do banco de dados diretamente com o print_r do PHP, vamos carregar uma view e iterar pelos registros. Para isso, crie o arquivo postagens.php na pasta applications/views com este código-fonte: 8 <h2>meu Blog</h2> 9 <? php 10 foreach($postagens as $post){ 11 echo "<h3>". $post->titulo. "</h3>"; 12 echo "<p>". $post->texto. "</p>"; 13 echo "<p>". $post->datacadastro. "</p>"; 14 echo "<hr>"; 15 } 16?> 17 </body> 18 </html> Note que o código é uma simples mescla de HTML com um bloco PHP que itera pela variável $postagens. Essa variável foi passada pelo array $data no controlador ao carregar a view. Além das postagens do blog, podemos passar outros valores se necessário. Vamos fazer algumas modificações nesta view para testar mais algumas funcionalidades do framework. Modifique a view postagens.php conforme este código-fonte: 8 <h2>meu Blog</h2> 9 <h3>postagens recentes</h3> 10 <? php 11 foreach($postagens as $post){ 12 $lista_urls[] = anchor(base_url("welcome/detalhes/". $post->id), $post ->titulo; 13 } 14 echo ul($lista_urls); 15?> 16 </body> 17 </html> Esta modificação faz com que cada uma das postagens gere um hyperlink para o método detalhes() que construiremos a seguir. Note que estamos iterando pelos registros recebidos do banco de dados com o laço foreach() do PHP, guardando as URLs no array $lista_urls e utilizando a função anchor() do CodeIgniter para gerar os hyperlinks e a função ul() para gerar uma lista HTML. Essas funções dependem do URL Helper e do HTML Helper para que estejam disponíveis. Vamos carregar os helpers, e como são recursos de uso frequente, é preferível adicioná-los ao arquivo de configuração autoload.php; procure pelo índice helper da variável $autoloade adicione os helpers assim: 1 $autoload[ helper ] = array( url, html ); Agora, cada uma das linhas da lista mostra um link para alguma postagem do blog. O próximo passo é construir um método que mostre os detalhes da postagem. Para isso, adicione o método detalhes() ao controller Welcome.php conforme este código fonte:
1 public function detalhes($id){ 2 $this->db->where( id, $id); 3 $data[ postagem ] = $this->db->get( postagens )->result(); 4 $data[ postagens ] = $this->db->get( postagens )->result(); 5 $this->load->view( detalhes_postagem, $data); 6 } E também adicione o método à view detalhes_postagem.php com este código-fonte: 4 <meta charset = "utf-8"> 8 <h2>meu Blog</h2> 9 <h3><?php echo $postagem[0]->titulo?></h3> 10 <p><?php echo $postagem[0]->texto?></p> 11 <p><?php echo $postagem[0]->datacadastro?></p> 12 <h3>postagens recentes</h3> 13 <? php 14 foreach($postagens as $post){ 15 $lista_urls[] = anchor( base_url("welcome/detalhes/". $post->id), $post->titulo); 16 } 17 echo ul($lista_urls); 18?> 19 </body> 20 </html> Para fazer com que o site esteja acessível já ao acessar a home, altere o nome do método teste() para index() e exclua ou comente o antigo método index(). Assim, ao acessar a raiz do site, você terá acesso aos links das postagens. Para tornar a URL das postagens mais curta e amigável, vamos alterar o endereço com o auxílio de uma rota; adicione esta linha ao arquivo de configuração routes.php: 1 $route[ detalhes/(:num) ] = welcome/detalhes/$1 ; Essa rota encaminha as requisições feitas à detalhes/algum-numero para welcome/detalhes/algumnumero. Sendo assim, basta alterar os arquivos das views postagens.php e detalhes_postagens.php para que o link seja gerado conforme esse novo formato de URL, modificando a linha que gera os links para este formato: 1 $lista_urls[] = anchor( base_url("detalhes/". $post->id), $post->titulo); Agora os links estão sendo gerados de modo mais curto e amigável. Os links antigos continuam funcionando como anteriormente. 1.4 Criando formulários e enviando emails Vamos modificar as views postagens.php e detalhes_postagens.php acrescentando dois novos links, conforme trecho de código após a tag <body>: 1 <? php 2 echo anchor(base_url(), " Home "). anchor(base_url("fale-conosco"), " Fale Conosco "); 3?> Isso criará um link para a home e um link para uma página de contato que ainda não existe. Esta página de contato mostrará ao visitante um formulário para que ele possa enviar mensagens ao administrador do blog. Vamos acrescentar mais uma rota ao arquivo routes.php assim:
1 $route[ fale-conosco ] = welcome/fale_conosco ; Ou seja, ao acessar o link fale-conosco, o visitante será direcionado para o método fale_conosco() do controller Welcome.php. Acrescente este código-fonte para criar o método: 1 public function fale_conosco(){ 2 $this->load->helper( form ); 3 $this->load->view( fale_conosco ); 4 } Para o link funcionar, falta ainda criar a view com o formulário e depois o método que fará o envio da mensagem. Acrescente esse código-fonte ao arquivo da view fale_conosco.php: 8 <? php 9 echo anchor(base_url()," Home "). 10 anchor(base_url("fale-conosco")," Fale Conosco "). 11 heading("meu blog",2). heading("fale Conosco",3); 12 $atributos = array( name => formulario_contato, 13 id => formulario_contato ); 14 echo form_open(base_url( welcome/enviar_mensagem ),$atributos). 15 form_label("nome:","txt_nome"). br(). 16 form_input( txt_nome ). br(). 17 form_label("e-mail:","txt_email"). br(). 18 form_input( txt_email ). br(). 19 form_label("mensagem:","txt_mensagem"). br(). 20 form_textarea( txt_mensagem ). br(). 21 form_submit("btn_enviar","enviar Mensagem"). 22 form_close(); 23?> 24 </body> 25 </html> Para proceder o envio da mensagem, é necessário criar o método enviar_mensagem() no controller Welcome.php conforme este código fonte: 1 public function enviar_mensagem(){ 2 $mensagem = "Nome: ". $this->input->post( txt_nome ). br(); 3 $mensagem.= "E-mail: ". $this->input->post( txt_email ). br(); 4 $mensagem.= "Mensagem: ". $this->input->post( txt_mensagem ).br(); 5 $config[ protocol ] = smtp ; 6 $config[ smtp_host ] = ssl://smtp.googlemail.com ; 7 $config[ smtp_port ] = 465 ; 8 $config[ smtp_timeout ] = 30 ; 9 $config[ smtp_user ] = endereco_que_envia@gmail.com ; 10 $config[ smtp_pass ] = senha_do_email_que_envia ; 11 $config[ charset ] = utf-8 ; 12 $config[ newline ] = "\r\n"; 13 $config[ mailtype ] = html ; 14 $this->load->library( email,$config); 15 $this->email->from("endereco_que_envia@gmail.com","formulário do website "); 16 $this->email->to("email_que_recebe@gmail.com"); 17 $this->email->subject( Assunto do e-mail, enviado pelo CodeIgniter ); 18 $this->email->message($mensagem); 19 if($this->email->send()){
20 $this->load->view( sucesso_envia_contato ); 21 } 22 else{ 23 print_r($this->email->print_debugger()); 24 } 25 } Criando a view sucesso_envia_contato.php: 8 <h3>e-mail enviado com sucesso!!</h3> 9 </body> 10 </html> No método enviar_mensagem() listado acima, existem três coisas importantes a se observar. A primeira delas, que serve para qualquer situação que receba dados por meio de formulários, é que não utilizamos o tradicional $_POST[ nome_do_campo ] para receber os valores do formulário, mas sim $this->input->post( nome_do_campo ); isso é importante sob o aspecto da segurança, pois o CodeIgniter realiza verificações de segurança nesse método que impedem, entre outras coisas, ataques do tipo SQL Injection ao website. Outro aspecto importante nesse método é o modo como estamos carregando a biblioteca que faz o envio do email. Houve épocas em que era comum enviar emails de servidores sem nenhuma validação ou autenticação, porém, com o crescente abuso no envio de spam e possíveis malwares, praticamente nenhum servidor aceita emails que não sejam verificados e autenticados, portanto é necessário validar o envio dos emails encaminhados. Assim, para encaminhar corretamente o e-mail ao carregar a biblioteca em $this->load->library( email,$config;, estamos passando o array $config com diversas instruções de configuração. Note que essas configurações mudam de acordo com o servidor de email utilizado; este é um exemplo utilizando as configurações de uma conta pessoal do Gmail. Por fim, temos o método que efetivamente dispara o envio do email, $this->email->send(). Com um simples if(), podemos verificar se o email foi encaminhado ou não. Se sim, o framework carrega a view sucesso_envia_contato.php; caso contrário, as mensagens de erro são exibidas utilizando o método $this->email->print_debugger() da biblioteca Email. É importante observar também que, caso uma biblioteca seja utilizada em vários lugares da sua aplicação, é preferível adicionar as variáveis de configuração a um arquivo na pasta application/config. Para fazer isso, basta que o arquivo de configuração coincida com o nome da biblioteca; neste caso, email.php. Este trecho de código exemplifica como ficaria o arquivo: 1 <? php 2 defined( BASEPATH ) OR exit( No direct script access allowed ); 3 $config[ protocol ] = smtp ; 4 $config[ smtp_host ] = ssl://smtp.googlemail.com ; 5 $config[ smtp_port ] = 465 ; 6 $config[ smtp_timeout ] = 30 ; 7 $config[ smtp_user ] = endereco_que_envia@gmail.com ; 8 $config[ smtp_pass ] = senha_do_email_que_envia ; 9 $config[ charset ] = utf-8 ; 10 $config[ newline ] = "\r\n"; 11 $config[ mailtype ] = html ; Note que dessa maneira não é necessário passar a variável com o array $config ao carregar a biblioteca, pois o CodeIgniter entende que, existindo o arquivo de configuração para uma biblioteca, ele deve assumir o conteúdo do arquivo por padrão. Havendo necessidade de carregar configurações diferentes em métodos diferentes, basta sobrescrever o array fazendo a carga de variáveis diferentes em um array de configuração diretamente no método.
1.5 Validando formulários Criando um blog com o CodeIgniter O CodeIgniter dispõe de uma biblioteca que auxilia na construção de um sistema de validação de formulários robusto. Essa validação é feita no lado do servidor e não depende de JavaScript, que pode estar desabilitado dependendo do dispositivo que está acessando o site ou a aplicação. A primeira providência é alterar o método enviar_mensagem(), conforme segue: 1 public function enviar_mensagem(){ 2 $this->load->library( form_validation ); 3 $this->form_validation->set_rules( txt_nome, Nome, required ); 4 $this->form_validation->set_rules( txt_email, Email, required valid_email ); 5 $this->form_validation->set_rules( txt_mensagem, Mensagem, required ); 6 if($this->form_validation->run()){ 7 $mensagem = "Nome: ". $this->input->post( txt_nome ). br(); 8 $mensagem.= "E-mail: ". $this->input->post( txt_email ). br(); 9 $mensagem.= "Mensagem: ". $this->input->post( txt_mensagem ).br(); 10 $this->load->library( email ); 11 $this->email->from("marcelo.mussel@gmail.com","formulário do website"); 12 $this->email->to("marcelo.mussel@gmail.com"); 13 $this->email->subject( Assunto do e-mail, enviado pelo CodeIgniter ); 14 $this->email->message($mensagem); 15 if($this->email->send()){ 16 $this->load->view( sucesso_envia_contato ); 17 } 18 else{ 19 print_r($this->email->print_debugger()); 20 } 21 } 22 else{ 23 $this->fale_conosco(); 24 } 25 } A lógica por trás da validação é muito simples. Carrega-se a biblioteca form_validation em $this->load->library( form_validation ); e, então, as regras de validação do formulário são fornecidas. Checamos se estas foram atendidas em $this->form_validation->run(), que retorna TRUE em caso positivo e FALSE em caso negativo. Se foram atendidas, basta proceder o envio da mensagem do mesmo modo como havíamos feito antes; se não, o método que exibe o formulário é invocado novamente com $this->fale_conosco(). Agora, vamos alterar a view com o formulário para que mostre as mensagens de erro e para que preencha automaticamente os valores já informados nos campos. Dessa forma, ao enviar um formulário incompleto, o usuário não perde os campos que já foram corretamente preenchidos. Altere a view fale_conosco.php conforme esse código: 8 <? php 9 echo anchor(base_url()," Home "). 10 anchor(base_url("fale-conosco")," Fale Conosco "). 11 heading("meu blog",2). heading("fale Conosco",3); 12 echo validation_errors(); 13 $atributos = array( name => formulario_contato, 14 id => formulario_contato ); 15 echo form_open(base_url( welcome/enviar_mensagem ),$atributos).
16 form_label("nome:","txt_nome"). br(). 17 form_input( txt_nome, set_value( txt_nome )). br(). 18 form_label("e-mail:","txt_email"). br(). 19 form_input( txt_email, set_value( txt_email )). br(). 20 form_label("mensagem:","txt_mensagem"). br(). 21 form_textarea( txt_mensagem, set_value( txt_mensagem )). br(). 22 form_submit("btn_enviar","enviar Mensagem"). 23 form_close(); 24?> 25 </body> 26 </html> 1.6 Traduzindo as mensagens de validação do formulário Para fazer com que as mensagens de validação do formulário, as mensagens de erro e os alertas ao usuário sejam exibidas em português, são necessárias duas ações: Primeiro faça o download da tradução dos arquivos de linguagem(https://github.com/bcit-ci/codeigniter e adicione uma pasta chamada pt-br à application/language. A pasta deve conter os mesmos arquivos encontrados na pasta system/language/english. Atenção: você não deve adicionar a tradução em system/language, mas sim em application/language. O segundo passo é alterar o arquivo de configuração config.php em application/config para que a linguagem coincida com o nome da pasta; no caso, portuguese-brazilian: 1 $config[ language ] = portuguese-brazilian 1.7 Alterando a página de erro 404 Para apresentar mensagens personalizadas de erros para páginas ausentes ou links incorretos, no arquivo routes.php altere a variável 404_override para que o usuário seja direcionado à sua página personalizada de erro desta forma: 1 $route[ 404_override ] = welcome/error404 ; Agora basta criar o método error404() no controller Welcome.php 1 public function error404(){ 2 $this->load->view( error404 ); 3 } e criar error404.php conforme este código-fonte: 8 <? php 9 echo anchor(base_url()," Home "). anchor(base_url("fale-conosco"), " Fale Conosco "). heading("meu Blog", 2); 10?> 11 <h3>a página que você está tentando acessar não existe ou seu endereço foi modificado</h3> 12 <a href="javascript:history.go(-1)">voltar</a> 13 </body> 14 </html>
2 continua... Na próxima parte criaremos a área de administração do blog, com opções de adicionar, alterar e excluir registros e adicionar formatação CSS ao blog.