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.