私はアドバイスが必要な非常に複雑な状況にあります。コンテンツタイプ_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()
を使用して、コーディングを行いたいと思います。
ライブで実行したい場合で、すべてのフィールドがすでにフォーム上にある場合、最も安全な方法は、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()
メソッドを使用します。
計算フィールドモジュール を使用してそれを行うことができます
計算フィールドは、カスタムの「計算フィールド」をコンテンツタイプに追加できる非常に強力なCCKフィールドモジュールです。これらの計算されたフィールドには、PHPコードを介して定義した値が入力されます。他のフィールド、現在のユーザー、データベーステーブルなど、Drupalで利用可能なものを使用して名前を付けることができます。(まだパワー?:))また、計算されたフィールド値を他のコンテンツフィールドとともにデータベースに保存するか、ノードビュー中にその場で「計算」するかを選択できます。 (ただし、ビューを使用するには、データベースに保存された値が必要です。)このフィールドは、文字通りCCKフィールドのスイスアーミーナイフです。 PHPベースの値を作り始めましょう!
@Mołotの多大な支援のおかげで、どのように達成したかを投稿したいと思います。
#ajax
フィールドのプロパティfield_my_userreference
。私のコードは次のようになります:
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'];
}
これは少し遅いかもしれませんが、このモジュール https://www.drupal.org/project/entityreference_autofill は、あなたが説明していることを実行しているようです。私はそれを使用しましたが、それもあなたを助けることができます。