Zend MultiCheckbox: установить максимальный выбор

И вот я снова с простым вопросом.

Существует ли существующий валидатор zend для установки максимума полей, которые может выбрать пользователь. Я хочу, чтобы они выбрали не более 3 ящиков.

Я искал в Интернете, и единственное, что я нашел, это установить ошибку в функции isValid в элементе формы. Но тогда у меня проблема, ошибка отображается для каждого выбранного поля. (так 4 и более раз) А ​​может кто знает как бороться с этой проблемой? Если бы я смог отобразить эту ошибку только один раз, моя проблема тоже была бы решена.

Спасибо за помощь.


person Tim    schedule 07.11.2011    source источник
comment
Может быть, сгруппировать их, добавить валидатор для группы, которую вы быстро напишете самостоятельно. Отображать ошибки вместе с группой, а не каждым элементом.   -  person hakre    schedule 07.11.2011


Ответы (2)


Вы можете использовать мой валидатор, он проверяет количество значений. Я использовал точно для тех же целей - для проверки максимального и минимального количества выбранных значений в мультиселекте:

<?php
class App_Validate_ValuesNumber extends Zend_Validate_Abstract
{
    const TOO_LESS = 'tooLess';
    const TOO_MUCH = 'tooMuch';

    protected $_type = null;
    protected $_val = null;

    /**
     * @var array
     */
    protected $_messageTemplates = array(
        self::TOO_LESS => "At least %num% values required",
        self::TOO_MUCH => "Not more then %num%  required",
    );

    /**
     * @var array
     */
    protected $_messageVariables = array(
        'num' => '_val'
    );
    /**
     * Constructor for the integer validator
     *
     * @param string $type Comparison type, that should be used
     *                     TOO_LESS means that value should be greater then items number
     *                     TOO_MUCH means opposite
     * @param int    $val  Value to compare items number with
     */
    public function __construct($type, $val)
    {
        $this->_type = $type;
        $this->_val = $val;
    }

    /**
     * Defined by Zend_Validate_Interface
     *
     * Returns true if and only if $value is a valid integer
     *
     * @param  string|integer $value
     * @return boolean
     */
    public function isValid($value)
    {
        // Value shoul dbe greated
        if ($this->_type == self::TOO_LESS) {
            if (count($value) < $this->_val) {
                $this->_error(self::TOO_LESS);
                return false;
            }
        }

        // Value should be less
        if ($this->_type == self::TOO_MUCH) {
            if (count($value) > $this->_val) {
                $this->_error(self::TOO_MUCH);
                return false;
            }
        }
        return true;
    }
}
person Pavel Tytyuk    schedule 07.11.2011
comment
Самостоятельное написание валидатора — это, конечно, еще одно хорошее решение! Я внес некоторые изменения, потому что валидатор работает для каждого флажка. Таким образом, $value всегда содержало только 1 значение. Вместо этого я использовал параметр $context для получения значений. - person Tim; 08.11.2011
comment
$this->someFormElement->->addValidator(new App_Validate_ValuesNumber(App_Validate_ValuesNumber::TOO_LESS, 3)) Означает, что должно быть выбрано не менее 3 значений - person Pavel Tytyuk; 22.12.2011

Я только сегодня с этим боролся. Это ошибка зенда. http://framework.zend.com/issues/browse/ZF-11667 . Для этой проблемы есть разница для исправления, но она не появится, пока не выйдет версия 1.12. Я не хотел ждать, поэтому пропатчил Zend_Form_Element. Исправление работает отлично. До исправления мои сообщения об ошибках в MultiChecks повторялись один раз для каждого установленного флажка.

person Mark    schedule 01.06.2012