Esse blog mudou para: http://gustavopaes.net/blog/
Trabalhando com arquivos no PHP
A maioria dos programadores trabalham com banco de dados mas há certos casos em que trabalhar diretamente com arquivos é a forma mais rápida e produtiva.
Entretanto é preciso tomar alguns cuidados como por exemplo não esquecer de usar o fclose(). O PHP tem duas funções que fazem um bom trabalho: file_get_contents() e file_put_contents().
Veja mais nesse artigo: Trabalhando com arquivos no PHP
Métodos encadeados em PHP
O termo métodos encadeados é usado quando você chama um método após o outro sem a necessidade da variável de instância do objeto.
Espero um dia conseguir seguir os caminhos dele: trabalhar apenas com back-end.
De fato, a única forma de se testar com 100% de garantia no IE6 é usando uma máquina virtual ou usando um ambiente real: computador antigo, windows XP sem os Service Pack da vida, nem com atualização automática ativada e, se possível, apenas com conexão discada.
As outras, citadas no vídeo, são furada. Pelo menos uma forma de debug do Javascript, para todos os Internet Explorers: Internet Explorer Developer Tools. Não é excelente, mas é melhor que nada.
Pegando o subtotal do carrinho no Magento
Depois de muita procura no Google achei como se pega o subtotal do carrinho da sessão atual no Magento.
Precisava dessa informação para passar na URL da API dos Correios, para calcular o custo de envio com o valor do produto declarado.
Mage::helper('checkout/cart')->getQuote()->collectTotals()->getSubtotal();
Executando código PHP em arquivos HTML
Para permitir isso é preciso criar um arquivo .htaccess e adicionar o código:
AddType application/x-httpd-php .html
Sua hospedagem deve ser em ambiente linux/unix.
Criando log das execuções de seu cron
Estou realizando um projeto onde a execução de alguns scripts a cada 5 minutos é fundamental. Caso alguma falha ocorra durante execução, conteúdos podem ser perdidos e, para achar o erro, sem um bom log, fica complicado.
A solução que usei para isso foi criar um arquivo shell — o servidor é linux — que executa o script php e armazena a saída em um arquivo de log.
Dessa forma não preciso, no próprio script php, ficar abrindo arquivos (fopen), escrevendo (fwrite) e me preocupando em fechá-los (fclose) assim que finalizar a execução, até porque é uma execução que pode ser finalizada em vários pontos.
O script shell ficou parecido com isso:
#!/bin/sh
BARRA="-------------------------------------\n";
START="`date +%Y-%m-%d\ %R:%S`";
YEARMONTHDAY="`date +%Y-%m-%d`";
# Configs
PHP_LOCAL="/usr/local/bin/php"
CRON_FILE="/home/usuario/public_html/projeto/cron/cron.php"
LOG_FILE="/home/usuario/public_html/projeto/var/cron_$YEARMONTHDAY.log";
$PHP_LOCAL $CRON_FILE >> $LOG_FILE
O arquivo cron.php contém o script que você deve executar. Lá você deve descrever cada atividade que está sendo realizada, imprimindo na tela com o echo do próprio php. Lembre-se que as quebras de linha devem ser com \n e não o br do HTML.
Agora, ao invés de colocar no cron do seu servidor o cron.php, você coloca esse arquivo.sh que você criou.
Sempre que o script for executado, um arquivo de log será criado com a saída do script executado. Se o arquivo de log para aquele dia já existe, ele irá concatenar as saídas, ou seja, você terá o log de todas as execuções.
Segurança
Para evitar que consigam ver esse seu arquivo e possam usá-lo para alguma ação indesejada, proíba que ele seja exibido. Para isso, crie um arquivo .htaccess, se não existir, com o seguinte conteúdo:
<Files *.sh>
Order Deny,Allow
Deny from all
</Files>
Dicas
Para descobrir onde o php está em seu servidor, no SSH, digite: whereis php.
Já para descobrir qual o path completo até o seu sistema, digite: pwd.
Simulando a variável flash do Rails no PHP
Quem programa em Ruby on Rails sabe do que estou falando. A variável flash permite armazenar mensagens durante apenas uma mudança de página. Excelente para avisos e alertas.
O PHP não tem uma variável desse tipo. Uma das soluções usadas é passar um código da mensagem o erro através da url e na página fazer um switch ou if. Mas essa solução é muito trabalhosa.
Uma outra solução, que se aproxima mais da do Rails é criar uma função que armazena a mensagem em uma sessão e, depois de exibir, limpa os valores. O código é esse:
function flash($var, $value = null)
{
if( ! isset($value) )
{
$val = $_SESSION[$var];
unset($_SESSION[$var]);
return $val;
}
else
$_SESSION[$var] = $value;
}
function notice()
{
if( isset($_SESSION["type"]) )
{
echo '<div id="notice" class="aviso ' .flash("type") . '">';
echo ' <p>'.flash("message").'</p>';
echo '</div>';
}
}
A função notice é apenas para mostrar as mensagens.
O uso seria mais ou menos assim:
[...]
// Houve sucesso na ação
if( $acao )
{
flash("type", "success");
flash("message", "A ação foi executada com sucesso");
}
else
{
flash("type", "success");
flash("message", "A ação foi executada com sucesso");
}
header("location: index.php");
[...]
No index.php só é preciso chamar a função notice(). Estou usando essa solução em um projeto e está sendo bem mais fácil do que o envio de mensagens por código através da url.
Importante: é preciso que todas as páginas tenham o session_start().
Ruby para programadores PHP
Pode ser útil para outros programadores PHP, como eu, que querem aprender Ruby, como eu. Pelo pouco que puder ver no curso de Ruby on Rails e no livro “The Ruby Way”, é divertido programar em Ruby. Bem divertido.