同时创建节点和参考节点


7

我有一种情况,希望同时创建节点和引用的节点。有什么解决方案对此有效吗?

为了弄清楚我在说什么,请考虑以下情况(为便于说明已高度简化):

有一个具有节点引用字段Student的内容类型Class。我希望用户能够同时创建Class节点和Student节点。我还希望他们能够使用普通节点引用自动完成功能来挑选一个恰好已经存在的学生

理想情况下,我希望所有这些工作都可以在一个页面上进行,并且还可以在Drupal权限系统的范围内进行,因此我可以拥有各种角色和各种权限。

是的,我知道在这种情况下,最好将Student作为用户(而不是节点),但是ClassStudent只是为了说明这种情况。实际场景确实需要节点引用​​。

有一个与此类似的问题,即与父节点一起创建引用的节点,但是我仅对Drupal 7解决方案特别感兴趣。

编辑:

不仅要寻找现有的模块,而且还要从头开始编写自定义代码。


在Drupal 7中,我编写了一些自定义代码来为我的站点执行此操作,这仅仅是因为还没有我可以想到的基于模块的解决方案。您甚至可以抛出一个表单,用于将学生节点创建为ctools模态,然后使用ajax_command_data()或另一个ajax-data-passing函数将nid传递回原始节点表单。
geerlingguy 2012年

@geerlingguy,如果您将其写为答案(尤其是AJAX模块nid回传的领先优势),则将其视为答案。
mpdonadio

会做一点。
geerlingguy'4

Answers:



8

现在,对于两个不同的站点,我已经使用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移到节点表单上其他位置的适当位置。对于您的情况,您需要填充一个单值或多值节点引用字段,这可能会有些复杂。我还不需要这样做...因此,对于等式的这一部分,我没有更多的建议可提供。



2

以下模块可以在Drupal 7中使用:

  1. https://drupal.org/project/noderefcreate
  2. https://drupal.org/project/nodeconnect
  3. https://drupal.org/project/entityconnect
  4. https://drupal.org/project/inline_entity_form

Noderefcreate仅使用自动完成向导创建不存在的新节点。如果使用自动完成向导,Nodeconnect和EntityConnect在节点引用处提供添加/编辑按钮。Nodeconnect仅将其提供给节点参考,而objectconnect将其提供给节点参考,实体参考,术语参考和用户参考。

Inline_entity_form提供了两个额外的小部件供实体参考(仅)。


0

如果这确实类似于学校的情况,并且您的学生可以参加多个班级,我将使用:

  • 3种内容类型:学生 (* -1) 出勤 (1- *) 班级
  • 表格块可直接在中输入学生数据;
  • 视图字段显示一个视图,其中包含参加课程的学生的列表;

这也需要使用Token,根据Class nid过滤视图,并设置Attendance节点引用字段的默认值作为当前Class nid。

最终,您可以使用用户参考将学生内容类型映射到用户。


我的内容类型已经存在,并且该网站可以运行。添加中间类型将需要大量的返工。
mpdonadio
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.