Esse blog mudou para: http://gustavopaes.net/blog/

Friday, October 29, 2010 Friday, April 2, 2010 Thursday, November 26, 2009

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.

Wednesday, November 4, 2009

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();

Fonte: Get the subtotal sales value of current session

Thursday, October 22, 2009

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.

Friday, October 16, 2009

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().

Sunday, September 13, 2009