Значение по умолчанию для Zend_Form_Element_Select
Я до сих пор остаюсь частью того, что из-за того, что эта вещь Zend представляет собой ужасный беспорядок, который кое-кто сам себе прощает на более поздней стадии, но он не следует структуре, и документация ужасна, что всегда приводит меня к удачному месту, которое является переполнением стека.
Так что моя проблема в том, что я пытаюсь инициализировать <select>
и я хочу иметь значение по умолчанию Please Choose One
, Если пользователь в конечном итоге выбрал Please Choose One
в качестве значения я хочу выдать ошибку. То, как я это делаю, не работает, потому что я не могу найти отрицательное соответствие регулярному выражению, или я могу?
$pubs = array(
"Please Choose One" => "Please Choose One",
"BBC" => "BBC",
"Channel 4" => "Channel 4"
);
$channels = new Zend_Form_Element_Select("publication");
$channels->setLabel("Channels")
->setRequired(true)
->addMultiOptions($pubs)
->addValidator('regex', true, array(
"pattern" => "/Please Choose One/",
"messages" => array("regexNotMatch" => "Please choose a publisher")
)
)
->setValue("Please Choose One");
PS Я не против изменить ситуацию и использовать лучшую методологию.
2 ответа
Как насчет использования Zend_Validate_InArray вместо этого? Это позволит избежать необходимости отрицать регулярное выражение (что всегда немного сложно).
В вашем случае это было бы что-то вроде
$channel->addValidator('inArray', true, array("BBC" => "BBC", "Channel 4" => "Channel 4"));
Надеюсь, это поможет,
Таким образом, вы хотите, чтобы поле выбора было необязательным, но у вас есть setRequired(true)
? Это не звучит правильно.
В любом случае, если у вас есть несколько вариантов, если выбрано "Пожалуйста, выберите один", вы получите значение "Пожалуйста, выберите один". Я верю, что вы хотите:
$pubs = array(
null => "Please Choose One",
"BBC" => "BBC",
"Channel 4" => "Channel 4"
);
Глядя на часть моего кода, когда я хочу пустой элемент, я создаю свой массив опций следующим образом:
$multiOptions = array();
if (!$options->required) $multiOptions[] = false;
Так что, в основном, запуск мультиопций с пустого места.