Simplificando a linha de comando - Symfony Alias

Cansei de digitar várias vezes ” ./symfony …” e faço muito isso, então resolvi dar uma otimizada, vamos lá, primeiro um aliás para o symfony, executando ele de qualquer diretório.

Crie o arquivo /usr/local/bin/sf

while [ 1 ]; do
    if [ -f 'symfony' ]; then

        ./symfony $*
        exit $?
    fi

    cd ..
    if [ "$PWD" = "/" ]; then

        echo ‘cannot find symfony project directory’
        exit 1

    fi
done

Há um comando parecido no symfony snippets, mas eu tive que alterar uma linha pra funcionar aqui.

Depois você pode trabalhar com alias, a vontade, eu criei a opção abaixo, por exemplo:

alias sf-restart='sf doctrine:build-all-load --no-confirmation; sf cc '

Aí é só usar o sf-restart para economizar linhas de digitação =)

O padrão para criar aliás é o abaixo.

no prompt digite:
alias cds='cd /etc/rc.d/init.d ; ls'

ou seja: alias apelido='comando ; comando2 ; comando3'

Symfony Automágico!!!

Estou apaixonado pelo desenvolvimento com symfony. Tenho trabalhado muito e estudado muito nas horas vagas pra poder me manter atualizado. Claro que na minha profissão o diferencial é ser o melhor, não há meio termo. Se eu paro uma tarde, alguém está estudando e estará melhor preparado lá na frente.

Trabalhar com symfony é gratificante, pela redução de tempo de serviço e por seus recursos automágicos.

Você pode utilizar os comandos mágicos findBy*() e findOneBy()

$user = Doctrine::getTable(‘User’)->findOneByUsername(‘jwage’);
$users = Doctrine::getTable(‘User’)->findByIsActive(1);

Mágico, não?!

Mais informações: http://www.symfony-project.org/doctrine/1_2/en/06-Working-With-Data#chapter_06_sub_finders

Validação externa de Cartão de Crédito - Symfony

Validar em symfony é fácil. Mas as vezes precisa dar uma “personalizada” na validação. Hoje vamos falar sober isso.

Estou trabalhando em um projeto excelente. Meu cliente me deu total liberdade pra programar. Isso é bom, mas traz uma grande responsabilidade também. Resumindo, estou me esforçando ao máximo pra fazer uma ótima programação, Orientada a Objeto, quando vejo que podia ter feito algo melhor, volto, corrijo, etc.

Está sendo assim com a validação de cartão de crédito. Peguei uma excelente classe feita por John Gardner lááá em 2005. Personalizei ela, alterei umas coisas, e estou usando no symfony. Mágica e bilingue! =)

Primeiro, no SomethingForm.class.php eu faço duas coisinhas

Na função configure(), eu insiro

// add a post validator
$this->validatorSchema->setPostValidator(
new sfValidatorCallback(array('callback' => array($this, 'checkCreditCard')))
);

E a função checkCreditCard() abaixo:

    public function checkCreditCard($validator, $values)
    {
        if ($values['numero'])
        {
            $oCreditCard = new myCreditCardValidator($values);
            $sError = $oCreditCard->execute($values['tipo'], $values['numero'], ‘pt_BR’);

            if ($sError != 1){
                // Create the error object
                $sfError = new sfValidatorError($validator, $sError);
                // throw an error bound to the number field
                throw new sfValidatorErrorSchema($validator, array(’numero’ => $sfError));
            }
            return $values;
        }
    }

A classe segue abaixo

<?php

/**
 * This class has been converted to a Symfony Validator from original code
 * created by John Gardner, 4th January 2005.
 * http://www.braemoor.co.uk/software/index.shtml
 *
 * Symfony conversion by Fellipe Brito, Lado Direito Solucoes, 2009
 * http://www.ladodireito.com
 *
 **/

