Answers:
$form_state
是传递给表单提交处理程序或表单验证处理程序的参数之一;它的主要用途是检索用户在表单中输入的值(请参阅的内容$form_state['values']
),但它包含可用于其他目的的其他值。drupal_build_form()
的文档包含该数组中包含的其他值的列表,其中包括以下值:
- 重建:通常,在完成整个表单处理并运行提交处理程序之后,就认为表单已经完成,并且drupal_redirect_form()将使用GET请求将用户重定向到新页面(因此浏览器刷新不会重新提交)表格)。但是,如果已将“ rebuild”设置为TRUE,则将立即构建表单的新副本并发送到浏览器,而不是重定向。这用于多步骤表单,例如向导和确认表单。通常,它
$form_state['rebuild']
是由提交处理程序设置的,因为通常是提交处理程序中的逻辑确定表单是完成还是需要其他步骤。但是,$form_state['rebuild']
即使没有验证错误,验证处理程序也可能已设置为导致表单处理绕过提交处理程序并重建表单。- redirect:用于在提交时重定向表单。它可以是包含目标URL的字符串,也可以是与兼容的参数数组
drupal_goto()
。请参阅drupal_redirect_form()
以获取完整信息。- 缓存:如果设置为
TRUE
原始,则将缓存未处理的表单结构,从而可以从缓存中重建整个表单。典型的表单工作流程涉及两个页面请求。首先,构建并呈现一个表单供用户填写。然后,用户将其填充并提交表单,从而触发第二个页面请求,必须在其中构建和处理表单。默认情况下,$form
并且$form_state
是在每个页面请求期间从头开始构建的。通常,必须或希望将$form
and$form_state
变量从初始页面请求持久化到处理提交的请求。可以将'cache'设置为TRUE来执行此操作。一个突出的例子是启用Ajax的表单,其中ajax_process_form()
为包含#ajax属性的元素的所有表单启用表单缓存。(Ajax处理程序无法自行构建表单,因此必须依赖于缓存的版本。)请注意,对于设置了“ rebuild”标志的(多步)表单,持久性$form
和$form_state
自动发生(无论其值如何) “缓存”。- storage:
$form_state['storage']
不是一个特殊键,并且在Form API中没有为其提供任何特定的支持。传统上,这里是存储特定于应用程序的数据以在提交,验证和表单构建器功能之间进行通信的位置,尤其是在多步骤样式表单中。表单实现可以使用其中的任何密钥($form_state
此处列出的密钥以及Form API内部使用的其他保留密钥除外)用于这种类型的存储。确保所选键与Form API或其他模块所使用的键不冲突的建议方法是使用模块名作为键名或键名的前缀。例如,Node模块使用$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('administer comments') || $node->comment == COMMENT_NODE_OPEN)) {
// Save the anonymous user information to a cookie for reuse.
if (user_is_anonymous()) {
user_cookie_save(array_intersect_key($form_state['values'], array_flip(array('name', 'mail', 'homepage'))));
}
comment_save($comment);
$form_state['values']['cid'] = $comment->cid;
// Add an entry to the watchdog log.
watchdog('content', 'Comment posted: %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid)));
// Explain the approval queue if necessary.
if ($comment->status == COMMENT_NOT_PUBLISHED) {
if (!user_access('administer comments')) {
drupal_set_message(t('Your comment has been queued for review by site administrators and will be published after approval.'));
}
}
else {
drupal_set_message(t('Your comment has been posted.'));
}
$query = array();
// Find the current display page for this comment.
$page = comment_get_display_page($comment->cid, $node->type);
if ($page > 0) {
$query['page'] = $page;
}
// Redirect to the newly posted comment.
$redirect = array('node/' . $node->nid, array(
'query' => $query,
'fragment' => 'comment-' . $comment->cid,
));
}
else {
watchdog('content', 'Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject), WATCHDOG_WARNING);
drupal_set_message(t('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject)), 'error');
// Redirect the user to the node they are commenting on.
$redirect = 'node/' . $node->nid;
}
$form_state['redirect'] = $redirect;
// Clear the block and page caches so that anonymous users see the comment
// they have posted.
cache_clear_all();
}
要了解$form_state['values']
包含的内容,您需要查看$form
在comment_form()中添加的值。例如,$form_state
包含包含$form_state['values']['name']
是因为$form
包含$form['author']['name']
。通常,如果$form['field']
是一个表单字段,$form_state
则将包含$form_state['values']['field']
。
$form
数组的一部分;是表单构建器检查的内容$form_state
。这是我在做正确的事情的模块实现的所有AJAX回调中看到的。