现在,对于两个不同的站点,我已经使用ctools模态完成了此操作,这是我如何实现它的基本概述(非常简单):
在模块的hook_menu()中创建一个自定义页面回调,该回调显示要引用的节点的基本节点形式(对于“学生”节点,仅具有名称字段,也许还有年份字段)。在该表单上,在您的Submit回调中,使用node_save()保存节点,并在表单的中将节点ID(在将新的节点对象传递给node_save()之后,应位于$ node-> nid处)$form_state['storage']['student_id']
。
使用hook_form_alter()更改主节点/类节点的表单。您需要在这里做一些事情:
首先,您需要添加ctools模态javascript和功能,以便ctools知道如何处理您的特殊链接:
// Add in ctools modal js and functionality.
ctools_include('modal');
ctools_modal_add_js();
其次,您需要在钩子菜单中添加到步骤1中创建的页面回调的链接,并使用该链接添加类'ctools-use-modal'。因此,例如:
// Add link to custom student form callback with ctools modal.
$form['add_student_link'] = array(
'#markup' => l(t('Add Student'), 'mymodule/add-student', array('attributes' => array('class' => array('ctools-use-modal')))
);
- 在自定义页面回调中,您需要做一些事情以使其在使用或不使用JavaScript以及ctools的表单函数的情况下均能正常工作。
这是一个示例回调:
<?php
function mymodule_student_form_callback($js = FALSE) {
// Make sure $js (set by ctools) is TRUE/loaded.
if ($js) {
// Add in ctools modal form stuff.
ctools_include('modal');
ctools_include('ajax');
$form_state = array(
'ajax' => TRUE,
'title' => t('Create a Student'),
);
$output = ctools_modal_form_wrapper('mymodule_create_student_form', $form_state);
}
else {
return 'Javascript must be enabled for this feature to work.';
// Or, if we wanted to load the form normally...
// return drupal_get_form('mymodule_create_student_form');
}
// If the form is executed, dismiss the form and reload the page.
if ($form_state['executed']) {
$commands = array();
// Close the frame.
$commands[] = ctools_modal_command_dismiss();
// Use one of the ajax framework commands to place the returned
// student node nid into the proper form value, placholder div, etc.
// See: http://api.drupal.org/api/drupal/includes%21ajax.inc/group/ajax_commands/7
$commands[] = ajax_command_append('#student-id-placeholder', $form_state['storage']['student_id']);
$output = $commands;
}
// Render the output.
print ajax_render($output);
exit();
}
?>
在中mymodule_create_student_form($form, $form_state)
,像平常一样构建表单,然后在mymodule_create_student_form_submit(form, &$form_state)
(提交)功能中,在中设置新创建的学生节点的NID值$form_state['storage']['student_id']
。这就是让ctools / AJAX将新的nid传递回原始Class表单的方式。
在我的情况下,我使用模态向原始页面吐出一些标记,因此我使用将该标记传递到占位符div中ajax_command_append()
,然后在原始页面上使用了一些jQuery来监视占位符div,以及何时在其中找到内容它将HTML移到节点表单上其他位置的适当位置。对于您的情况,您需要填充一个单值或多值节点引用字段,这可能会有些复杂。我还不需要这样做...因此,对于等式的这一部分,我没有更多的建议可提供。