Могу ли я остановить повторное создание Drupal формы при ее отправке? - PullRequest
7 голосов
/ 06 октября 2010

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

Проблема, с которой я столкнулся, заключается в том, что я заметил, что при отправке формы Drupal повторно вызывает мою функцию _form, которая снова вызывает вызовы API, и я хотел бы остановить это, пытаясьуменьшить количество выполняемых вызовов API.

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

Спасибо за любую помощь.

Ответы [ 4 ]

4 голосов
/ 07 октября 2010

Вы не можете избежать повторного создания формы, если форма обрабатывается Drupal.Это центральная часть рабочего процесса обработки форм Drupals : каждая форма как минимум строится дважды, один раз для первоначального вывода и как минимум еще раз, когда сообщениеот клиента приходит. Это может быть даже больше, в зависимости от того, что форма делает впоследствии, например, от повторного отображения, когда происходят какие-либо ошибки проверки (обычно к тому времени используется кэшированная версия, но это зависит от конкретной формы).

Что вы должны сделать, это следовать предложению Саймонса - при первом вызове вашей функции конструктора форм выполните вызовы API и сохраните результаты в $form_state['storage']['yourIdentifier'] (yourIdentifier - некоторая строка, не используемая при стандартной обработке формы -обычно начинается с названия ваших модулей).При каждом вызове функции построителя форм вы проверяете, есть ли эти результаты уже в $form_state['storage'].Если они есть, вы просто используете их, пропуская вызовы API.

Это позволит избежать дублирования вызовов API и даст вам больше контроля над тем, как / когда их выполнять (например, вы также можете очистить эти результаты во время проверки, если специальное условие требует повторного извлечения из внешнего API).

3 голосов
/ 07 октября 2010

Не могли бы вы сохранить / кэшировать возвращаемые значения из API в $ form_state ['хранилище'], так что, по крайней мере, если _form вызывается каждый раз, когда вы можете сначала проверить хранилище перед повторным вызовом API.

0 голосов
/ 30 июля 2012

Drupal не может этого сделать? «Не могу» не входит в мой словарный запас!

У меня была такая же проблема, но я не мог позволить ей победить меня. Вот как я с этим справился:

В форме обработки, после того, как я вставляю детали в базу данных (или в электронное письмо или что-то еще), я установил 2 сообщения о состоянии drupal, как это

function process_form($form){
  $success = do_email($form);
  if ($success){
    drupal_set_message("Success");
    drupal_set_message("Your form worked!");
  }
}

И в генераторе форм я читаю и очищаю сообщения, очищаю форму и выводю сообщение о состоянии в виде разметки:

function form_generator($form_state,$parameters){
  $form = array();
   ...// This is where I make the regular form
  $messages = drupal_get_messages(); // this gets the messages and clears them
  if (isset($messages["status"])){
    if (isset($messages['status'][0]) && isset($messages['status'][1])){
      if ($messages['status'][0]=="Success"){
        $form = array(); // This clears the form I've just made
        $form['final_message']= array(
          '#type' => 'markup',
          '#markup' => $messages['status'][1],
        );
      }
    }
  }
}

Это не очищает форму при первом показе, потому что $ messages не установлен, и когда вы сталкиваетесь с ошибками проверки, они все равно будут появляться.

Волшебство Drupal препятствует нашему пути, но воля PHP-кодера сильнее.

0 голосов
/ 07 октября 2010

Во-первых, если проверка не пройдена, у Drupal есть копия формы, поэтому ваша функция формы на самом деле не будет вызываться.

Теперь к решению.

  • Вы можете перенаправить на новую страницу в форме отправки, избегайте повторного вызова формы.
  • Вместо вызова вашей формы непосредственно в определении вашего меню сделайте обратный вызов, который вызывает форму. Затем вы можете проверить, была ли отправлена ​​форма или нет, и вызывать функцию формы только при необходимости.

Если вы беспокоитесь о вызовах API, вы также можете кэшировать его на 5-10 минут, что сделает мои два предложения устаревшими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...