web-dev-qa-db-ja.com

ブロックを作成または編集するときに検証フォームの値を変更する

フォームの検証時に値を要素に変更する必要があります。

私はこのコードを持っています:

/**
 * 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はその値を変更しません。

私は何を間違っていますか?

4
rpayanm

#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']);
}
7
Shreya Shetty

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');
}
0
amol_shetkar

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!';
0