Ich habe eine benutzerdefinierte Entität, die von der Benutzerentität abhängt. Tatsächlich hängt es jedoch davon ab, dass ich es für sinnvoll hielt, mein Entitätsformular im Benutzerprofilformular anzuzeigen:
Das Problem, das ich jetzt habe, ist das folgende; Es gibt 2 Speichern-Schaltflächen. Und wenn es nicht schlimm genug ist, funktioniert die Schaltfläche zum Speichern für den Benutzer (die untere) nicht mehr und die Schaltfläche zum Speichern von weißen Etiketten speichert nur die Entität für weiße Etiketten.
Das Formular wird wie folgt in das Benutzerformular geändert:
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),
);
}
Ich hatte gehofft, einige Parameter im $whitelabel_form
Array (die früher in Drupal 7 funktionierten) zu mischen , aber dieses Array ist riesig und ich konnte die Submit-Buttons und den Handler nicht finden, die ich brauchte.
Die Frage ist also, kann dies getan werden? Und was wäre die empfohlene Vorgehensweise?
Antworten:
Anstatt zu versuchen, Ihr eigenes Ding zu machen, sollten Sie das Inline Entity Form- Modul ausprobieren . Dieses Modul wurde für diesen speziellen Fall erstellt (Erstellen / Bearbeiten von Entitäten in Entitätsformularen).
Ich weiß, dass viel Arbeit investiert wurde, um den Workflow in Drupal Commerce zu verbessern, was bedeutet, dass dies gut funktionieren sollte. Ich habe es nicht selbst getestet, aber da Drupal Commerce auch in Drupal 8 davon abhängt, sollte es bereits ziemlich stabil sein.
Das Modul fügt dem Entitätsreferenzfeld, mit dem das Formular erstellt wird, ein Widget hinzu, sodass es praktisch Plug-and-Play-fähig sein sollte. Die einzige Voraussetzung ist, dass der Benutzer einen Verweis auf Ihre benutzerdefinierte Entität hat.
quelle
Ich glaube, das sollte möglich sein. Leider habe ich heute keine Zeit, Code zu schreiben. Ich denke jedoch, dass Sie Folgendes beachten sollten:
form_id
undform_build_id
von Drupal verwendet , um zu erkennen , welche Form vorgelegt wurde.unset($sub_form['actions'])
zuvor entfernen, bevor Sie das Unterformular an das Hauptformular anhängen.#tree
, dass Sie das Formular aktivieren , damit Sie die Unterformularwerte in einer separaten Tasche in der POST-Variablen abfangen können. Beispiel:$form['#tree'] = TRUE; $form['sub-form'] = $sub_form;
Dadurch werden Ihre Unterformularwerte in verfügbar$form_state['values']['sub-form']
.sub-form
Werte übergeben$form_state['values']
(ich hoffe, Sie verstehen, was ich meine).Ich hoffe es hilft! Klingt nach einem verdammt guten Experiment! Viel Glück.
quelle
form_build_id
,form_token
,form_id
undactions
die Taste verschwinden lassen und machte das wieder ‚äußere Form‘ Arbeit. Ich werde noch etwas damit spielen und dich wissen lassen, wie es geklappt hat.$form_state ['values']
(die Formularelementschlüssel sind leer). Es ist wahrscheinlich (noch) nicht möglich, aber ich hoffe, dass ich das eines Tages herausfinden kann.Die theoretische Antwort (eine, die nicht funktioniert, aber die nächste, die ich bekommen habe). Hier als Referenz und Ausgangspunkt für andere posten.
Ändern Sie das Benutzerformular.
Handler senden:
quelle