<?xml version="1.0" encoding="UTF-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Latest snippets tagged strings validation</title>
  <link rel="alternate" href="http://snippets.prendreuncafe.com/snippets/tagged/strings+validation/order_by/date"></link>
  <id>http://snippets.prendreuncafe.com/snippets/tagged/strings+validation/order_by/date</id>
  <updated>2008-01-13T12:11:16Z</updated>
  <author>
    <name>Symfony</name>
    <author_email>noreply@symfony-project.com</author_email>
  </author>
<entry>
  <title>[Symfony] [Validator] Valider une valeur en fonction d'une blacklist</title>
  <link href="http://snippets.prendreuncafe.com/snippet/73"></link>
  <updated>2008-01-13T12:11:16Z</updated>
  <id>73</id>
  <summary type="html">Pour s'assurer qu'une valeur saisie par un utilisateur dans un formulaire Symfony ne fait pas partie d'une liste de valeurs interdites, on peut utiliser le validateur suivant :

Fichier sfBlacklistValidator.class.php :

[code=php]
&lt;?php
class sfBlacklistValidator extends sfValidator
{

  public function initialize($context, $parameters = null)
  {
    // initialize parent
    parent::initialize($context);

    // set defaults
    $this-&gt;getParameterHolder()-&gt;set('blacklist_error', 'Value is not an allowed one');
    $this-&gt;getParameterHolder()-&gt;set('case_sensitive', false);
    $this-&gt;getParameterHolder()-&gt;set('trim', true);
    $this-&gt;getParameterHolder()-&gt;add($parameters);
    return true;
  }

  public function execute(&amp;$value, &amp;$error)
  {
    // Forbidden names
    $blacklist = $this-&gt;getParameter('blacklist');
    $casesensitive = $this-&gt;getParameter('case_sensitive');
    $trim = $this-&gt;getParameter('trim');
    
    if ($trim)
    {
      $value = trim($value);
    }
    
    if (is_array($blacklist) &amp;&amp; count($blacklist) &gt; 0)
    {
      if ($casesensitive)
      {
        $match = in_array($value, $blacklist);
      }
      else
      {
        $match = false;
        foreach ($blacklist as $item)
        {
          if (is_string($item) &amp;&amp; strtolower($item) == strtolower($value))
          {
            $match = true;
            break;
          }
        }
      }
      if ($match)
      {
        $error = $this-&gt;getParameterHolder()-&gt;get('blacklist_error');
        return false;
      }
    }
    
    return true;
  }
  
}
[/code]

Dans un fichier de validation yml:

[code=yaml]
fields:
  myfield:
    sfBlacklistValidator:
      blacklist:       [admin, contact, info, infos, commercial, tech, support, sales, partnership, webmaster, business, owner]
      case_sensitive:  no
      trim:            yes
      blacklist_error: The username you requested is not available
[/code]

Les options sont assez explicites, mais en voici tout de même le détail :

* blacklist: tableau de valeurs prohibées au format YAML
* case_sensitive: effectuer les comparaisons en tenant compte de la casse
* trim: inclure les espaces en début et fin de chaînes
* blacklist_error: Message d'erreur à afficher en cas de valeur blacklistée</summary>
</entry>
</feed>