sfValidatorEmails

La classe suivante permet de valider, dans symfony, une liste d’emails, entrée par l’utilisateur dans un champs de type textarea. Elle s’appuie sur le travail de la classe sfValidatorEmail.

class sfValidatorEmails extends sfValidatorBase
{

  public function __construct($options = array(), $messages = array()) 
  {
    parent::__construct(array_merge($options, array('trim' => true)), $messages);
  }

  public function doClean($value) 
  {
    $i = 0;
    $emails = explode("
", $value);
    $validator = new sfValidatorEmail($this->options, $this->messages);
    
    $cleaned_emails = array();

    try {
      foreach ($emails as $email) {
        ++$i;
        $cleaned_emails[] = $validator->clean($email);
      }
    } catch (Exception $e) {
        throw new sfValidatorError($this, 'invalid',
                                   array('line' => $i, 'bad_email' => $email));
    }
    return implode("
",$cleaned_emails);
  }

}

Skin pour mediawiki

Les premiers fichiers du projet Libre Entreprise Mediawiki Skin viennent d’être mis en ligne. Ce modeste projet fournit un thème, une apparence, pour les sites réalisés avec le célèbre Mediawiki. Le thème fourni est celui des trois sites du réseau Libre Entreprise.

Les objectifs de ce thème étaient :

  • Être totalement différent du thème par défaut de Mediawiki, pour que l’utilisation du logiciel mediawiki ne soit pas manifeste ;
  • Simplifier, voire supprimer, la boîte à outil, trop complexe, contenant des liens inutiles pour la plupart des sites ;
  • Simplifier et alléger de la même façon le contenu du pied de page ;
  • Être lisible sur un eeepc 701, sans défilement horizontal, ou presque.

La documentation pour utiliser et configurer le thème est disponible en ligne.

Validateurs dynamiques

Il est courant qu’un formulaire web nécessite des validateurs dynamiques, c’est à dire dépendant de certaines valeurs du formulaire lui même. Dans une des applications que j’ai écrite récemment une case à côcher permet à l’utilisateur de tester le formulaire et de ne pas enclencher l’action normale. Ainsi lorsque cette case à côcher est validée, un champs du formulaires n’est plus obligatoire, et un autre le devient.

Pour résoudre ce problème, une des solutions connue consiste à surcharger la méthode bind de la classe du formulaire, dérivée de sfForm, et de changer à la volée les validateurs.

Pour ma part je préfère exécuter ce changement dynamique de validateur dans le preValidator. Voici ce que cela donne:

 public function configure()
 {
   [...]
   $this->validatorSchema->setPreValidator(
     new sfValidatorCallback (
       array('callback' => array($this, 'isTest'))));
 }
 public function isTest($validator, $values)
 {
   if (isset($values'is_test')) {
     $this->validatorSchema['email_recipients']->addOption('required', false);
     $this->validatorSchema['test_recipient']->addOption('required', true);
   } else {
     $this->validatorSchema['email_recipients']->addOption('required', true);
     $this->validatorSchema['test_recipient']->addOption('required', false);
   }
   return $values;
 }

Le code est plus facile à maintenir: tout ce qui concerne la validation s’exécute uniquement dans des validateurs, sans passer par une méthode, bind qui n’a rien à voir avec ce processus.

Task, application, environnement et fichier app.yml dans Symfony

Il est parfois utile que certaines tâches appartiennent à une application et soient exécutées dans un environnement donné. Ceci pour leur permettre d’accéder aux variables de configuration du fichier app.yml de l’application en question.

Pour obtenir ce résultat, il faut déclarer un argument 'application' et une option 'env', initialisés respectivement à l’application et à l’environnement souhaités. Cela une fonction configure qui commence ainsi:

class doHelloWorldTask extends sfBaseTask
{
 protected function configure()
 {
    $this->addOptions(array(
      new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name', 'backend'),
      new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
    ));
    [...]
 }

Ensuite il est alors possible d’accéder aux données du fichier app.yml de l’application en question. Exemple dans la fonction execute:

 protected function execute($arguments = array(), $options = array())
 {
   $conn_id = @ftp_connect(sfConfig::get('app_ftp_server_host')); 
   [...]
 }

L’inconvénient de cette méthode est qu’elle ne permet pas de figer l’application dans la tâche.

Activer les logs sous MySQL 5.1

Les logs, sous MySQL, c'est quand même bien pratique pour voir ce qui se passe sur un serveur et pour tracer les requêtes qui plantent. Et lorsqu'on vient de changer de version de serveur MySQL pour passer à la version 5.1 pour profiter des dernières nouveautés, il est déplaisant de voir les logs disparaître.

Heureusement la solution est disponible sur le site MySQL: il s'agit d'une nouvelle option dans le fichier my.conf:

 #log dans les tables et dans le fichier
 log-output = FILE,TABLE
 
 #log dans un fichier uniquement
 log-output = FILE