سؤال

I'v creatated a custom validator:

class MyValidator extends AbstractValidator
{
    const ERROR_CONST = 'error';

    protected $dbAdapter;
    protected $messageTemplates = array(
        self::ERROR_CONST => "Error msg for '%value%'."
    );

    public function __construct($dbAdapter)
    {
        $this->dbAdapter = $dbAdapter;
    }

    public function isValid($value, $context = null)
    {
        $this->setValue($value);
        /**
         * Do validation against db
         */

        if(/* Not valid */){
            $this->error(self::ERROR_CONST);
            return false;
        }
        return true;
    }
}

The validation work, I've been able to test it. What doesn't work is the output of the error message using

echo $this->formElementErrors($form->get('action'));

All that is outputted is an empty UL. Is this a translator issue? When I do a get_class on $this->getTranslator() in the validator I get the validator class name. When I var_dump $this->getTranslator() it outputs null. Do I need to set a translator for this to work and where would be the best place to set that translator so that it's system wide for my own validators?

هل كانت مفيدة؟

المحلول

Because you define a __construct method for your validator class, the parent __construct is not implicitly called: http://php.net/manual/en/language.oop5.decon.php (see the note)

You should modify your __construct method:

public function __construct($dbAdapter)
{
    $this->dbAdapter = $dbAdapter;
    //parent::__construct($options);
    parent::__construct(null); // or (void)
}

As you can see, $messageTemplates and $messageVariables are "loaded" from AbstractValidator::__construct, for being used in some methods ( error included):

https://github.com/zendframework/zf2/blob/master/library/Zend/Validator/AbstractValidator.php#L73-L79

نصائح أخرى

Maybe you forgot to add messageVariables ?

/**
 * Message variables
 * @var array
 */
protected $messageVariables = array(
    'value'  => 'value',
);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top