【发布时间】:2009-11-10 22:03:55
【问题描述】:
我有一个显示多个节点的视图。我想将节点表单放在每个显示的节点下方。直接在 template.php 中的 node_add 和 drupal_get_form 都可以正常工作,但我得到的表单 ID 相同为 NODETYPE_node_form 并且验证和提交无法按预期工作。
如果您必须在一个页面上放置多个节点表单,您的一般做法是什么?
目前的进展...
在 template.php 中预处理节点 $author_profile 和 $content 是之前设置的。
$unique = $vars['node']->nid;
$node = new StdClass();
$node->uid = $vars['user']->uid;
$node->name = $vars['user']->name;
$node->type = 'review';
$node->language = '';
$node->title = t('Review of ') . $vars['node']->realname . t(' by ') . $vars['user']->realname . t(' on ') . $content->title;
$node->field_review_to_A[0]['nid'] = $nodeA->nid;
$node->field_review_to_B[0]['nid'] = $vars['node']->nid;
$node->field_review_to_profile[0]['nid'] = $author_profile->nid;
if(!function_exists("node_object_prepare")) {
include_once(drupal_get_path('module', 'node') . '/node.pages.inc');
}
//$vars['A_review_form'] = drupal_get_form('review_node_form', $node);
$vars['A_review_form'] = mymodule_view($node, $unique);
在 mymodule 模块中
function mymodule_view($node, $unique) {
if(!function_exists("node_object_prepare")) {
include_once(drupal_get_path('module', 'node') . '/node.pages.inc');
}
$output = drupal_get_form('review_node_form_' . $unique, $node);
return $output;
}
function mymodule_forms($form_id, $args) {
$forms = array();
if (strpos($form_id, "review_node_form_") === 0) {
$forms[$form_id] = array('callback' => 'node_form');
}
return $forms;
}
function mymodule_form_alter(&$form, $form_state, $form_id) {
if (isset($form['type']) && isset($form['#node']) && $form_id != $form['type']['#value'] .'_node_form' && $form['type']['#value'] == 'review') {
$type = content_types($form['#node']->type);
if (!empty($type['fields'])) {
module_load_include('inc', 'content', 'includes/content.node_form');
$form = array_merge($form, content_form($form, $form_state));
}
$form['#pre_render'][] = 'content_alter_extra_weights';
$form['#content_extra_fields'] = $type['extra'];
//$form['#id'] = $form_id;
//$form['#validate'][0] = $form_id . '_validate';
$form['title']['#type'] = 'value';
$form['field_review_to_A']['#type'] = 'value';
$form['field_review_to_B']['#type'] = 'value';
$form['field_review_to_profile']['#type'] = 'value';
}
}
问题
我对总结不清楚的问题的看法......
- 这是在同一页面上显示多个节点表单的通用方法吗?
- 是否可以从
content模块content_form_alter 函数mymodule_form_alter中复制/粘贴代码?如果content模块更新,它不会刹车吗? - 我应该设置
$form['#id']吗?没有它,所有表单都具有相同的 HTML 表单 IDnode_form,它的 ID 是唯一的,例如review_node_form_254。问题是表单的提交方式没有区别。设置$form['#validate'][0]似乎也没有影响。也许我应该将$form[button]['#submit'][0]设置为别的?现在是node_form_submit。 - 为什么即使使用唯一的表单 ID 和表单验证功能也无法进行验证?如果我提交最后一个表单而没有必填字段,则所有以前的表单都会将特定字段变为红色。我应该制作自己的验证功能吗?什么级别 - 表单或字段?关于从哪里开始的任何提示?
【问题讨论】:
-
将一个标记为已接受,也非常感谢欧宝。很多问题都不清楚,但我猜这个网站的格式要求在单独的问题中发布每个问题......所以谢谢,当我深入了解它时,我会在某个地方发布教程。