Как мне сделать поле формы необязательным для проверки в Symfony?

#php #symfony1

#php #symfony1

Вопрос:

У меня есть 2 формы: $patientForm и $investigationForm .

Они оба объединены в одно представление, поэтому пользователь заполняет поля, и создаются 2 записи в таблице пациентов и таблице исследований. Таблица исследований имеет внешний ключ — к имени пациента. Таким образом, у одного пациента может быть много исследований.

Итак, мне, очевидно, нужен идентификатор пациента, чтобы добавить его в запись расследования в качестве внешнего ключа. Однако идентификатор пациента не создается до тех пор, пока форма пациента не будет сохранена.

Итак, я разработал следующую функцию:

 protected function processPatientInvestigation(sfWebRequest $request, sfForm $investigationForm, sfForm $patientForm)
{
    $patientForm->bind($request->getParameter($patientForm->getName()), $request->getFiles($patientForm->getName()));

    if ($patientForm->isValid() amp;amp; $investigationForm->isValid() ) {        
        $patientForm->save();       
        $values = $request->getParameter($investigationForm->getName());
        $values['patient_id'] = $patientForm->getObject()->getId();
        $investigationForm->bind($values, $request->getFiles($investigationForm->getName()));
        $investigationForm->save();     
    }
  

Оператор if всегда завершается ошибкой, потому что $investigationForm недействителен, пока я не присвою его полю формы patient_id значение. Итак, на данный момент это значение пустое. Однако, если бы я просто взял isValid() проверку $investigation формы и поместил ее позже, после $patientForm сохранения. Это означает, что если проверка не удалась и пользователь пропустил поле, то, когда они не нажимают отправить снова, вся функция будет запущена снова, что означает, что у нас будут дублирующиеся записи пациентов.

Итак, я думаю, что ответ заключается в том, чтобы поле patient_id не проверялось, поэтому оно может быть пустым и по-прежнему передавать isValid() функцию.

Пожалуйста, дайте мне знать, если это непонятно. Надеюсь, вы можете посоветовать!

Ответ №1:

Попробуйте следующее, хотя это действительно должно быть сделано в методе forms configure.

 $patientForm->getValidator('patient_id')->addOption('required', false);
  

Комментарии:

1. В итоге я поместил это в класс form.

Ответ №2:

Более чистым решением было бы установить все ваши правила проверки в /lib/form /*Form.class.php сам файл (вместо того, чтобы манипулировать им в вашем действии).

 $this->validatorSchema['patient_id'] = new sf*Validator(array(
  'required' => false
), array());
  

Если вы просто хотите, чтобы поле формы не было полностью проверено, используйте

 $this->validatorSchema['patient_id'] = sfValidatorPass()
  

Ответ №3:

Я бы выбрал встроенные формы и позволил symfony правильно обрабатывать сохранение.

Комментарии:

1. Я знаю, я думаю, что мне следовало это сделать, но я поступил по-другому, и у меня не так много времени, чтобы изучать, как создавать встроенные формы сейчас.