web-dev-qa-db-ja.com

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

私はアドバイスが必要な非常に複雑な状況にあります。コンテンツタイプ_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_phone_、_field_my_text_、および_field_my_yetanothertext_もあり、後者は異なるマシン名を持っています。

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

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

10
Елин Й.

ライブで実行したい場合で、すべてのフィールドがすでにフォーム上にある場合、最も安全な方法は、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 parameter を追加することもできますが、フィールドのコピーごとにサーバーを呼び出すフォームが作成されます。実際にデータベースにクエリを実行する必要がある場合は、この方法が適しています。ここでそれを改めて説明するのはかなり広いでしょう。ユーザーが見る実際の値を更新するには、$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更新 この回答を直接使用するか、コードを変換して .change() または .blur() メソッドを使用します。

11
Mołot

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

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

4
4life

@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'];
}
2
Елин Й.

これは少し遅いかもしれませんが、このモジュール https://www.drupal.org/project/entityreference_autofill は、あなたが説明していることを実行しているようです。私はそれを使用しましたが、それもあなたを助けることができます。

0
Moses Sseggembe