我正在创建一个自定义模块,该模块允许用户创建将与项目相关的私人博客文章。所以我创建了一个名为“tasker_blog”的新content_type,它只有一个标题和正文。用户去查看他们的项目并点击一个链接,将他们带到'tasker_project /%/ blog'%作为项目的ID。我的表单被正确显示,但当我提交表单时,我有两个问题, 1)标题在提交时丢失 2)出现此错误:EntityMalformedException:缺少类型节点实体上的bundle属性。在entity_extract_ids()中。Drupal自定义节点添加表单
这是我写的代码(取出一些非相关部分)。
function tasker_project_menu() {
$items = array();
$items['tasker_project/%/blog'] = array(
'title' => 'Private Blog Post',
'page callback' => 'drupal_get_form',
'page arguments' => array('tasker_project_blog_form',1),
'access arguments' => array('view tasker projects'),
'type' => MENU_CALLBACK,
);
return $items;
}
function tasker_project_blog_form($form, &$form_state) {
drupal_add_css(drupal_get_path('module', 'tasker_project') . '/tasker_project.css');
global $user;
module_load_include('inc', 'node', 'node.pages');
$node = (object) array(
'uid' => $user->uid,
'name' => (isset($user->name) ? $user->name : ''),
'type' => 'tasker_blog',
'language' => 'und',
);
node_object_prepare($node);
$form = drupal_get_form('tasker_blog_node_form',$node);
$form['hidden_project_id'] = array(
'#type' => 'hidden',
'#value' => arg(1),
);
return $form;
}
如果我没有提交任何其他内容,我得到上面提到的错误。如果我添加此(使用编制品显示变量):
function tasker_project_node_validate($node, $form, &$form_state) {
s($_REQUEST);
s($form_state['values']);
die();
}
$ _REQUEST阵列输出:
array (9) (
'title' => string (4) "test"
'body' => array (1) (
'und' => array (1) (
array (2) (
'format' => string (13) "filtered_html"
'value' => string (13) "<p>test</p>
"
)
)
)
'changed' => string (0) ""
'form_build_id' => string (48) "form-eKWwyFlBOzi4LsajaAiEZBG7J0uOSI1UDVIhiDomeJE"
'form_token' => string (43) "N421-IiWecixBJGbxTHGcJAIrd6ZutzAW0LAtVSsrJ4"
'form_id' => string (24) "tasker_project_blog_form"
'hidden_project_id' => string (2) "10"
'additional_settings__active_tab' => string (0) ""
'op' => string (4) "Save"
)
$ form_state [ '值']阵列输出:
array (27) (
'nid' => NULL
'vid' => NULL
'uid' => string (1) "5"
'created' => integer 1347038959
'type' => string (11) "tasker_blog"
'language' => string (3) "und"
'changed' => string (0) ""
'title' => string (0) ""
'additional_settings__active_tab' => string (0) ""
'revision' => bool FALSE
'log' => string (0) ""
'name' => string (10) "ndenlinger"
'date' => string (0) ""
'status' => integer 0
'promote' => integer 0
'sticky' => integer 0
'submit' => string (4) "Save"
'preview' => string (7) "Preview"
'body' => array (1) (
'und' => array (1) (
array (3) (
'summary' => string (0) ""
'format' => string (13) "filtered_html"
'value' => string (13) "<p>test</p>
"
)
)
)
//...MORE HERE REMOVED SINCE NOT RELEVANT
)
所以我我不确定这两个问题是否相关。节点保存后,我将向存储nid和project_id的自定义表中添加一行。
你为什么不使用普通的节点形式(节点/添加/ tasker_blog)与节点参照项目?更好的是,您可以使用View来仅允许引用允许的节点。 这样,任何人都可以通过编辑隐藏的HTML来发布任何项目的博客文章。 –
来自tasker_project /%/ blog的传入变量不是节点的标识,而是博客文章连接到的项目的标识。我尝试使用node/add/tasker_blog?p = 123发送它,但是drupal将Get变量关闭。我想不出另一种方法来将项目id转换为除会话变量之外的其他形式,但如果我要设置会话变量,并且他们会定期发布博客文章,它将会连接到项目。 – Pitchinnate
另外,我试着设置自己的'#validate',form_state变量的标题是正确的。它是由于某种原因剥离标题的hook_node_validate()函数。 – Pitchinnate