ユーザーエンティティに依存するカスタムエンティティがあります。実際、エンティティフォームをユーザープロファイルフォーム内に表示するのが理にかなっていると感じたのは、非常に重要です。
私が今抱えている問題は次のとおりです。 2つの保存ボタンがあります。そして、それが十分に悪いわけではない場合、ユーザー(下の方)の保存ボタンは機能しなくなり、ホワイトラベル保存ボタンはホワイトラベルエンティティのみを保存します。
フォームは次のようにユーザーフォームに変更されます。
function whitelabel_form_user_form_alter(&$form, FormStateInterface $form_state) {
$whitelabel = WhiteLabel::load(1);
$whitelabel_form = \Drupal::service('entity.manager')
->getFormObject('whitelabel', 'default')
->setEntity($whitelabel);
$form['whitelabel'] = array(
'#type' => 'details',
'#title' => t('White label settings'),
'#open' => TRUE,
'form' => \Drupal::formBuilder()->getForm($whitelabel_form),
);
}
$whitelabel_form
配列のいくつかのパラメーター(Drupal 7で使用されていました)をシャッフルすることを望んでいましたが、その配列は巨大で、送信ボタンとハンドラーを見つけることができませんでした必要だった。
だから問題は、これを行うことができるのですか?そして、それを行うための推奨される方法は何でしょうか?
自分でやろうとするのではなく、 インラインエンティティフォーム モジュールを試してみてください。このモジュールは、この特定のケース(エンティティフォーム内のエンティティの作成/編集)のために作成されています。
Drupal Commerceのワークフローを改善するためにこれに多くの作業が行われていることを知っています。つまり、これはうまく機能しているはずです。私自身はテストしていませんが、Drupal CommerceはDrupal 8にも依存しているため、すでに非常に安定しています。
このモジュールは、フォームを作成するエンティティ参照フィールドにウィジェットを追加することで機能するため、ほとんどプラグアンドプレイである必要があります。唯一の要件は、ユーザーがカスタムエンティティへの参照を持っていることです。
これは可能だと思います。残念ながら、今日はコードを書く時間はありませんが、次の点に注意してください。
form_id
_や_form_build_id
_などの特別なアイテムを必ず削除してください。unset($sub_form['actions'])
などのフォームアイテムを削除する必要があります。#tree
_を有効にしてください。例:_$form['#tree'] = TRUE; $form['sub-form'] = $sub_form;
_これにより、 _$form_state['values']['sub-form']
_。で使用できるサブフォーム値sub-form
_の_$form_state['values']
_値のみを渡すようにしてください(私が何を意味するのか理解してください)。それが役に立てば幸い!実験の地獄のように聞こえます!幸運を。
理論的な答え(うまくいかないものですが、これは私が得た最も近いものです)。参考のためにここに投稿し、他の人のための出発点。
ユーザーフォームを変更します。
function whitelabel_form_user_form_alter(&$form, FormStateInterface $form_state) {
$whitelabel = WhiteLabel::load(1);
$whitelabel_form = \Drupal::entityTypeManager()
->getFormObject('whitelabel', 'default')
->setEntity($whitelabel);
$renderable_form = \Drupal::formBuilder()->getForm($whitelabel_form);
// Remove embedded form specific data.
unset($renderable_form['actions']);
unset($renderable_form['form_build_id']);
unset($renderable_form['form_token']);
unset($renderable_form['form_id']);
// Also remove all other properties that start with a '#'.
foreach ($renderable_form as $key => $value) {
if (strpos($key, '#') === 0) {
unset ($renderable_form[$key]);
}
}
// Create a container for the entity's fields.
$form['whitelabel'] = array(
'#type' => 'details',
'#title' => t('White label settings'),
'#open' => TRUE,
'#tree' => TRUE,
);
$form['whitelabel'] += $renderable_form;
$form['actions']['submit']['#submit'][] = 'whitelabel_form_user_form_submit';
}
送信ハンドラー:
function whitelabel_form_user_form_submit(&$form, FormStateInterface $form_state) {
$values = $form_state->getValues();
$form_state = new FormState();
$form_state->setValues($values);
// Theoretically you'd want to use $values['entity_container']
// for the dedicated entity values.
// Obtain or create an entity. (You want to get this from the form.)
if (!$whitelabel = WhiteLabel::load(1)) {
$whitelabel = WhiteLabel::create();
}
\Drupal::entityTypeManager()
->getFormObject('whitelabel', 'default')
->setEntity($whitelabel) // Current entity.
->buildEntity($form, $form_state) // Update with form values.
->save(); // Save updated entity.
}