jeudi 10 juillet 2014

Validation formulaire : Champ obligatoire en fonction de la valeur d'un autre champ (Symfony 2)

Vous avez un formulaire Symfony 2 et vous voulez qu'un champ soit obligatoire que si un autre champ a une valeur spécifique ? La solution est simple, mais il fallait y penser : utiliser les groupes de validation.

Prenons un exemple :
Vous avez l'entité suivante avec ses contraintes de validation :

use Symfony\Component\Validator\Constraints as Assert;

class Content
{
    private $id;

    /*
     * Type : Application / Vidéo / Texte
     *
     * @var integer
     * @Assert\NotBlank(message="Le type est obligatoire")
     */
    private $type;

    /*
     * Support : Mobile / Tablette
     *
     * @var integer
     * @Assert\NotBlank(message="Le support est obligatoire") 
     */
    private $support;

    /* ... */
}

Vous voulez que le champ support ne soit obligatoire dans votre formulaire que si le type sélectionné est "Application".

Commencez par créer une contrainte de validation de type Callback sur votre entité en ajoutant la méthode isTypeApplication. Attention, elle prend en paramètre un ExecutionContext, donc n'oubliez pas le use qui va avec :

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContext;

/**
 * @Assert\Callback(methods={"isTypeApplication"})
 */
class Content
{
    private $id;

    /*
     * Type : Application / Vidéo / Texte
     *
     * @var integer
     * @Assert\NotBlank(message="Le type est obligatoire")
     */
    private $type;

    /*
     * Support : Mobile / Tablette
     *
     * @var integer
     * @Assert\NotBlank(message="Le support est obligatoire") 
     */
    private $support;

    /* ... */

    /**
     * Vérifie si le contenu est de type "Application"
     *
     * @param ExecutionContext $context
     */
    public function isTypeApplication(ExecutionContext $context) {
        if ($this->type == 'Application) {
            $context->validate($this, '', 'type_application_group', true);
        }
    }
}

La méthode isTypeApplication qu'on vient d'ajouter, permet de re-valider le formulaire mais en utilisant cette fois le groupe de validation type_application_group lorsque le contenu est de type "Application".

Il n'y a donc plus qu'à utiliser ce groupe de validation pour la contrainte NotBlank sur la propriété support de notre entité pour obtenir au final :

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContext;

/**
 * @Assert\Callback(methods={"isTypeApplication"})
 */
class Content
{
    private $id;

    /*
     * Type : Application / Vidéo / Texte
     *
     * @var integer
     * @Assert\NotBlank(message="Le type est obligatoire")
     */
    private $type;

    /*
     * Support : Mobile / Tablette
     *
     * @var integer
     * @Assert\NotBlank(message="Le support est obligatoire", groups={"type_application_group"}) 
     */
    private $support;

    /* ... */

    /**
     * Vérifie si le contenu est de type "Application"
     *
     * @param ExecutionContext $context
     */
    public function isTypeApplication(ExecutionContext $context) {
        if ($this->type == 'Application) {
            $context->validate($this, '', 'type_application_group', true);
        }
    }
}

vendredi 14 février 2014

Nombre de lignes/de mots d'un fichier

Aujourd'hui, étude d'une petite commande à la fois simple et pratique : wc (word cound).
Elle est souvent utilisée lorsqu'on a besoin de connaître le nombre de lignes d'un fichier ou encore, mais c'est moins fréquent, le nombre de mots. Si on la lance simplement sans argument, on aura :

$ wc nom_fichier
240 569 8980 nom_fichier

Les 3 nombres retournés sont respectivement
  • Le nombre de lignes
  • Le nombre de mots
  • Le nombre d'octets
En ajoutant un argument, on peut avoir seulement l'un de ces nombres :
-l : nombre de lignes
-w : nombre de mots
-c : nombre d'octets

Un autre argument, -m, nous permet d'obtenir un 4° nombre, le nombre de caractères :

$ wc -m nom_fichier

Et voilà, c'est déjà fini