Smarty e o problema (bug) com objetos aninhados (nested)

setembro 20, 2008 – 10:04 pm

Comecei a poucos dias a utilizar o Smarty. Ele é um conjunto de classes que separa o papel do designer e do programador em duas partes distintas de forma fácil e segura.

A versão utilizada é a 2.6.20.

Encontrei um problema quando precisei trabalhar com objetos aninhados (quando um objeto é referenciado por outro). Quando utilizo no template o código abaixo, o Smarty compila corretamente. Linha de código no meu template:

{$pessoaOBJ->getNome()}

Mas quando resolvia ter uma informação sobre um objeto aninhado não dava muito certo. Veja o exemplo:

{$pessoaOBJ->getMae()->getNome()}

Resultado: não compilou.

Procurei (procurei, procurei…) e encontrei a solução. É uma correção em uma linha de código do arquivo Smarty_Compiler.class.php. Abra o arquivo em um editor de texto qualquer e basta procurar por perto da linha 164. O código a alterar é:

$this->_obj_call_regexp = ‘(?:’ . $this->_obj_start_regexp . ‘(?:’ . $this->_obj_params_regexp . ‘)?(?:’ . $this->_dvar_math_regexp . ‘(?:’ . $this->_num_const_regexp . ‘|’ . $this->_dvar_math_var_regexp . ‘)*)?)’;

Basta comentá-lo. E adicionar o código na linha seguinte:

$this->_obj_call_regexp = ‘(?:’ . $this->_obj_start_regexp . ‘(?:’ . $this->_obj_params_regexp . ” . ‘(?:’ . $this->_obj_ext_regexp . $this->_obj_params_regexp . ‘)*’ . ‘)?(?:’ . $this->_dvar_math_regexp . ‘(?:’ . $this->_num_const_regexp . ‘|’ . $this->_dvar_math_var_regexp . ‘)*)?)’;

Então para não haver confusão:
Antes:

$this->_obj_call_regexp = ‘(?:’ . $this->_obj_start_regexp . ‘(?:’ . $this->_obj_params_regexp . ‘)?(?:’ . $this->_dvar_math_regexp . ‘(?:’ . $this->_num_const_regexp . ‘|’ . $this->_dvar_math_var_regexp . ‘)*)?)’;

Depois:

// $this->_obj_call_regexp = ‘(?:’ . $this->_obj_start_regexp . ‘(?:’ . $this->_obj_params_regexp . ‘)?(?:’ . $this->_dvar_math_regexp . ‘(?:’ . $this->_num_const_regexp . ‘|’ . $this->_dvar_math_var_regexp . ‘)*)?)’;
$this->_obj_call_regexp = ‘(?:’ . $this->_obj_start_regexp . ‘(?:’ . $this->_obj_params_regexp . ” . ‘(?:’ . $this->_obj_ext_regexp . $this->_obj_params_regexp . ‘)*’ . ‘)?(?:’ . $this->_dvar_math_regexp . ‘(?:’ . $this->_num_const_regexp . ‘|’ . $this->_dvar_math_var_regexp . ‘)*)?)’;

