Mam encję niestandardową, która zależy od encji użytkownika. W rzeczywistości jest tak, że czułem, że sensowne jest wyświetlanie mojej formy podmiotu w formularzu profilu użytkownika:
Problem, który mam teraz, jest następujący; są 2 przyciski zapisu. A jeśli nie jest wystarczająco źle, przycisk zapisu dla użytkownika (dolny) już nie działa, a przycisk zapisu białej etykiety zapisuje tylko białą etykietę.
Formularz jest zmieniany w formularz użytkownika w następujący sposób:
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),
);
}
Miałem nadzieję przetasować niektóre parametry w $whitelabel_form
tablicy (która kiedyś działała w Drupal 7), ale ta tablica jest ogromna i nie mogłem znaleźć przycisków przesyłania i obsługi, których potrzebowałem.
Pytanie brzmi: czy można to zrobić? A jaki byłby to zalecany sposób?
Odpowiedzi:
Zamiast próbować robić swoje, powinieneś wypróbować moduł Inline Entity Form . Ten moduł jest przeznaczony do tego konkretnego przypadku (tworzenie / edytowanie encji w formularzach encji).
Wiem, że włożono w to wiele pracy, aby poprawić przepływ pracy w Drupal Commerce, co oznacza, że powinno to działać dobrze. Nie przetestowałem tego sam, ale ponieważ Drupal Commerce również od tego zależy w Drupal 8, powinien już być dość stabilny.
Moduł działa poprzez dodanie widżetu do pola referencyjnego encji, która tworzy formularz, więc powinno być w zasadzie plug and play. Jedynym wymaganiem jest, aby użytkownik miał odniesienie do Twojej jednostki niestandardowej.
źródło
Wierzę, że to powinno być możliwe. Niestety nie mam dzisiaj czasu na pisanie kodu, jednak myślę, że powinieneś pamiętać o następujących kwestiach:
form_id
iform_build_id
używane przez Drupal do rozpoznania, który formularz został przesłany.unset($sub_form['actions'])
przed dołączeniem podformularza do formularza głównego.#tree
formularz, aby można było przechwytywać wartości podformularza w osobnej kieszeni w zmiennej POST. Przykład:$form['#tree'] = TRUE; $form['sub-form'] = $sub_form;
Twoje wartości podformularza będą dostępne w$form_state['values']['sub-form']
.sub-form
wartości do$form_state['values']
(mam nadzieję, że rozumiesz, co mam na myśli).Mam nadzieję, że to pomoże! Brzmi jak diabli eksperymentu! Powodzenia.
źródło
form_build_id
,form_token
,form_id
aactions
wykonane przycisk zniknie i wykonane ponownie pracę „forma zewnętrzna”. Będę się z tym jeszcze bawić i dam znać, jak się udało.$form_state ['values']
(klucze elementów formularza są puste). Prawdopodobnie nie jest to możliwe (jeszcze), ale mam nadzieję, że kiedyś to rozwiążę.Teoretyczna odpowiedź (taka, która nie działa, ale jest to najbliższa odpowiedź). Publikowanie tutaj w celach informacyjnych i punkt wyjścia dla innych.
Zmień formularz użytkownika.
Prześlij obsługę:
źródło