Как проверить> 1 поле за один раз, в форме Zend? - PullRequest
1 голос
/ 12 июля 2009

Я создал 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;
    }
}

1 Ответ

1 голос
/ 13 июля 2009

Это не поможет вам решить, к какому полю прикрепить проверку, но ... Есть такая вещь, как « контекст проверки », которая помогает. Когда вы создаете свой собственный валидатор или форму, ЕСЛИ вы указываете второй необязательный параметр ($ context = null), Zend автоматически заполнит его всем массивом опубликованных данных, который вы можете использовать для включения значений других полей в вашу валидацию. Вот очень простой пример:

$city_name = new Zend_Form_Element_Text('city_name');

$place_name = new Zend_Form_Element_Text('place_name');
$place_name->addValidator('NewPlace');

class My_Validate_NewPlace extends Zend_Validate_Abstract
{ 
    public function isValid($value, **$context = null**)
    {  
        if(trim($value)!='' && trim($context['city_name']) != '')
        { 
            return true;
        }

        return false;
    }
}
...