Então espero que tenha ficado bem explicadinho. Qualquer coisa confira o site que achei a solução (http://php-common.palepurple.co.uk/index.cgi/changeset/266)Quero que se existir qualquer dúvida adicione um comentário ou envie-me um email diretamente. Prefiro que mande email, estou com um problemão de SPAM aqui no blog =( e não quero apagar comentários legítimos.

Um abraço!

Compartilhe: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • Live
  • NewsVine
  • Rec6
  • Reddit
  • Spurl
  • StumbleUpon
  • Technorati
  • YahooMyWeb

Formatando datas no MySQL

junho 24, 2008 – 9:04 am

A formatação de datas com date_format é muito gratificante pela sua facilidade e praticidade de uso. Particularmente, uso esta função sempre que preciso formatar datas vindas do banco de dados MySQL.

date_format(sua_data,formatação)

Formatar para Dia/Mes/Ano (24/06/2008)

–Pega data do servidor MySQL
select date_format(now(),’%d/%m/%Y’);
–Pega data de um campo de tabela
select date_format(meu_campo_data,’%d/%m/%Y’) as data_formatada from minha_tabela;

Trouxe apenas este formato por ser o mais comum no Brasil, mas existem vários especificadores de formato de data no MySQL.

Na tabela a seguir seguem outros especificadores:

Especificador Descrição
%M Nome do Mês (January..December)
%c Mês, numérico (0..12)
%H Hora (00..23)
%h Hora (01..12)
%i Minutos, numérico (00..59)
%k Hora (0..23)
%l Hora (1..12)
%m Mês, numérico (00..12)
%S Segundos (00..59)
%s Segundos (00..59)
%T Tempo, 24-horas (hh:mm:ss)
%W Nome do dia da semana(Sunday..Saturday)
%Y Ano, numérico, quatro dígitos
%y Ano, numérico (dois dígitos)

A tabela acima pode ser vista na íntegra no site da MySQL (http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_date-format).

A formatação das datas é feita diretamente no banco de dados, por isso pode ser utilizada na linguagem de programação que preferir.

Abraços!

Compartilhe: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • Live
  • NewsVine
  • Rec6
  • Reddit
  • Spurl
  • StumbleUpon
  • Technorati
  • YahooMyWeb

Satisfação aos leitores

abril 25, 2008 – 1:21 am

Peço desculpas para quem procura algo novo ou complementos dos artigos que publico. Infelizmente estou muito atarefado no momento e não tenho tempo e o pó de guaraná não está surtindo muito efeito (positivo). As costas tortas, os pés inchados, os olhos vermelhos e secos com ardência.

Putz! Com esses 3 minutos eu podia ter tomado um café. Mentira, foram 5 minutos pra escrever isso.

Compartilhe: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • Live
  • NewsVine
  • Rec6
  • Reddit
  • Spurl
  • StumbleUpon
  • Technorati
  • YahooMyWeb

Notícias que ninguém quer saber

abril 19, 2008 – 1:23 pm

É com orgulho que comunico a publicação do meu artigo Criando Imagens com PHP - Parte 1 no site CriarWeb. É um artigo simples e prático, do tipo “copie e cole o exemplo”. Vale a pena conferir.

Acesse: http://www.criarweb.com/artigos/criando-imagens-com-php.html

Abraços
JONAS RUTH - WEBDEV

Compartilhe: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • Live
  • NewsVine
  • Rec6
  • Reddit
  • Spurl
  • StumbleUpon
  • Technorati
  • YahooMyWeb

Friendly-Fire

abril 6, 2008 – 3:18 pm

Cada coisa que me acontece por causa do Windows. Normalmente isso me acontece só nos momentos de diversão com Counter-Strike…

O Windows matando o Windows Explorer pq ele é “Periogoso” pra mim. Agora que o windows descobriu isso? Eu já sabia…

Fogo-Amigo

Compartilhe: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • Live
  • NewsVine
  • Rec6
  • Reddit
  • Spurl
  • StumbleUpon
  • Technorati
  • YahooMyWeb

Criando Imagens com PHP - Parte 1

abril 1, 2008 – 12:19 am

Isso é sério?

Sim, é possível criar imagens com apenas o PHP. Basta ter a biblioteca GD instalada no PHP do seu servidor. Pode-se fazer coisas incríveis utilizando as funções que a biblioteca GD disponibiliza. Uma delas é aquele sistema típico de imagem de verificação em formulários.

Iniciando

O código que apresento é o pontapé inicial para nosso desenvolvimento:

<?php
//diz ao servidor que isto é do tipo mime image/gif
header("Content-type:image/gif");
// cria uma imagem com 200 de largura e 200 de altura
$img = imagecreate(200,200);
//deixo o fundo com a cor azul
$azul = imagecolorallocate($img,0,0,255);
//faço a imagem ser impressa em vídeo
imagegif($img);
//retiro a imagem da memoria
imagedestroy($img);
?>

O resultado é uma imagem inteira azul. Ver exemplo aqui.

Inserindo Texto na Imagem

<?php
header("Content-type:image/gif");
$img = imagecreate(200,200);
$azul = imagecolorallocate($img,0,0,255);
//defino algumas outras cores
$branco = imagecolorallocate($img,255,255,255);
$verde = imagecolorallocate($img,0,255,0);
//escrevendo www.JONASRUTH.com.br em branco
//IMPORTANTE: Neste exemplo copie o arquivo de fonte para a mesma pasta que este arquivo
imagettftext($img,10,0,5,15,$branco,"Arial.ttf","www.JONASRUTH.com.br");
//isso também funcionaria, mas agora em verde!
$meuTexto = "www.JONASRUTH.com.br";
imagettftext($img,10,0,5,40,$verde,"Arial.ttf",$meuTexto);
imagegif($img);
imagedestroy($img);
?>

Agora o resultado é a uma imagem com textos. Ver exemplo aqui.

Para criar imagens JPEG basta alterar o header(”Content-type:image/gif”) para header(”Content-type:image/jpeg”) e o imagegif($img) para imagejpeg($img);

Testando

Para testar este exercício adicione esta imagem a uma pagina HTML assim: <img src="http://www.seuservidor.com.br/criando-imagens-com-php.php" />. Ou diretamente, abrindo o arquivo no seu navegador WEB. Naturalmente o servidor onde o arquivo PHP está necessita ter suporte à linguagem.

Baixe aqui os arquivos-fonte finais.

Caso necessite, no site do PHP (php.net) pode-se encontrar a descrição das funções utilizadas neste tutorial.

Fique atento para a Parte 2 deste artigo. Breve.

E a vida segue. Abraço!
-Jonas Ruth

Compartilhe: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • Live
  • NewsVine
  • Rec6
  • Reddit
  • Spurl
  • StumbleUpon
  • Technorati
  • YahooMyWeb

PHP Orientado a Objetos: Modificadores de Acesso

março 22, 2008 – 10:18 pm

Modificador de Acesso: Define o acesso que as classes tem a um elemento. Esse elemento pode ser uma classe, atributo ou método (função).

Define-se utilizando uma das palavras-chave:

  • public: Acessível por qualquer classe.
  • protected: Acessível por qualquer classe herdeira.
  • private: Acessível somente pela própria classe.

Vamos a um exemplo básico:

class Pessoa{
protected $nome;
public function __construct($nome){
$this->nome = $nome;
}
}
class PessoaFisica extends Pessoa{
private $rg;
private $cpf;
public function __construct($nome,$rg,$cpf){
parent::__construct($nome);
$this->rg = $rg;
$this->cpf = $cpf;
$this->nome = 'xxxx'; //isto é possível pois $nome é acessível por classes herdeiras de Pessoa. (protected)
}
}
class Cidade {
public function __construct(){
$p = new PessoaFisica('João','123456','56874');
$p->cpf = '999999'; //isto não é possível pois cpf tem acesso privado.
}
}

É isso aí
Abraços

-Jonas Ruth

Compartilhe: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • Live
  • NewsVine
  • Rec6
  • Reddit
  • Spurl
  • StumbleUpon
  • Technorati
  • YahooMyWeb

Mudando de assunto no blog

março 17, 2008 – 10:54 pm

Olá pessoas que me visitam… (que silêncio)

É justamente sobre este “(que silêncio)” que vim falar. Vou mudar um pouco o modo de escrever no blog. Estive pensando um pouco e cheguei a conclusão de que as pessoas iniciantes tendem a procurar os grandes portais para tirar suas dúvidas. Sei que mesmo não entendendo tudo o que lêem num grande portal, as atrações que encontram são bem maiores. Claro que vou tentar atender aos pedidos de ajuda sempre.

Então vamos falar mais curto e ir direto ao ponto. Sem explicações muito prolongadas, tratando de ajudar rápido e sem enrolação. Sobre coisas que freqüentemente usamos, mas as vezes surge uma dúvida em algum pequeno detalhe. E o que normalmente fazemos? Vamos ao google. Quero estar lá para ajudar.

Um abraço e vamos para o próximo post.

-Jonas Ruth

Compartilhe: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • Live
  • NewsVine
  • Rec6
  • Reddit
  • Spurl
  • StumbleUpon
  • Technorati
  • YahooMyWeb

Iniciando no Javascript

março 15, 2008 – 12:33 am

Neste tutorial falaremos um pouco sobre Javascript.

O Javascript
Há pouco tempo atrás o Javascript era uma linguagem que tinha muito má fama. Era sub-utilizada pelos “desenvolvedores” da época. Normalmente era aplicada para criar pop-ups insistentes, questionários sem fundamento algum do tipo de “Diga seu nome” e coisas mais que não serviam para nada além de te encher o saco. Desculpa o termo, mas era assim que você falava mesmo. Graças a Deus este tipo de uso tem se extingüido da web e hoje raramente é encontrado um site assim.
O Javascript serve para executar comandos e é interpretado no browser do visitante sem o servidor envolver-se. Com criatividade seu uso pode ser muito satisfatório.

Dica de possíveis problemas:

  • Para que você consiga utilizar o javascript certifique-se de que ele está ativado em seu browser. Normalmente está;
  • Um pequeno erro basta para atrapalhar a execução do código. O javascript diferentemente do PHP não avisa qual foi o erro ocorrido nem onde ocorreu;
  • Existem algumas diferenças de interpretação do código de browser para browser. Normalmente testo meus códigos no Firefox e Internet Explorer 6. Dica: Sempre faça o mesmo em quantos browsers for possível;
  • Por hora é isso.

Iniciando:

Para este tutorial usaremos uma página html padrão como a do post Misturando HTML com PHP.
O código javascript na sua página deve ficar entre <script> e </script>. Na sua página ficaria assim:

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <!--codificação da página-->
<title>Seu titulo</title>
</head>
<script type="text/javascript" language="javascript">
//aqui seu código javascript;
</script>
<body>
<!--aqui fica a parte visivel da sua pagina-->
<? echo "Isto foi escrito via PHP";?>
</body>
</html>

Vamos dar mais um passo, dentro das tag script escreva:

//As frases após as duas barras não influenciam no código. É apenas um comentário feito no código
function somar(valor1,valor2){
var resultado=0; //define a variável resultado inicialmente como zero
resultado = eval(valor1+'+'+valor2); //resultado recebe o valor da soma de valor1+valor2
alert("Resultado da soma é "+resultado); //emite uma mensagem informando o resultado da soma
}

Salve o arquivo e repare em uma coisinha.. Quando somamos usamos ‘+’ para somar os dois números a sua volta, mas quando vamos emitir a mensagem existe um ‘+’ também e não serve para somar. Na primeira ocorrência o ‘+’ é um operador aritmético utilizado para somar e na segunda o ‘+’ tem função de concatenar, quer dizer, juntar uma coisa (string) com outra. O ‘eval’ interpreta uma string onde nela está escrita a expressão aritmética é como se escrevessemos eval(”1 + 1″). O ‘alert’ é a função que emite uma mensagem de alerta na tela.

(continuando…)

A seguir entre as tags body da sua página vamos adicionar dois campos de textos. Os valores adicionados a eles serão atribuídos respectivamente a valor1 e valor2 no código javascript após clicar no botão “Somar” da página. Lembre que o código a seguir fica entre as tags body:

<input type="text" name="valor1">
<input type="text" name="valor2">
<input type="button" value="Somar" onclick="somar(valor1.value,valor2.value);">

Testando:

Para testar você precisa apenas abrir o arquivo no seu browser, digitar os valores numéricos nos dois campos e clicar no botão “Somar”. Se tudo der certo aparecerá para você uma mensagem informando o resultado da soma.

Conseguiu? Um probleminha encontrado..

No Internet Explorer 6 o código funcionou, mas no Firefox não. INCOMPATIBILIDADE!
É um bom motivo para você pesquisar um pouquinho e fazer novos testes assim como estou fazendo.
Acompanhe este post para conferir as atualizações e correções.

Finalizando

Da mesma forma como você somou utilizando o operador ‘+’ você pode efetuar outros tipos de operações seguindo o mesmo formato deste tutorial, como subtração, multiplicação, divisão e mais outras.

Se seu teste não dá certo, se existe erro no meu código ou incompatibilidade entre browsers (Foi testado no Internet Explorer) deixa um comentário, assim como para dúvidas e sugestões.

Um Abraço!
- Jonas Ruth :-)

