symfony 1.4 проверяет два поля одновременно [было «изменить содержимое ответа в processForm»] - PullRequest
0 голосов
/ 16 февраля 2011

Я пытаюсь изменить содержимое ответа от некоторых действий в Symfony 1.4.

Когда я обрабатываю некоторые формы и после некоторых условий, в методе processForm (тот, который вызывается для привязки формы, ипредоставление окончательного результата операции обработки формы).

Я пытался

function processForm(sfWebRequest $request, sfForm $form)
{
   $form->bind(...);
   // ... some validations/operations ...

   $cont = $this->getResponse()->getContent();
   $this->getResponse()->setContent("MODIFICATION!" . $cont);
   $this->getResponse()->sendContent();
}

, но в настоящее время я получаю сообщение об ошибке «Не удается изменить информацию заголовка - заголовки уже отправлены» ...

Это вообще возможно?или я несу чушь?Есть идеи?

Спасибо!

РЕДАКТИРОВАТЬ: Я пытаюсь сделать следующее:

В действии executeNew я долженсделать некоторые проверки.Все проверки, специфичные для полей, выполняются правильно с соответствующими валидаторами формы.

Но существует проверка, которая учитывает значение 2 полей одновременно, а не только одного из них.Итак, не найдя способа сделать валидатор для этих двух полей одновременно, я решил проверить его, переопределив метод isValid формы, вызвав метод parent :: isValid и проверив мое условие с двумя полямиздесь тоже.Когда проверка завершается неудачно, я возвращаю false, как должно быть isValid ().Но также я не нашел, как написать сообщение об ошибке рядом с формой, когда эта конкретная ошибка происходит.Вот почему я хочу изменить содержание Ответа, чтобы добавить специальное сообщение об ошибке для этого конкретного состояния ошибки, только когда это произойдет ...

Надеюсь, это поможет прояснить мой пост ...

1 Ответ

2 голосов
/ 16 февраля 2011

РЕДАКТИРОВАТЬ:

Что вам нужно сделать, это создать сообщение или предварительный валидатор.Это позволит вам проверить два поля одновременно для какого-то дополнительного условия.Трудно сказать, как реализовать, так как мы не знаем ваши правила проверки, но следующие документы должны помочь: http://www.symfony -project.org / more-with-symfony / 1_4 / ru / 06-Advanced-Forms # chapter_06_ignoring_embedded_forms

Это показывает, как создать postValidator и использовать его в форме.Иногда, хотя вам не нужно повторно использовать этот код, создание класса является излишним.В этом случае вы можете создать пользовательский метод в своей форме и использовать sfValidatorCallback .. например:

class myForm {


  public function configure()
  {
     // normal config stuff

    $this->mergePostValidator(new sfValidatorCallback(array(
      'callback' => array($this, 'postValidate')
    )));
  }

  public function postValidate($validator, $values, $arguments)
  {
     // your post validator code
  }
}

Выполнение этого способа позволит вам определять сообщения об ошибках, как обычно для другихvalidator.


processForm не является действием, которое вы пересылаете, поэтому вызывающее его действие все еще будет пытаться отправить содержимое, а что-то не так, как обычно.Проблема в том, что sendContent на самом деле отображает содержимое в браузере ... поэтому, когда вызывающее действие пытается отправить заголовки и содержимое снова, как ожидается, вы получите типичную ошибку уже отправленных заголовков.

Если вынужно отправить контент сразу, а затем выбросить sfStopExecutionException после sendContent.Но я сомневаюсь, что это то, что вы действительно хотите сделать.Вероятно, лучше всего не отправлять содержимое, а разрешить элементу управления возвращать вызывающее действие как обычно, а затем обрабатывать отправку содержимого оттуда.

Вы также можете присоединить слушателя к событию response.filter_content, но в этой ситуации я не уверен, принесет ли это много пользы.Если вы дадите лучшее описание того, что вы пытаетесь выполнить, помимо добавления тестовой строки, мы можем дать вам более точное направление.

...