class myCreditCardValidator
{
    static protected $CARDS = array (
    array ('name'           => 'American Express',
    'length'            => '15',
    'prefixes'      => '34,37',
    'checkdigit'    => true
    ),
    array ('name'           => 'Carte Blanche',
    'length'         => '14',
    'prefixes'   => '300,301,302,303,304,305,36,38',
    'checkdigit' => true
    ),
    array ('name'       => 'Diners Club',
    'length'         => '14',
    'prefixes'   => '300,301,302,303,304,305,36,38',
    'checkdigit' => true
    ),
    array ('name'       => 'Discover',
    'length'         => '16',
    'prefixes'   => '6011',
    'checkdigit' => true
    ),
    array ('name'       => 'Enroute',
    'length'         => '15',
    'prefixes'   => '2014,2149',
    'checkdigit' => true
    ),
    array ('name'       => 'JCB',
    'length'         => '15,16',
    'prefixes'   => '3,1800,2131',
    'checkdigit' => true
    ),
    array ('name'       => 'Maestro',
    'length'         => '16',
    'prefixes'   => '5020,6',
    'checkdigit' => true
    ),
    array ('name'       => 'MasterCard',
    'length'         => '16',
    'prefixes'   => '51,52,53,54,55',
    'checkdigit' => true
    ),
    array ('name'       => 'Solo',
    'length'         => '16,18,19',
    'prefixes'   => '6334, 6767',
    'checkdigit' => true
    ),
    array ('name'       => 'Switch',
    'length'         => '16,18,19',
    'prefixes'   => '4903,4905,4911,4936,564182,633110,6333,6759',
    'checkdigit' => true
    ),
    array ('name'       => 'Visa',
    'length'         => '13,16',
    'prefixes'   => '4',
    'checkdigit' => true
    ),
    array ('name'       => 'Visa Electron',
    'length'         => '16',
    'prefixes'   => '417500,4917,4913',
    'checkdigit' => true
    )
    );

    static protected $ERRORS = array(
    "en" => array(
    "cc_error_type" => 'Unknown card type',
    "cc_error_missing" => 'No card number provided',
    "cc_error_format" => 'Credit card number has invalid format',
    "cc_error_number" => 'Credit card number is invalid',
    "cc_error_length" => 'Credit card number is wrong length'
    ),
    "pt_BR" => array(
    "cc_error_type" => 'Tipo de cartão desconhecido',
    "cc_error_missing" => 'Nenhum número de cartão informado',
    "cc_error_format" => 'Este número tem um formato inválido',
    "cc_error_number" => 'Este número é inválido',
    "cc_error_length" => 'Este número não tem um tamanho correto'
    )
    );