Pingar o BlogBlogs

Compartilhe: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • Live
  • NewsVine
  • Rec6
  • Reddit
  • Spurl
  • StumbleUpon
  • Technorati
  • YahooMyWeb

Misturando HTML com PHP

março 11, 2008 – 8:45 pm

Vamos partir do princípio que a estrutura de uma página HTML já seja conhecida.
Para todo o caso um exemplo:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <!--codificação da página-->
<title>Seu titulo</title>
</head>
<body>
<!--aqui fica a parte visivel da sua pagina-->
<? echo "Isto foi escrito via PHP";?>
</body>
</html>

Para mesclar HTML e PHP é uma tarefa muito simples e fácil.
Por exemplo se quiser adicionar a data de acesso no título da página é preciso apenas fazer o seguinte:

<title>Seu titulo - <?php echo date("d/m/Y"); ?></title>

Explicando:

  • Todo código PHP deve ser obrigatóriamente iniciado por <?php e finalizado por ?>. Estes símbolos são chamados de delimitadores, que também poderiam ser escritos como <? ?> e teriam a mesma função. O código entre os delimitadores é o qual vai ser interpretado pelo servidor como código PHP.
  • A função echo no título diz para o interpretador escrever a string retornada por date(). A função date() retorna a data do servidor no formato em que é solicitado pela string “d/m/Y” que seria o mesmo que 13/04/2008, por exemplo.
  • No corpo da página (<body></body>) será escrita a frase “Isto foi escrito via PHP”.

Assim como a função date pode lhe retornar a data, muitas outras podem lhe ser de muita utilidade (Use-as com moderação, risos). Basta você checar a lista de funções no site da linguagem PHP (www.php.net).

O seu aprendizado exige muito mais do que eu tento passar. Os manuais em geral não são muito úteis, mas o manual PHP é muito didático, ensina com exemplos e respostas, com a diferença que também pode ser lido em Português do Brasil.

Quero ter sido útil com este post.
Os milhares de comentários são lidos e respondidos, hehe.
Abraço!
- Jonas Ruth

Compartilhe: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • Live
  • NewsVine
  • Rec6
  • Reddit
  • Spurl
  • StumbleUpon
  • Technorati
  • YahooMyWeb