Arquivo da categoria 'CodeIgniter'

Utilizando layouts no CodeIgniter

Na grande maioria dos sites e sistemas web é apenas modificado o miolo da aplicação, enquanto que o cabeçalho, rodapé, menu, etc. permanecem iguais. E utilizando o modelo MVC, normalmente para cada action do controller temos uma view correspondente, sendo que geralmente um controller: Main com uma action: index, terá a view main/index.php.

No Code Igniter teríamos que fazer tudo manualmente, já que não há como definir um layout que será carregado em cada view, nem esse carregamento automático.

Pelo menos não havia... :D

Criei um pequeno hook que faz esse serviço. Crie seu controller como abaixo:

PHP:
  1. class Main extends Controller {
  2.  
  3.   function Main()
  4.   {
  5.     parent::Controller();
  6.   }
  7.  
  8.   function index()
  9.   {
  10.     $this->data->foo = $this->db->get('main_table');
  11.   }
  12.  
  13.   function show()
  14.   {
  15.     $this->data->foo = $this->db->get('another_table');
  16.     // Você pode definir manualmente a view e o layout da seguinte forma:
  17.     $this->view = 'main/index';
  18.     $this->layout = 'popup';
  19.   }
  20. }

E ao acessar as duas actions a view main/index.php será chamada com os valores definidos na variável $this->data. Também será carregado o layout application/views/layouts/default.php na função index e application/views/layouts/popup.php na função show.

Download

Faça o download da hook ou de uma aplicação de exemplo (CI 1.6.2).

Instalação

Para utilizar este hook, copie o arquivo Layout.php dentro da pasta application/hooks/, defina a opção $config['hooks'] com true no config e adicione o seguinte no arquivo application/config/hook.php:

PHP:
  1. $hook['post_controller'][] = array(
  2.   'class'    => 'Layout',
  3.   'function' => 'view',
  4.   'filename' => 'Layout.php',
  5.   'filepath' => 'hooks',
  6.   'params'   => array()
  7. );

Espero que goste tanto de utilizar isto quanto eu. Me salva algumas linhas de código.

Cortando e redimensionando imagens com o CodeIgniter

Eu sei que não tenho aparecido muito por aqui, mas o desenvolvimento da nova versão do SiGA está tomando todo tempo imaginável e tive que priorizar aquilo, pois o prazo já está estourando. Mas não é sobre isso que quero escrever.

Recentemente precisei de imagens quadradas num projeto e esse mesmo procedimento se repetiria várias vezes, então criei esta extensão da Biblioteca Image_lib que já vem com o CodeIgniter. Na verdade o código serve não só para imagens quadradas, já que o tamanho tem que ser definido literalmente.

Cole o código abaixo na pasta application/library com o nome MY_Image_lib.php:

PHP:
  1. class MY_Image_lib extends CI_Image_lib {
  2. /**
  3. * Crop and resize a image
  4. *
  5. * @return bool
  6. */
  7.     function crop_and_resize() {
  8.         $width = $this->width;
  9.         $height = $this->height;
  10.         $size = getimagesize($this->source_folder . $this->source_image);
  11.        
  12.         if ($size[0]> $size[1]) {
  13.             $this->width$width / $height * $size[1];
  14.             $this->height = $size[1];           
  15.         } else {
  16.             $this->width = $size[0];
  17.             $this->height$height / $width * $size[0];           
  18.         }
  19.         $this->x_axis = ($size[0] - $this->width) / 2;
  20.         $this->y_axis = ($size[1] - $this->height) / 2;
  21.        
  22.         if ( ! $this->crop() ) {
  23.             return false;
  24.         }
  25.        
  26.         $this->width = $width;
  27.         $this->height = $height;
  28.                
  29.         if ( ! $this->resize()) {
  30.             return false;
  31.         }
  32.         return true;
  33.     }
  34. }

Pra usar é muito fácil:

PHP:
  1. $config = array(
  2. 'source_image' => '/path/para/a/imagem.jpg',
  3. 'maintain_ratio' => false,
  4. 'width' => 48,
  5. 'height' => 48);
  6.  
  7. $this->load->library('image_lib', $config);
  8. $this->image_lib->crop_and_resize();

E temos uma imagem como a mostrada abaixo:

CodeIgniter em PHP5 ou PHP4?

Recentemente tem havido bastante discussão[bb] sobre o por que de o CodeIgniter não partir apenas para o PHP5, mas não entendo isso, já que um dos grandes motivos que me levou a ter interesse por esse framework[bb] foi por ele suportar o PHP4. Entendo e concordo que o PHP5 é muito superior, poder trabalhar apenas com OO é muito melhor, mas existem dois grandes problemas que travam a adoção ao PHP5.

Quem nunca teve que fazer um site pra hospedar num servidor com PHP4 e MySQL 3.23? (E olha que uma das maiores empresas de hospedagem[bb] do Brasil tem uma configuração parecida com essa! Qual é a sua?) Por mais que os desenvolvedores do PHP[bb] façam campanha de adoção do PHP5, que o PHPmyAdmin prometa que as próximas versões apenas serão pra PHP5, isso NÃO vai mudar. As hospedagens ainda são PHP4 e adoção ao PHP5 é lenta (cerca de 1% ao mês).

