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.

Editor WYSIWYG muito leve

Hoje me deparei com algo que já venho procurando faz um bom tempo[bb]. Um editor WYSIWYG que fosse leve.

A maioria dos editores tem mais de 100KB, chegando alguns a mais de 200KB. O NicEdit por outro lado tem menos 35 KB e, se comprimido menos de 10KB. Obviamente ele é simples, mas quem precisa do word quando quer colocar negrito em uma ou outra palavra? Lembre-se conteúdo é o rei!

No site[bb] tem vários exemplos de como se utiliza ele, além de bastante informação[bb].

Pegando o conteúdo de um iframe

Hoje tive um daqueles problemas[bb] que você pensa, pensa, pensa, e não consegue resolver.

Meu problema era enviar um arquivo via AJAX[bb]. Como isso não é possível, temos que usar uma velha técnica na qual cria-se um iframe e se dá o submit do form para este. Tudo certo. Mas temos que pegar o valor do iframevia javascript para saber se correu tudo bem e o que aconteu.

Fiz alguns testes e nao estava conseguindo pegar o valor do iframe. O motivo? Levei 3 horas para descobrir. Não se consegue pegar o valor se o iframe não estiver no mesmo domínio que a página atual.

Ou seja, nos testes eu estava usando tudo menos o domínio atual. Que serviço.

Para pegar o valor, existem 2 métodos:

1) Mais fácil com a jQuery:

JavaScript:
  1. $('iframe').contents().find('body').html()

2) Um pouco maior, mas apenas javascript:

JavaScript:
  1. var io = document.getElementsByTagName('iframe')[0];
  2. if(io.contentWindow) {
  3. return io.contentWindow.document.body.innerHTML;
  4. } else if(io.contentDocument){
  5. return io.contentDocument.document.body.innerHTML;
  6. }

Mas não esqueçam. Tem que ser do mesmo domínio.

Obrigado ao Israel Cefrin por me dar a dica que tinha que funcionar e me fazer descobrir isso.

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.

Utilizando ferramentas e não muletas

Você já se viu sem martelo[bb] quando precisava pregar algo? E teve que usar uma chave de fenda ao contrário pra fazer isso? Funciona, mas é mais demorado e não é tão simples quanto usar o martelo.

MuletaDigo isso, pois freqüentemente nas listas que participo acontecem discussões inflamadas sobre usar ou não usar algo, como IDEs, frameworks[bb], etc. Claro que por um lado isso é bom, pois toda unanimidade é burra, porém essa discussão sempre acaba no "usa o teu e te ferra que eu uso o meu e fico na boa". E a outra pessoa responde a mesma coisa.

O problema é que hoje temos que ser agis e ao mesmo tempo fazer um serviço de qualidade. E isso as vezes parece não ser levado em contra por aqueles que querem usar as ferramentas mais simples. E aí se encaixa a história do martelo lá de cima.

Você pode programar um site[bb] grande usando o Vi, mas renderá mais usando uma IDE que te auxilie.

Mas aí entra o grande detalhe: Você tem que saber se virar sem a IDE, pois um belo dia o site pode estar fora do ar e você não poder usar sua magnífica IDE para resolver o problema. E nessa hora você tem que se virar com o que tem. Nem que seja com notepad.

Outro exemplo é javascript, existem várias bibliotecas que facilitam a vida, mas na hora que algo tem que ser feito sem ela, você tem que saber usar javascript "nativo".

O importante é que as ferramentas[bb] nos ajudem a fazer o serviço bem feito e rápido. E não que sirvam como muletas, e que sem elas não consigamos sair do lugar.

Crédito da Foto: Daquela manera

No Globo Repórter desta noite

Ontem a noite passou uma edição do Globo Repórter que falva sobre Finanças Pessoais. Mostraram casos de pessoas que construíram uma casa arrumando unha (1 milhão de unhas diga-se de passagem), de crianças que poupam suas moedas e conseguem comprar bens relativamente caros, mostraram 2 amigas, uma que é gastadora e outra que controla melhor seu dinheiro.

Mas apesar de tudo isso, em nenhum momento falaram sobre como controlar melhor gastos ou qual a melhor forma de ensinar as crianças a controlar seu dinheiro. E desse mal o Globo Repórter já vem sofrendo faz um bom tempo.

Matérias sem profundidade nenhuma, apenas uma hora de "matação" tem se tornado comum na Rede Globo[bb]. Veja o Fantástico, que consegue passar 3 horas filosofando sobre o nada.

BrigaNa outra mão corre a Rede Record[bb], que tanto no Repórter Record (concorrente do Globo Repórter), quanto no Domingo Espetacular (concorrente do Fantástico) tem mostrado matérias aprofundadas e com mais conteúdo. Claro que sempre tem aquela mania de ficar anunciando o programa todo uma reportagem que só aparecerá no fim, mas nada é perfeito.

Tem sido interessante essa busca do Bispo Edir Macedo[bb] em se tornar líder de audiência. Inclusive eles prentedem ser os líderes de audiência até 2012. Parece pouca coisa, mas aqui no Brasil[bb] a TV sempre foi Globo, desde que a Globo foi criada em 1965. Isso mesmo, 42 anos de liderança.

Nenhum dos dois é santo, mas espero que essa briga ajude a ter menos decepções como a que tive ontem, quando ao terminar o programa, virei pra minha mulher e perguntei: "Tá, e aí? O programa passou e não ajudou em nada!"

Crédito da Foto: Julian Robinson.

Twitter é Microblogging?

Eu tava olhando o Twitter, me parece um subversion da vida. Mas não gostei...

UPDATE: Ok, me rendo. http://twitter.com/felipediesel

