14 de fevereiro de 2011

Criar Doctrine_Collection manualmente

Útil quando não temos dados suficientes em base de dados para fazer alguns testes:
/* @var $dc Doctrine_Collection */
$dc = new Doctrine_Collection('City');
for ($i=1;$i<=32;$i++)
{
   $record = new City();
   $record->setName('City #' .$i);
   $dc->add($record);
}
$this->cities = $dc;

i18n nas actions

Como sabem os helpers estão apenas disponíveis na View, como tal chamar a função __("texto") numa action não funciona.

Como alternativa, numa action.class.php, podemos utilizar a seguinte técnica:
$this->getContext()->getI18N()->__("texto");

Outra forma é forçar o load dos helpers necessários na configuração da aplicação - isto faz com que a função __("texto") fique disponível em toda a aplicação:
class frontendConfiguration extends sfApplicationConfiguration {

    public function configure()
    {
        $this->loadHelpers(array('I18N'));
    }

}

11 de fevereiro de 2011

Detectar primeira visita de utilizador

Para detectarmos o primeiro request (visita) do utilizador (logado ou não), basta adicionar o seguinte método à class do user (app_name/lib/myUser.class.php):

public function isFirstRequest()
    {
        $first_request_parameter = $this->getAttribute('first_request');
        if (isset($first_request_parameter)) {
            return false;
        }

        $this->setAttribute('first_request', true);
        return true;
    }

Agora numa action:

...
if ($this->getUser()->isFirstRequest()) {
  // primeira visita
} else {
  // re-visita
}

1 de fevereiro de 2011

Usar Helpers nas Tasks

Para utilizar helpers nas tasks, precisamos de referenciar qual a aplicação da task. Para isso forçamos uma aplicação default nas options da task pretendida:

protected function configure()
{
        $this->addOptions(array(
            new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED,'The application name', 'frontend'),
                // ...
        ));
}
(Neste caso defini a aplicação default como sendo frontend)

Agora, no método execute:

protected function execute($arguments = array(), $options = array())
{
        // ...
        $contextInstance = sfContext::createInstance($this->configuration);
        $contextInstance->getConfiguration()->loadHelpers('Partial');
        // ...
}