Outro fator é que infelizmente a maioria dos desenvolvedores são medíocres. Não estão nem um pouco preocupados com MVC, OO, padrões web[bb] e tudo mais. E isso acaba influenciando as hospedagens, que tem medo de quebrar os códigos de seus clientes. Não que eu me considere um grande programador, mas isso é o que todos tinham que ter como base (ou pelo menos vontade de aprender).

Voltando ao CodeIgniter, o Derek Allard, um dos desenvolvedores do CodeIgniter, já disse que o PHP4 será suportado por bastante tempo ainda, justamente por isso. Não adianta querermos impor algo, quando não temos meios para forçar.

Não quero de maneira nenhuma defender os hosts que não fazem upgrades, muito menos a "sobrinhada", mas acho que as vezes esquecemos que vivemos em mundo que não é perfeito, que por mais que queiramos que as coisas sejam ótimas, elas apenas podem ser tão boas quanto possível.

Named params no Code Igniter

Named params são parâmetros enviados numa url, mas sem ordem definida. Na prática são o velho ?var=valor&var2=valor2, mas de um modo mais limpo.

www.seusite.com/controller/método/nome:Felipe/cidade:Teutônia/

Eu venho utilizando CodeIgniter há algum tempo e ele não permite passar variáveis como o PHP normalmente faz e acabei criando algo assim para utilizar. E quando li o artigo do Tulio Faria falando sobre named params, mas no CakePHP, a primeira coisa que pensei é que deveria disponibilizar minha função aqui no blog.

Na verdade é uma estensão da biblioteca URI:

PHP:
  1. class MY_URI extends CI_URI {
  2. function named_param($var) {
  3. $arr = $this->segment_array();
  4. foreach ($arr as $value) {
  5. if ($var == substr($value, 0, strpos($value, ':'))) {
  6. return substr($value, strpos($value, ':')+1);
  7. }
  8. }
  9. return null;
  10. }
  11. }

Para chamar essa função faça da seguinte maneira:

PHP:
  1. $this->uri->named_param('nome'); // Na url de exemplo acima retornaria Felipe
  2. $this->uri->named_param('cidade'); // Na url de exemplo acima retornaria Teutônia

Update:

Conversando o Guilherme Medeiros, chegamos a uma solução diferente da de cima. Nesta versão não se chama uma função que retornará o valor, mas sim os valores já estão na variável named, ficando a classe assim:

PHP:
  1. class MY_URI extends CI_URI {
  2. var $named;
  3.  
  4. function MY_URI() {
  5. parent::CI_URI();
  6.  
  7. $uri = $this->segment_array();
  8. foreach($uri as $val) {
  9. if (strpos($val, ':')) {
  10. $this->named->{substr($val, 0, strpos($val, ':'))} = substr($val, strpos($val, ':')+1);
  11. }
  12. }
  13. }
  14. }

Sendo usado assim:

PHP:
  1. $this->uri->named->nome; // Na url de exemplo acima retornaria Felipe
  2. $this->uri->named->cidade; // Na url de exemplo acima retornaria Teutônia

Vale lembrar que o valor deve ser testado com o isset(), pois pode não existir.

O Framework CodeIgniter

O que um framework tem que fazer? Sério, copiar o Rails?

Tudo bem que seja um om espelho, mas não pode ser feito com fé cega, acreditando que o que o rails faz é o que há de melhor pra se fazer. Não que RoR seja ruim, muito pelo contrário, mas existem vários frameworks imitando-o sem pensar um pouco.

Eu programo em PHP para viver, poderia mudar já que sou eu quem define isso, mas ainda só estou testando outras linguagens para a web. Recentemente resolvi que iria usar um framework para desenvolver, pleos motivos que todo mundo sabe: utilização de MVC, programação mais rápida, etc.

Cheguei a testar o CakePHP, mas não gostei dele pois ele te faz trabalhar como ele quer, não como o programador quer. Bati cabeça com mais alguns e resolvi que montaria meu próprio framework. Programa, programa, programa... Ainda falta muito pela frente...

Logo do CodeIgniterAté que parei e conheci o CodeIgniter. Achei muito bom, é um framework legal e que me dava a liberdade que eu não tinha com o Cake.

Este framework, apesar de ter sido baseado no Rails, não o segue cegamente e dá um liberdade muito grande pra trabalhar do jeito que o programador quiser. Claro que ele tem uma padronização, mas a liberdade vem em você usar as ferramentas que são fornecidas muito facilmente.

Se você quer saber mais sobre o CodeIgniter, sugiro que veja os screencasts do Elliot Haughin, que foi o que me fez ver o que o CodeIgniter podia fazer; leia o blog do Derek Allard, que é um dos desenvolvedores do Framework; e LEIA O MANUAL. Em português, a comunidade ainda está se formando, mas já existe o site codeigniter.com.br, lá se encontra o manual traduzido, um fórum (que atualmente está fora do ar) e a lista de discussão.

Aguardem alguns artigos aqui sobre esse tema.