Gaúchos ou brasileiros?

Hoje é feriado aqui no Rio Grande do Sul, dia da Revolução Farropilha.

Isso me fez pensar sobre ser brasileiro e ser gaúcho hoje. É uma coisa estranha e que ninguém no resto do país entende, mas também não entendem chimarrão e tantas outras coisas daqui. A maioria dos gaúchos se sente muito mais gaúcho do que brasileiro. Para mim isso tem um grande motivo.

Qual o personagem símbolo do brasileiro? Qual a primeira coisa que vem a cabeça? A mim lembra o "malandro carioca" (não estou dizendo que todos cariocas sejam malandros), aquele que leva o tão erroneamente vangloriado "jeitinho brasileiro" como modelo de vida.

Verdadeiramente, nós brasileiros não temos uma unidade, algo que nos una. Isso só acontece em época de Copa do Mundo!

Em contrapartida o Rio Grande do Sul, tem a imagem do gaúcho, o que nos leva as origens.

Mesmo eu sendo descendente de alemães, não tendo nenhum traço de sangue negro ou índio, sinto orgulho disso. Não que não sinta orgulho de ser brasileiro, mas essa coisa de ser gaúcho faz com que sejamos unidos.

Mas isso é uma coisa muito difícil de explicar. E como querer ensinar alguém a gostar de chimarrão, ou tu tomas desde piá, ou tu nunca vais conseguir tomar.

Laptop pegando um “arzinho”

Ontem fiz uma coisa que não aconselho a ninguém: colocar o notebook[bb] sobre o capô do carro[bb].

Eu estava indo na casa do meu pai dar um abraço nele e instalar ADSL[bb] e levei meu laptop[bb] junto. Eu estava carregando um monte de coisas e coloquei sobre o carro, arrumei o Deni, larguei o resto das coisas no banco de trás, entrei e arranquei.

Ando duas quadras, olho pra trás e o Deni ainda tava sem cinto, encostei o carro, xinguei ele e aparece um cara fazendo sinal pra mim. QUE GELO. O laptop ficou em cima do carro!

Graças a deus a borracha seguro ele sobre o carro por duas quadras. E olha que não sai andando "como um santo"!

Então fica a dica: O Positivo V41 é muito bom pra deixar sobre o capô do carro, pois não cai!

Enviando vários arquivos sem exibir input file

Dia 06/07/2007 na lista Webstandards-br foi questionado como o gmail fazia, para que sem o input file, fosse enviado arquivo. Porém isso só acontecia no IE, no Firefox era um input normal.O pessoal deu uma olhada no código e concluiu que no IE funcionava algo como:

JavaScript:
  1. document.getElementById('InputFile').click();

Porém no Firefox isso não funciona. Não querendo entrar no mérito de qual navegador está certo, pensei em um modo de driblar isso e o resultando acabou resultando neste artigo.

Como fazer

Minha idéia para contornar isso é utilizar um input que fique transparente e colocar uma imagem no fundo do elemento onde esse input está! Veja que não podemos esconder o input, pois ele precisa ser clicado, mas sem que o usuário perceba. Então vamos ao HTML básico:

HTML:
  1. <form method="post" enctype="multipart/form-data" id="UploadForm">
  2. <p id="uploadButton"> <input id="inputFile" name="inputFile" size="1" type="file" /></p>
  3.  
  4. </form>

Temos um div chamado uploadButton, que conterá a imagem de fundo e o input que fará a coisa acontecer.

Adicionamos um pouco de CSS:

CSS:
  1. #inputFile {
  2.   float: right;
  3.   opacity: 0;
  4.   filter: alpha(opacity=0);
  5. }
  6. #uploadButton {
  7.   width:88px;
  8.   height:20px;
  9.   background:url("adicionar.jpg") no-repeat;
  10.   float:left;
  11.   margin: 0 20px 0 0;
  12. }
  13. #files {
  14.   clear:both;
  15. }

Veja que no #inputFile definimos opacity, para funciona no Firefox e um filter para ficar transparente no IE. O #files veremos pra que serve daqui a pouco.

Fazendo a mágica acontecer com javascript

Utilizei a jQuery por pura comodidade, mas poderia facilmente ser feito na mão. Na verdade para enviar um arquivo precisariamos do javascript apenas para exibir o nome do arquivo em algum lugar. Mas como queremos fazer o upload de vários arquivos:

JavaScript:
  1. var InputCount=1;
  2. $(function() {
  3. $("#UploadForm").append("&lt;ul id='files'&gt;&lt;/ul&gt;");
  4. $("#inputFile").change( function() { newFile(); } );
  5. });
  6. function newFile() {
  7. $("#files").append("&lt;li&gt;" + $("#inputFile").val() + "&lt;/li&gt;");
  8. $("#inputFile").hide();
  9. $("#inputFile").clone().appendTo("#uploadButton");
  10. $("#inputFile").attr("id", "inputFile" + InputCount);
  11. $("#inputFile" + InputCount).attr("name", "inputFile" + InputCount);
  12. InputCount++;
  13. $("#inputFile").change( function() { newFile(); } );
  14. $("#inputFile").val("");
  15. $("#inputFile").show();
  16. }

Para ver tudo funcionando acesse o exemplo.
Para finalizar ainda seria necessário adicionar um botão de submit e tratar o retorno no servidor. Porém isso não será tratado aqui!

Após escrever todo o exemplo e o artigo, resolvi testar no IE6 (o que devia ter sido feito antes) e percebi que não funcionava o filtro da opacidade, apesar de tudo dar certo no IE 5 e no IE 7. Estou com o tempo curto e se você descobrir como resolver, poste um comentário.