quinta-feira, 8 de novembro de 2012

Symfony correr task em acção

Geralmente criamos uma task symfony para correr numa cron, mas por vezes pode-nos dar muito jeito correr a task ao clicar num botão ou depois de guardar um objecto, para resolver isso ficam aqui as poucas linhas que necessitam para correr a task:

// In sfActions
chdir(sfConfig::get('sf_root_dir')); // Trick plugin into thinking you are in a project directory
$task = new sfMyVerySpecialTask($this->dispatcher, new sfFormatter());
$task->run(array('argument_name' => 'argument'), array('option_name' => 'option'));

Fonte: link

segunda-feira, 5 de novembro de 2012

Symfony Task error de "default context"

Um erro recorrente em Symfony é o tão conhecido The "default" context does not exist., este erro dá-se quando tentamos aceder às variáveis de context numa Task.

Para resolver é simples, basta colocar a linha seguinte no execute da task.
sfContext::createInstance($this->configuration);

segunda-feira, 29 de outubro de 2012

Limpar versões antigos do Google Chrome

Hoje o meu portátil queixou-se que tinha pouco espaço em disco, pois vem vou ver o que se passa, ligo o DiskWave (podem aproveitar para fazer download, é grátis) e vejo que nas minhas aplicações, o Google Chrome ocupa 2.31GB, o que é mesmo muito para um browser.

Decidi então limpar a casa:

Aplication -> Botão direito no Google Chrome -> Show Package Content (ver conteúdos do pacote) -> Contents -> Versions

E aqui estão elas:

Selecciono todas os directórios (pastas) excepto a mais recente e apago-as.

Ficou tudo a funcionar na perfeição e eu ganhei cerca de 2.2GB, o Chrome passou agora a ocupar um pequenos 122.23 MB.

quinta-feira, 13 de setembro de 2012

Symfony User Filters

Muitas vezes é importante conseguirmos saber os filtros que o utilizador criou para apresentarmos os dados pedidos.

Estes filtros são guardados como atributo do sf_user, para os conseguir obter basta utilizar estas linhas:

$admin_module = $sf_user->getAttributeHolder()->getAll('admin_module');
        $filters = $admin_module['page.filters'];

em que o page é o nome do modulo que estão a editar.


segunda-feira, 10 de setembro de 2012

Download de ficheiro em Symfony

Por vezes esta simples acção pode ser um bocado complicada. Vamos então ver como podemos fazer o download de um ficheiro de forma simples em Symfony.

Criar-mos a acção executeDownload() e, após criar o ficheiro basta colocar estas poucas linhas:

$resp = $this->getResponse();

    $resp->setContentType('text/csv');
    $resp->setHttpHeader(
              'Content-Disposition', 
              'attachment; filename="' . basename($file_path) . '"');
    $resp->setContent(file_get_contents($file_path));

    return sfView::NONE;

segunda-feira, 3 de setembro de 2012

Widgets Template - Row Format

Personalizar os formulários do Symfony pode ser um castigo, a menos que consigamos perceber como funcionam e as coisas tornam-se mais simples.

Até ao dia de hoje, sempre que queria modificar um formulário editava o template e reescrevia o html.

posso fazer o mesmo com apenas estava linha de código no formulário:
$this->widgetSchema
     ->getFormFormatter()
     ->setRowFormat('%label%%field%%help%%hidden_fields%');

Podemos utilizar os seguintes atributos:

%label%
      %field%
      %error%
      %help%
      %hidden_fields%

quarta-feira, 8 de agosto de 2012

Criar um validador personalizado em symfony

Por vezes os Validators disponíveis no Symfony não são sufientes para validar os nossos campos, principalmente quando um campo depende de outro, p.e.:
se cmb_a is cheched e cmb_b is checked

       então

     //acção

       senão

     //erro!

Para tal, necessitamos de criar Validators personalizados e aplica-los ao nosso campo. Para tal na nossa classe de formulário acrescentamos as seguintes linhas:

public function configure()
{
    parent::configure();

    $this->validatorSchema['my_field'] = new sfValidatorCallback(
                    array('callback' =>
                        array($this, 'validateMyField')
                    )
    );

}

public function validateMyField($validator, $value)
{
    /* All my action goes here */
    $tainted_values = $this->getTaintedValues();

    if ($tainted_values['my_field_2'] > 0 && $value != '')
    {
        return $value;
    }
    else
    {
        throw new sfValidatorError($validator, "I guess something goes wrong here!");
    }
}


No método validateMyField podemos aceder aos valores todos do formulário obtendo os Tainted values disponíveis utilizando o método getTaintedValues da classe dos formulários.

Realizadas as verificações pretendidas devolvemos o valor ($value) do campo validado ou despoletamos um erro que será apresentado pelo método renderError do formulário.