    public function execute(&$cardName, &$cardNumber, $sCulture)
    {
        // Establish card type
        $cardType = -1;
        for ($i=0; $i<sizeof(self::$CARDS); $i++)
        {   // See if it is this card (ignoring the case of the string)
            if (strtolower($cardName) == strtolower(self::$CARDS[$i]['name']))
            {
                $cardType = $i;
                break;
            }
        }

        // If card type not found, report an error
        if ($cardType == -1)
        {
            $error = self::$ERRORS[$sCulture]['cc_error_type'];
            return $error;
        }

        // Ensure that the user has provided a credit card number
        if (strlen($cardNumber) == 0)
        {
            $error = self::$ERRORS[$sCulture]['cc_error_missing'];
            return $error;
        }

        // Remove any non-digits   from the credit card number
        $cardNo = preg_replace(’/[^0-9]/’, ”, $cardNumber);

        // Check that the number is numeric and of the right sort of length.
        if (!eregi(’^[0-9]{13,19}$’,$cardNo))
        {
            $error = self::$ERRORS[$sCulture]['cc_error_format'];
            return $error;
        }

        // Now check the modulus 10 check digit - if required
        if (self::$CARDS[$cardType]['checkdigit'])
        {
            $checksum = 0;   // running checksum total
            $mychar = “”;    // next char to process
            $j = 1;          // takes value of 1 or 2

            // Process each digit one by one starting at the right
            for ($i = strlen($cardNo) - 1; $i >= 0; $i–)
            {
                // Extract the next digit and multiply by 1 or 2 on alternative digits.
                $calc = $cardNo{$i} * $j;

                // If the result is in two digits add 1 to the checksum total
                if ($calc > 9) {
                    $checksum = $checksum + 1;
                    $calc = $calc - 10;
                }

                // Add the units element to the checksum total
                $checksum = $checksum + $calc;

                // Switch the value of j
                if ($j ==1) {$j = 2;} else {$j = 1;};
            }

            // All done - if checksum is divisible by 10, it is a valid modulus 10.
            // If not, report an error.
            if ($checksum % 10 != 0)
            {
                $error = self::$ERRORS[$sCulture]['cc_error_number'];
                return $error;
            }
        }

        // The following are the card-specific checks we undertake.

        // Load an array with the valid prefixes for this card
        $prefix = split(’,',self::$CARDS[$cardType]['prefixes']);

        // Now see if any of them match what we have in the card number
        $prefixValid = false;
        for ($i=0; $i<sizeof($prefix); $i++)
        {
            $exp = ‘^’ . $prefix[$i];
            if (ereg($exp,$cardNo))
            {
                $prefixValid = true;
                break;
            }
        }

        // If it isn’t a valid prefix there’s no point at looking at the length
        if (!$prefixValid)
        {
            $error = self::$ERRORS[$sCulture]['cc_error_number'];
            return $error;
        }

        // See if the length is valid for this card
        $lengthValid = false;
        $lengths = split(’,',self::$CARDS[$cardType]['length']);
        for ($j=0; $j<sizeof($lengths); $j++)
        {
            if (strlen($cardNo) == $lengths[$j])
            {
                $lengthValid = true;
                break;
            }
        }

        // See if all is OK by seeing if the length was valid.
        if (!$lengthValid)
        {
            $error = self::$ERRORS[$sCulture]['cc_error_length'];
            return $error;
        };

        // The credit card is in the required format.
        return true;
    }
}

2009 - Segundo Semestre

Tô sumido, não?

Pois é, 2009 começou ótimo, e tomei uma porrada no começo de junho que foi dificil de aguentar.

Bem, o xororo, demorou 40 minutos, e em uma semana eu já estava de pé e com bons e novos contratos fechados. Projetos grandes, e parcerias que eu espero (e preciso), durem mais que um ou dois meses.

Queria agradecer a todo mundo que deu uma força, e ao pessoal que aceitou contratar os serviços prestados pela empresa Lado Direito Soluções ou diretamente o meu serviço.

Vou agradecer só os nomes, sem sobrenomes, pra realmente preservar cada pessoa, mas mesmo assim eles saberão que estão sendo citados.

Valeu, Joana, Ana, Tony, Madalena, Francisco, Rafael, Cesar, Lorena, Felipe, Thaissa e tantos outros. Estamos de novo no ar, e com tudo.

O Segundo semestre será melhor do que o primeiro, pode apostar!

Symfony Helper -> format_date, como usar.

Esta é uma coisinha do Symfony em sfDateFormat::getPattern().

Você pode usar isso, de acordo com o seguinte exemplo:

<?php echo format_date($blog_post->getCreatedAt(), "D“) ?>

O D é uma pré-formatação do symfony, abaixo esta a lista de outras opções de pré formatações.

switch ($pattern)
    {
      case 'd':
        return $this->formatInfo->ShortDatePattern;
        break;
      case 'D':
        return $this->formatInfo->LongDatePattern;
        break;
      case 'p':
        return $this->formatInfo->MediumDatePattern;
        break;
      case 'P':
        return $this->formatInfo->FullDatePattern;
        break;
      case 't':
        return $this->formatInfo->ShortTimePattern;
        break;
      case 'T':
        return $this->formatInfo->LongTimePattern;
        break;
      case 'q':
        return $this->formatInfo->MediumTimePattern;
        break;
      case 'Q':
        return $this->formatInfo->FullTimePattern;
        break;
      case 'f':
        return $this->formatInfo->formatDateTime($this->formatInfo->LongDatePattern, $this->formatInfo->ShortTimePattern);
        break;
      case 'F':
        return $this->formatInfo->formatDateTime($this->formatInfo->LongDatePattern, $this->formatInfo->LongTimePattern);
        break;
      case 'g':
        return $this->formatInfo->formatDateTime($this->formatInfo->ShortDatePattern, $this->formatInfo->ShortTimePattern);
        break;
      case 'G':
        return $this->formatInfo->formatDateTime($this->formatInfo->ShortDatePattern, $this->formatInfo->LongTimePattern);
        break;
      case 'i':
        return 'yyyy-MM-dd';
        break;
      case 'I':
        return 'yyyy-MM-dd HH:mm:ss';
        break;
      case 'M':
      case 'm':
        return 'MMMM dd';
        break;
      case 'R':
      case 'r':
        return 'EEE, dd MMM yyyy HH:mm:ss';
        break;
      case 's':
        return 'yyyy-MM-ddTHH:mm:ss';
        break;
      case 'u':
        return 'yyyy-MM-dd HH:mm:ss z';
        break;
      case 'U':
        return 'EEEE dd MMMM yyyy HH:mm:ss';
        break;
      case 'Y':
      case 'y':
        return 'yyyy MMMM';
        break;
      default :
        return $pattern;
    }

Isso é realmente muito útil!

O meu muito obrigado!

Hoje foi meu aniversário, e a melhor maneira de passar este dia, é agradecer as pessoas que são importantes pra mim. Na nossa vida, conhecemos algumas pessoas e vivemos com menos ainda. O meu muito obrigado a estas pessoas.

Fabio e Debora
Eu passei dois anos sem jogar uma bolinha, com saudade da grama, da bola, do gol, e de alguém em quem eu pudesse passar a bola por baixo das pernas com certa, hmmm, facilidade. Fábio foi este amigo (kkkkkk). Cara, obrigado pela amizade, amizade não se mede por tempo, se mede por qualidade, afinidades. Obrigado mesmo, por estar aqui, isso significa que você é importante pra mim, e que meu convite foi importante pra você.

Cris
A Cris acompanhou o meu crescimento, me conhece desde os 17. E mesmo que meio de “longe”, sempre esteve perto, vendo nossas aventuras, conquistas, obrigado Cris, de coração, por amar Joana, e por me adotar como sobrinho também.

Guilherme e Debora
Vocês são amigos, são irmãos, pessoas que amamos e desejamos toda felicidade do mundo. Por vezes eu falo com Joana que nossa amizade é muito engraçada. Somos um tantão diferentes, temos gostos diferentes, agendas diferentes, mas é só sentarmos juntos que tudo isso parece que “some”. Sou muito orgulhoso de ter sido padrinho do casamento de vocês, por estarmos iniciando nossas vidas quase juntos, espero de coração que estejamos juntos sempre, afinal, tenho certeza que meu filho vai paquerar as loirinhas que aparecerem. Gui, cara, nunca vou esquecer do que rolou com aquele líder da igreja na sua casa. Sua atitude foi uma atitude que pessoas que estiveram do meu lado por anos não tiveram, e você provou, não só sua amizade, como também seu caráter.

Vilson Daí Tate e Pexe
Professores e amigos. Foram tantas coincidências desde que decidi surfar que eu não ouso não acreditar que Deus não tenha feito isso. Deus colocou vocês em nosso caminho. Obrigado pela paciência, pelo carinho por minha esposa, e pelas boas horas de surf. Vocês são meus amigos.

Kassya e Camilla
Eu amo vocês, sinto muita falta de vocês, gostaria muito de ter vocês mais perto, como era antes. Vocês são importantes pra mim, a felicidade de vocês é importante pra mim. Desejo de todo o coração que vocês sejam tão felizes quanto eu, que tenham saúde, dinheiro e façam lindos sobrinhos pra eu levar pra surfar. O segredo dessa vida meninas é não esquecer de onde viemos, nem o que aprendemos quando criança. Aproveito pra convidá-las, na frente de todos, venham mais na minha casa, participem mais da nossa vida, eu vou adorar!

Diego e Everton
De verdade? Sobre vocês dois eu não tenho palavras pra falar. Eu sinto tanta, mas tanta falta de vocês que não sei nem o que falar. Amo vocês, de coração. Vocês não são amigos, são irmãos.

Madalena
Se o Faustão conhecesse você ia se arrepender do que fala sobre as sogras. Madalena, você, depois de Joana, é minha maior conquista. Foi um desafio, e uma chance de eu me afirmar como homem. Hoje, 8 anos depois de pedir a sua filha em casamento, no dia 8 de maio, na sua casa, ensopado de chuva, sem um centavo no bolso, você pode ver, eu cumpri a promessa. Eu falei, não vim aqui pedir ela em namoro, vim aqui falar pra voe que nós vamos nos casar. Hoje Mada, vc não é mais minha sogra, você é minha segunda mãe, uma amiga. Espero de todo coração ser um bom genro, fazer sua filha feliz, e de você uma Sogra/Avó realizada.

Mãe
Mãe, você é uma pessoa forte. Seus ensinamentos me trouxeram até aqui. Não há uma semana que eu passe sem lembrar de algo que você me faloua mais de 15 anos atrás e que até hoje dirige meus passos. Obrigado por ter me ensinado o caminho certo, obrigado por ter me amado, obrigado pela vida, por me educar, obrigado mãe, eu te amo.

Pai
Pai, você é o homem que eu conheço melhor as falhas no mundo. Você só perde pra mim mesmo, porque eu passo mais tempo comigo do que com você. Então se tem duas pessoas na terra que eu conheço todas as falhas de cor, estas são Eu e você. Nós dois somos muito parecidos pai, e você é um espelho pra mim, desde que sou garoto. Talvez você não saiba onde, mas você é o reflexo que eu quero ser em muitas áreas. Obrigado pai, obrigado por ter voltado pra casa, obrigado por ter enfrentado sua própria vergonha pra estar perto da gente. Obrigado por saber pedir perdão. Obrigado por este coração de manteiga que você tem. Obrigado pelas horas de vídeo game, pelo tempo dedicado a ficar comigo. Você é o homem da minha vida.

Joana
Você é tudo que tenho nesta vida, é minha parceira, minha amiga, minha mulher. Eu queria dizer hoje, na frente de todos, que nunca imaginei que seria tão feliz quanto sou. Você é minha alegria, a alegria desta casa. Você enfeita minha vida, me dá paz, me ajuda a sonhar. Você é a melhor esposa que eu poderia ter. Você é muito mais valiosa do que todo o ouro do mundo. Não trocaria você por nada. Eu te amo, obrigado por me ensinar  a comemorar meu aniversário Te amo!

Zend Studio Com Subversion no Windows Vista

Depois de enfrentar alguns problemas com o Subversion pela “linha de comando” no linux. Resolvi tentar usar o plugin do Zend Studio, tudo muito fácil, até que o Windows Vista resolveu me ferrar. Bem, aqui vai uma dica, se você estiver enfrentando problemas no Zend Studio Com Subversion no Windows Vista, abra o ZendStudio como Administrador.

O problema que ocorria pra mim era: svn: Can’t determine the system config path

Boa Sorte, e uma ótima Sexta Feira!

Muito Trabalho

Estou realmente extremamente atarefado. Tenho uma TODO list gigante, muita coisa pra estudar, e pouquíssimo tempo. Nisso, você pode incluir um ou dois clientes caloteiros (normal na minha área, NORMAL!?!?, pois é, isso é comum, gente que usa e não paga, muito me chateia, tempo nem sempre é dinheiro, as vezes seu tempo é jogado no lixo). Um mês sem surfar, um semestre sem jogar bola, pois é, realmente estas semanas estão sendo impossíveis.

Tempo? Lost? Estudar inglês, não, só trabalho, trabalho, trabalho…

Prometo assim que as coisas acalmarem postar coisas interessantes sobre Symfony, estou aprendendo muito e posso dizer, Symfony X Cakephp?!? Symfony na veia, e como não sou adepto do Rails, fico ainda mais com Symfony.

Espero que o novo layout, baixado e instalado em cinco minutos, sejam aprovados pelos leitores…

Symfony Helpers

O framework symfony, a exemplo do Ruby on Rails, incorpora uma série facilidades para agilizar o desenvolvimento de aplicações web. Uma delas, utilizada especialmente na camada de visão, são os helpers, formados por funções PHP que retornam código HTML e podem ser chamados nos templates através do comando use_helper().

O symfony contém vários helpers para facilitar o processo da construção dos templates. Alguns são intrínsecos, como o helper para a criação dos elementos de um formulário, disponibilizados por default para todos os templates e outros podem ser chamados conforme a conveniência, como, por exemplo, os helpers para internacionalização (i18n), chamada de objetos do banco de dados (object) e funções ajax (javascript).

Helpers disponíveis por default (standard helpers)

  • Asset - ajuda na definição da seção <head> além de fornecer chamada fácil para links externos (imagens, JavaScript e arquivos de folha de estilo - CSS)
  • Cache - manipulação de cache
  • Form - elementos de formulários
  • Helper - requerido para inclusão de um helper
  • Partial - permite incluir fragmentos de templates
  • Tag - tags básicas
  • Url - gerenciamento de links and URLs

Helpers que precisam ser declarados nos templates

  • DateForm - série de funções para exibição de elementos com datas em formulários
  • Date - formatar datas
  • Escaping - escape de caracteres
  • I18N - internacionalização
  • Javascript - funções javascript, ajax
  • Number - formatação de números
  • ObjectAdmin - objetos para o admin generator
  • Object - objetos do banco de dados
  • sfRichTextEditor - Rich Text Editor
  • sfRichTextEditorFCK - Rich Text Editor FCK
  • sfRichTextEditorTinyMCE - Rich Text Editor TinyMCE
  • Text - funções relativas ao manuseio de textos
  • Validation - validação de dados de um form

Para utilizar um helper não default, basta fazer sua chamada através da função use_helper no início do template:

<?php echo use_helper('NomeDoHelper') ?>

Helpers e Actions

É possível usar as funções de um helper dentro de uma ação (action) com o loadHelpers

sfLoader::loadHelpers($helpers)

onde a variável $helpers é o nome de um helper ou um array com os nomes de vários helpers.

Criando um helper (custom helpers)

Caso possuir pedaços de código que são freqüentemente utilizados em templates e não existem nos helpers do symfony é possível criar o seu próprio helper, o que, aliás, é uma tarefa extremamente simples. Os passos são os seguintes:

  1. escrever um arquivo PHP com o conjunto de funções do helper, salvando com o nome FooBarHelper.php, onde FooBar é o nome do helper
  2. gravar o arquivo FooBarHelper.php no diretório apps/myapp/lib/helper/ ou em qualquer diretório /helper criado dentro de um diretório /lib do projeto

Agora é só utilizar seu helper em qualquer template incluindo:

<?php echo use_helper('FooBar') ?>

créditos na ajuda para Andreia Boner

Div sobre um flash! Uma das melecas que nos incomodam…

Hoje precisei fazer algo simples…. colocar uma div sobre o site inteiro para anunciar algo. Simples até que descobri que a base do site tinha flash, e a div não sobrescrevia o maldito flash… bem após o problema resolvido, nada melhor do que publicar online o que achei.

Adicione este parametro ao objeto do flash:

<param name=”wmode” value=”transparent”></param>

E este ao embed:

wmode=”transparent”

Molezinha não???

Ahhh, estou precisando urgentemente fazer este blog funcionar em espanhol e em inglês, someone can help me? Alguna persona puede ayudarme? Um plugin já deve ajudar, mas ainda não achei algo “usável”…

Um abração, e boas ondas…