Zend форма множественного выбора повторно заполнить после ошибки проверки - PullRequest
0 голосов
/ 27 сентября 2010

У меня есть элемент множественного выбора формы Zend, который я создаю следующим образом:

$this->addElement('multiselect','somedates',array(
    'filters'=>array('StringTrim'),
    'required'=>true,
    'label'=>'Dates',
    'style' => 'width:14em',
    'size'=>'4',
    'RegisterInArrayValidator' => false, //otherwise it gives an error
    ));

, затем я динамически добавляю несколько мультиопций в множественный выбор через JavaScript в множественный выбор (в основном календарь YUI, гдепользователь нажимает на дату, и она попадает в режим множественного выбора в качестве опции)

Все работает нормально, если я передаю в форму все необходимые значения и, тем не менее, она проходит тест isValid, если возникает ошибка,каждый второй элемент заполняется тем, что было отправлено, но multi-select теряет все свои параметры и должен быть заново заполнен самим пользователем.Multi-select работает нормально, так как это то, что я получаю, если я получаю var dump $this->getRequest()->getQuery();, это то, что я получаю ["somedates"]=> array(2) { [0]=> string(10) "2010-09-09" [1]=> string(10) "2010-09-10" }

Мне просто интересно, имел ли кто-то еще такой же опыт и знаю, чточто-то пошло не так или если Zend Framework является способным к повторному заселению мультивыборов.

Ответы [ 2 ]

0 голосов
/ 04 июня 2013

Вы знаете, что форма заполняется, когда вы звоните

 $form->isValid($this->getRequest()->getPost()/getQuery

Но ваш мульти-выбор не будет заполнен, если вы не сделаете следующее:

$form->getElement('somedates')
     ->addMultiOptions($datesToGetItRepopulated);

Полагаю, у вас нет проблем с отправкой формы параметров (также добавленных) мультиэлемента в параметрах Post, верно?

Для того, чтобы addMultiOptions () работал, имейте в виду, что ваш массив должен иметь следующий формат:

$datesToGetItRepopulated = array(
      array('key'=>heresGoesWhatYouwantAsTheValueForYourOption, 
             'value'=>hereGoesWhatYouWantAsTextForYourOption),
      array('key'=>balbla, 'value'=>blabla)
          ....
);

Как вы можете видеть, перед вызовом метода addMultiOptions (...) вам придется с сервера манипулировать информацией, которую вы получили для «somedates», чтобы она соответствовала массиву такого типа. , Таким образом, Zend_Form_Element_MultiSelect будет знать, как заполнить его опциями.

0 голосов
/ 27 сентября 2010

Проблема в том, что ZF ожидает, что пользователь выберет один из вариантов, которыми вы заполнили ZF MultiSelect. Когда вы добавляете опцию с использованием Javascript, ZF не знает, что теперь это допустимая опция, поэтому проверка не удастся. Чтобы обойти это, вам нужно удалить InArray валидатор

$this->getElement("somedates")->removeDecorator("InArray");

Что касается повторного заполнения массива, вам нужно сохранить их где-нибудь, как только пользователь добавит их, поэтому, если форма не будет выполнена, ZF может добавить их обратно. Вы можете добавить их в поле hidden, когда форма отправляется, проверить это скрытое поле на наличие значений и добавить эти даты обратно во вход MultiSelect.

Убедитесь, что вы подтвердили ввод из скрытого поля, не думайте, что он содержит правильную дату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...