フォームの検証時に値を要素に変更する必要があります。
私はこのコードを持っています:
/**
* Implements hook_form_FORM_alter().
*/
function MY_MODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
if ($form_id == 'block_content_MY_BLOCK_form' || $form_id == 'block_content_MY_BLOCK_edit_form') {
$form['#validate'][] = '_custom_validate';
}
}
フィールドfield_testの値を変更したい。このフィールドはプレーンテキストです。
function _custom_validate($form, FormStateInterface $form_state) {
$form_state->setValueForElement($form['field_test'], 'changed');
}
しかし、このブロックを保存したとき、フィールドfield_testはその値を変更しません。
私は何を間違っていますか?
#element_validate関数内に検証メソッドを挿入してから、要素の値を変更してください。
/**
* Implements hook_form_FORM_alter().
*/
function MY_MODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
if ($form_id == 'block_content_MY_BLOCK_form' || $form_id =='block_content_MY_BLOCK_edit_form') {
$form['field_test']['widget'][0]['#element_validate'][] = '_custom_validate';
}
}
function _custom_validate(&$element, FormStateInterface $form_state, &$complete_form) {
$form_state->setValueForElement($element,['value' => 'See the change']);
}
SetValue関数を使用して、テキストフィールドの値を変更します。
function MY_MODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
if ($form_id == 'block_content_MY_BLOCK_form' || $form_id == 'block_content_MY_BLOCK_edit_form') {
$form['#validate'][] = '_custom_validate';
}
}
function _custom_validate(&$form, FormStateInterface $form_state) {
$form_state->setValue('field_test', 'changed');
}
SetValueForElement()のドキュメントによると、コードは機能するはずです。そのように機能させることもできませんでした。
最終的にはうまくいったものがあります:
$title = t(
'@user enrolled in @class',
['@user' => $userName, '@class' => $classTitle]
);
$formState->setValue('title', [['value'=>(string) $title]]);
リッチテキストフィールドのフォーマット名など、フィールドに他の属性がある場合は、属性も追加する必要があります。
$formState->setValue('field_notes', [['value'=>'Dogs are great!', 'format'=>'skilling']]);
他に役立つかもしれない何か。 hook_alterで、私のコードは、値が計算されるフィールドを非表示にします。ただし、フィールドにはDrupal幸せを維持するための値が必要です。
// Hide the title. Compute it from other elements.
$form['title']['#type'] = 'hidden' ;
// Need to give the field a default value, for Drupal's validation code
// to get to the point where a value for the field can be computed.
$form['title']['widget'][0]['value']['#default_value'] = 'Dogs are the best!';