別のフィールドに基づくフィールドの自動入力


10

私はアドバイスが必要な非常に複雑な状況にあります。コンテンツタイプがありmy_content、それにはフィールドコレクションフィールドがアタッチされていますfield_mycollection。これには、ユーザーを参照するエンティティ参照フィールドfield_my_userreference、電話フィールドfield_my_phone、テキストフィールドfield_my_text、および別のテキストフィールドがありますfield_my_anothertext

My Content
|_ field_mycollection
   |_ field_my_userreference
   |_ field_my_phone
   |_ field_my_text
   |_ field_my_anothertext

ユーザエンティティは、フィールドを持っているfield_my_phonefield_my_textそしてfield_my_yetanothertext後者は、異なるマシン名を有しています。

私がやりたいことは、my_content編集/追加フォームでfield_my_userreferenceユーザーが選択されている場合、他のフィールドは選択されたユーザーのデータから自動入力されるはずです。自動入力フィールドは引き続き編集可能である必要があります。

どうすればこの目標を達成できますか?可能であれば、いくつかのコーディングで、を使用してそれを実行しhook_form_FORM_ID_alter()ます。


あなたはそれがフォーム上でライブで発生するために必要ですか?
Mołot

生きる。保存時にデータが空のままになっている場合、データがユーザーエンティティから取得されるように実装しました。しかし、実際に私は:(フォームに必要なもの
ЕлинЙ.

はい、私の答えを提示しました。
Mołot

回答:


11

ライブで実行したい場合で、すべてのフィールドがすでにフォーム上にある場合、フォームhook_form_FORM_ID_alter()に以下を追加するためにを使用するのが最も安全な方法です。

$form['#attached']['js'] = array(
  drupal_get_path('module', 'module_name') . '/js/copy_field_value.js',
);

次に、copy_field_value.js動作を作成します。

(function($) {
  Drupal.behaviors.moduleNameCopyFieldValue = {
    attach: function (context, settings) {

      // Repeat this for all fields as needed
      $('#source', context).on('blur', function () { 
        // above you can use change instead of blur if element is not changed by another js
        if (!$('#destination').val() || 0 === $('#destination').val().length) {
          $('#destination').val($(this).val());
          // wrap line above in "if no value" like I did, or other condition you like
        }
      });
      // end of "repeat this"
    }
  };
})(jQuery);

を使用hook_form_FORM_ID_alter()してソースフィールドに#ajaxパラメータを追加することもできますが、それにより、フォームが各フィールドのコピーでサーバーを呼び出すようになります。実際にデータベースにクエリを実行する必要がある場合は、この方法が適しています。ここでそれを改めて説明するのはかなり広いでしょう。$form_state["input"]ユーザーに表示される実際の値を更新するには、配列を変更する必要があります。フォーム作成関数でそれを行いisset、通知を回避するためにラップします。

フォーム要素が$form["something"]["something"]["element"]である場合、その値は$form_state["input"]["something"]["something"]["element"]-になりhook_form_alter、正しく設定できます。両方$form$form_state参照することを忘れないでください。

.on()メソッドはjQuery 1.7で追加されたため、この回答を直接使用するか、コードを使用またはメソッドに変換するには、jQuery Updateが必要です。.change().blur()


説明に感謝します!私はDrupalのJS APIにあまり慣れていません。ユーザーエンティティからフィールド値を取得する方法を説明していただけますか?たとえば、ユーザーが選択されている場合、次のフィールドにこのユーザーの情報を入力するにはどうすればよいですか?
ЕлинЙ.

1
@ЕлинЙ。ここでの秘訣は、phpの背景を気にすることではありません。<input>お使いのブラウザでFirebugなどのツールを使用して、タグのIDパラメータを特定するだけです。または、他のjQueryセレクターを使用します。これはブラウザでのみ発生するため、画面上にあるものを使用できます。一方、実際にデータベースをクエリする必要がある場合(私はそれを逃したようです)、それ#ajaxが方法です。しかし、それはかなり広いでしょう。$form_state["values"]ユーザーに表示される実際の値を更新するには、配列を変更する必要があります。フォーム作成関数でそれを行いisset、通知を回避するためにラップします。
Mołot

もう一度@Mołotに感謝します。明日、または多分今夜、実装するつもりです。それが実際に機能するようになるまでに数時間かかると思われます。
ЕлинЙ.

@ЕлинЙ。幸運を祈ります。さらに質問があれば遠慮なく、接続されている場合はコメントでここにリンクしてください。回答を少し更新しました。
Mołot

1
わかりました、少し実験して、自分の経験を書きます。
ЕлинЙ.

4

あなたは計算フィールドモジュールを使用してそれを行うことができます

計算フィールドは、カスタムの「計算フィールド」をコンテンツタイプに追加できる非常に強力なCCKフィールドモジュールです。これらの計算フィールドには、PHPコードで定義した値が入力されます。他のフィールド、現在のユーザー、データベーステーブルなど、Drupalで利用可能なものを何でも利用できます。(まだパワーを感じていますか?:))また、計算されたフィールド値を他のコンテンツフィールドと共にデータベースに保存するか、ノードビュー中にその場で「計算」するかを選択できます。(ただし、ビューを使用するには、データベースに保存された値が必要です。)このフィールドは、文字通りCCKフィールドのスイスアーミーナイフです。PHPベースの値の準備を始めましょう!


