ノードと参照ノードを同時に作成する


7

ノードと参照ノードを同時に作成したい場合があります。これにうまくいく解決策はありますか?

私が話していることを明確にするために、次の状況を考えます(説明のために非常に簡略化しています)。

ノード参照フィールドStudentを持つコンテンツタイプのクラスがあります。ユーザーがClassノードとStudentノードを同時に作成できるようにしたいと考えています。また、通常のノード参照オートコンプリートを使用して、すでに存在している生徒を選択できるようにしたいと考えています。

理想的には、これらすべてを1つのページから機能させ、Drupal権限システムの範囲内で機能させて、さまざまな役割とさまざまな権限を持たせることができます。

はい、この場合、Studentは(ノードではなく)ユーザーとして提供するのが最善ですが、ClassStudentは単に状況を説明するためのものです。実際のシナリオでは、実際にノード参照が必要です。

これと同様の質問があります。「親ノード一緒に参照ノードを作成する」ですが、私は特にDrupal 7ソリューションのみに関心があります。

編集:

既存のモジュールを探すだけでなく、カスタムコードの準備も始めます。


Drupal 7では、これを実現するためのカスタムコードをいくつか作成しました。これは、考えられるモジュールベースのソリューションがまだないためです。学生ノードを作成するためのフォームをctoolsモーダルにスローし、ajax_command_data()または別のajax-data-passing関数を使用してnidを元のノードフォームに戻すこともできます。
geerlingguy

@geerlingguy、それを回答として書くと(特にAJAXモジュールのnidパスバックの先頭)、真剣に回答と見なされます。
mpdonadio

少しで行います。
geerlingguy 2012

回答:


4

私は[参照]ダイアログを使用します。このダイアログでは、既存の参照フィールドに小さな「+」が表示され、ユーザーはクラスノード編集フォームから直接新しい生徒を作成できます。


誰かがこのモジュールを使用しましたか?アルファリリースについてのフィードバックをお待ちしています。
David John Smith

参考までに、このモジュールをインストールしただけで、完全に適合しているようです。
David John Smith

8

いくつかの異なるサイトで、ctoolsモーダルを使用してこれを実行しました。これを(非常に簡単に)実装した方法の基本的な概要は次のとおりです。

  • 参照するノードの基本的なノードフォームを表示するモジュールのhook_menu()でカスタムページコールバックを作成します(「学生」ノードの場合、名前フィールドと卒業年フィールドがあるだけです)。そのフォームの送信コールバックで、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を元のクラスフォームに戻す方法です。

  • 私の状況では、モーダルを使用して元のページにいくつかのマークアップを吐き出していたので、を使用してマークアップをプレースホルダーdivに渡しajax_command_append()ました。それは、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はノード参照用にのみ提供しますが、entityconnectはノード参照、エンティティ参照、用語参照、ユーザー参照用に提供します。

Inline_entity_formは、エンティティ参照(のみ)用に2つの追加ウィジェットを提供します。


0

これが本当に学校のシナリオに似ていて、生徒が私が使用する複数のクラスに参加できる場合:

これには、トークンを使用して、クラスnidに応じてビューをフィルタリングし、現在のクラスnidとして出席ノード参照フィールドのデフォルト値を設定することも必要になります。

最終的に、ユーザー参照を使用して、StudentコンテンツタイプをUserにマップできます。


私のコンテンツタイプは既に存在し、サイトは機能しています。中間タイプを追加すると、多くの手直しが必要になります。
mpdonadio
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.