如果您希望它实时发生,并且所有字段都已经在表单上,那么最安全的方法是使用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()
方法。