早速のご返事ありがとうございます。それは非常に有望に聞こえます。ただし、そのためのモジュールをインストールするのではなく、単にコードを記述します。そのような機能のみがそのフォームに必要であり、実際のシステムはすでに大きすぎ、さまざまな機能のために多くのモジュールがインストールされています。
ЕлинЙ.

次に、このモジュールを使用して、ノードを作成または編集しているユーザーが自動入力フィールドを手動でオーバーライドして保存することは可能ですか?そのため、ユーザーエンティティとmy_contentには異なる値が保存されます。
ЕлинЙ.

それは、セットアップ方法によって異なります
4life 2013

@ 4lifeに感謝します。Moofotの指示を使用して、コーディングでそれを達成できない場合も試してみます。
ЕлинЙ.

2

@Mołotの多大な支援のおかげで、どのように達成したかを投稿したいと思います。

  1. hook_form_FORM_ID_alter()を実装しました。
  2. フィールドコレクションの周りにラッピングdivを追加しました。
  3. myフィールドコレクションは複数値フィールドである#ajaxため、それを繰り返し、フィールドのプロパティを設定しますfield_my_userreference
  4. フィールドコレクションアイテムを単に返すコールバック関数を作成しました。
  5. フィールドコレクションの$ form_stateが設定されている場合は、hook_form_FORM_ID_alter()実装でチェックされます。はいの場合、ユーザーエンティティから値を取得し、フォーム入力フィールドにそれらの値を入力します。

私のコードは次のようになります:

function MYMODULE_form_my_content_node_form_alter(&$form, &$form_state, $form_id) {
  $form['field_mycollection']['#prefix'] = '<div id="mycollection-wrapper">';
  $form['field_mycollection']['#suffix'] = '</div>';
  foreach ($form['field_mycollection']['und'] as $key => $fc_mycollection) {
    if (is_numeric($key)) {
      $form['field_mycollection']['und'][$key]['field_my_userreference']['und']['#ajax'] = array(
        'callback' => 'MYMODULE_mycollection_callback',
        'wrapper' => 'mycollection-wrapper',
      );
      if (isset($form_state['values']['field_mycollection']['und'][$key]['field_my_userreference']['und'][0]['target_id'])) {
        $user_wrapper = entity_metadata_wrapper('user', $form_state['values']['field_mycollection']['und'][$key]['field_my_userreference']['und'][0]['target_id']);
        $form_state['input']['field_mycollection']['und'][$key]['field_my_text']['und'][0]['value'] = $user_wrapper->field_my_text->value() ? $user_wrapper->field_my_text->value() : '';
        $form_state['input']['field_mycollection']['und'][$key]['field_my_anothertext']['und'][0]['value'] = $user_wrapper->field_my_text->value() ? $user_wrapper->field_my_yetanothertext->value() : '';
      }
    }
  }
}

function MYMODULE_mycollection_callback($form, &$form_state) {
  return $form['field_mycollection'];
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.