Я создал 3-х экранный «мастер», используя пример Zend_Form_SubForm из онлайновой справочной документации.
Требование, с которым я столкнулся с трудностями, заключается в следующем:
Если поля 1, 2 и 3 первого экрана уже есть в базе данных, уведомите пользователя, что он пытается добавить повторяющуюся запись. Каждое из этих полей имеет свои валидаторы. Каким-то образом мне нужно добавить этот «валидатор группы».
Итак, на самом базовом уровне я пытаюсь сделать:
if($field_1_not_in_db && $field_2_not_in_db && $field_3_not_in_db){
return true;//validation OK
} else {
return false;//invalid data
}
Я сталкиваюсь с несколькими проблемами, хотя:
1) Поскольку это относится к нескольким полям, я не знаю, к какому полю его прикрепить. Сообщения об ошибках появляются рядом с полем, к которому они прикреплены, так что это важно ... если только я не смогу отобразить эти «многопольные валидаторы» в верхней части экрана, что было бы идеально.
2) Мой валидатор получает только одно значение (значение поля, к которому я его прикрепляю, а не значения нескольких полей, которые он должен проверять).
3) Я предоставляю ссылку на исходную (не дублирующуюся) запись в сообщении об ошибке, но она не попадает в ссылку, и я не могу понять, как обойти это.
Настройка, которую я сейчас использую (ниже), на самом деле выполняется нормально, но валидатор NewPlace получает $ _POST ['city_fk'] в виде $ полей вместо желаемой группы публикуемых значений.
$city_fk = new Zend_Form_Element_Select('city_fk');
$cities = array();
$city_fk->setMultiOptions($cities)
->setLabel('City')
->setDescription('The city this place is in')
->setRequired(true);
$v = array(
'place_is_unique' => array(
'NewPlace',
'fields' => array('place_name','phone_number','phone_extension','street','post_code_name'),
)
);
$city_fk->addValidators($v);
$addressSubForm->addElement($city_fk);
class My_Validate_NewPlace extends Zend_Validate_Abstract
{
public function isValid($fields)
{
$result = false;
if(!$result)
{
$this->_error('sorry, this is duplicate data. see it <a href="linktoduplicate">here</a>');
return false;
}
return true;
}
}