Для чего используется $ form_state?

Что такое $ form_state, который обычно используется в контексте API-интерфейса Form, если он используется как аргумент?

В частности, я ищу пример того, когда он используется.

33 голоса | спросил chrisjlee 4 52011vEurope/Moscow11bEurope/MoscowFri, 04 Nov 2011 18:13:39 +0400 2011, 18:13:39

1 ответ


47

$ form_state - один из аргументов, переданных обработчику представления формы, или обработчик проверки формы; его основное использование заключается в извлечении значений, введенных пользователем, в форме, см. содержимое $ form_state ['values']), но оно содержит другие значения, которые могут использоваться для других целей.
В документации для drupal_build_form () содержится список других значений, содержащихся в в этом массиве, которые включают следующие:

  
  • rebuild: Обычно, после завершения всей обработки формы и запуска выполнения обработчиков форма считается выполненной, и drupal_redirect_form () перенаправляет пользователя на новую страницу с использованием запроса GET (поэтому обновление браузера не выполняется повторно отправьте форму). Однако, если для 'rebuild' установлено значение TRUE, то новая копия формы немедленно создается и отправляется в браузер вместо перенаправления. Это используется для многоступенчатых форм, таких как мастера и формы подтверждения. Обычно $ form_state ['rebuild'] задается обработчиком отправки, так как обычно логика в обработчике отправки определяет, выполнена ли форма или требуется другой шаг. Тем не менее, обработчик проверки может уже установить $ form_state ['rebuild'], чтобы заставить обработку формы обойти обработчики отправки и перестроить форму вместо этого, даже если нет ошибок проверки.
  •   
  • redirect: используется для перенаправления формы при отправке. Это может быть строка, содержащая целевой URL, или массив аргументов, совместимых с drupal_goto (). Для получения полной информации см. drupal_redirect_form ().
  •   
  • cache: если установлено значение TRUE, исходная структура необработанной формы будет кэширована, что позволяет полностью перестроить форму из кеша. Типичный рабочий процесс формы включает в себя два запроса на страницу; сначала создается и визуализируется форма для заполнения пользователем. Затем пользователь заполняет форму и отправляет ее, вызывая второй запрос страницы, в котором форма должна быть построена и обработана. По умолчанию $ form и $ form_state создаются с нуля во время каждого из этих запросов. Часто необходимо или желательно сохранить переменные $ form и $ form_state от запроса начальной страницы к той, которая обрабатывает представление. Для этого кеш может быть установлен в значение ИСТИНА. Важным примером является форма с поддержкой Ajax, в которой ajax_process_form () позволяет кэшировать форму для всех форм, которые включают элемент с свойством #ajax. (Обработчик Ajax не имеет возможности самостоятельно создавать форму, поэтому должен полагаться на кешированную версию.) Обратите внимание, что постоянство $ form и $ form_state происходит автоматически для ( многоступенчатые) формы, имеющие установленный флаг «rebuild», независимо от значения для «кеша».
  •   
  • storage: $ form_state ['storage'] не является специальным ключом, и для него в API формы не предусмотрена определенная поддержка. По традиции это было место, где данные, специфичные для приложения, были сохранены для связи между функциями отправки, проверки и создания форм, особенно в форме с несколькими шагами. Реализации форм могут использовать любой ключ (ы) в пределах $ form_state (кроме перечисленных здесь ключей и других зарезервированных, используемых внутренними компонентами Form API) для такого типа хранилища. Рекомендуемый способ убедиться, что выбранный ключ не конфликтует с используемыми API-интерфейсом Form или другими модулями, - это использовать имя модуля как имя ключа или префикс для имени ключа. Например, модуль узла использует $ form_state ['node'] в формах редактирования узлов для хранения информации об редактируемом узле, и эта информация остается доступной при последовательных нажатиях кнопки «Предварительный просмотр» как при нажатии кнопки «Сохранить».
  •   

Другие функции, которые получают в качестве аргумента $ form_state: hook_form_alter () и hook_form_FORM_ID_alter () .

В качестве примера кода, использующего этот аргумент, вы можете посмотреть comment_form_submit () , который содержит следующий код:

function comment_form_submit ($ form, & $ form_state) {
  $ node = node_load ($ form_state ['values'] ['nid']);
  $ comment = comment_form_submit_build_comment ($ form, $ form_state);
  if (user_access ('post comments') & & (user_access ('command comments') || $ node-> comment == COMMENT_NODE_OPEN)) {
    //Сохранение анонимной информации пользователя в cookie для повторного использования.
    if (user_is_anonymous ()) {
      user_cookie_save (array_intersect_key ($ form_state ['values'], array_flip (массив ('name', 'mail','Главная страница'))));
    }

    comment_save ($ комментарий);
    $ form_state ['values'] ['cid'] = $ comment-> cid;

    //Добавить запись в журнал сторожевого таймера.
    watchdog ('content', 'Комментарий отправлен:% subject.', array ('% subject' => $ comment-> subject), WATCHDOG_NOTICE, l (t ('view'), 'comment /'. $ comment -> cid, array ('fragment' => 'comment-'. $ comment-> cid)));

    //Объясним очередь утверждения, если это необходимо.
    if ($ comment-> status == COMMENT_NOT_PUBLISHED) {
      if (! user_access («администрировать комментарии»)) {
        drupal_set_message (t («Ваш комментарий был поставлен в очередь для просмотра администраторами сайта и будет опубликован после утверждения.»));
      }
    }
    else {
      drupal_set_message (t («Ваш комментарий опубликован.»));
    }
    $ query = array ();
    //Найдите текущую страницу отображения этого комментария.
    $ page = comment_get_display_page ($ comment-> cid, $ node-> type);
    if ($ page> 0) {
      $ query ['page'] = $ page;
    }
    //Перенаправление на недавно опубликованный комментарий.
    $ redirect = array ('node /'. $ node-> nid, array (
        'query' => $ Запрос,
        'fragment' => «комментарий». $ Comment- > чид,
      ));
  }
  else {
    watchdog ('content', 'Comment: неавторизованный комментарий, отправленный или комментарий, отправленный в закрытое сообщение% subject.', array ('% subject' => $ comment-> subject), WATCHDOG_WARNING);
    drupal_set_message (t («Комментарий: неавторизованный комментарий отправлен или комментарий отправлен в закрытое сообщение% subject.», array ('% subject' => $ comment-> subject)), 'error');
    //Перенаправление пользователя на узел, на который они комментируют.
    $ redirect = 'node /'. $ Node- > NID;
  }
  $ form_state ['redirect'] = $ redirect;
  //Очистите кеш блоков и страниц, чтобы анонимные пользователи видели комментарий
  //они размещены.
  cache_clear_all ();
}

Чтобы понять, что содержит $ form_state ['values'], вам нужно посмотреть значения, добавленные в $ form в comment_form () . Например, $ form_state содержит $ form_state ['values'] ['name'], потому что $ form содержит $ form [' автор '] [' имя ']. Как правило, если $ form ['field'] - это поле формы, то $ form_state будет содержать $ form_state ['values'] ['field'].

ответил kiamlaluno 4 52011vEurope/Moscow11bEurope/MoscowFri, 04 Nov 2011 20:35:06 +0400 2011, 20:35:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132