Eu tenho uma entidade personalizada, dependendo da entidade do usuário. De fato, é assim mesmo, dependendo do que achei que fazia sentido exibir meu formulário de entidade no formulário de perfil de usuário:
O problema que estou tendo agora é o seguinte; existem 2 botões de salvamento. E se não for ruim o suficiente, o botão Salvar do usuário (o inferior) nem funciona mais e o botão Salvar etiqueta branca salva apenas a entidade de etiqueta branca.
O formulário é alterado para o formulário do usuário assim:
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),
);
}
Eu esperava embaralhar alguns parâmetros na $whitelabel_form
matriz (que funcionavam no Drupal 7), mas essa matriz é enorme e não consegui encontrar os botões de envio e o manipulador necessários.
Então a questão é: isso pode ser feito? E qual seria a maneira recomendada de fazer isso?
Respostas:
Em vez de tentar fazer o que quiser, tente o módulo Inline Entity Form . Este módulo foi criado para este caso específico (criação / edição de entidades nos formulários da entidade).
Sei que muito trabalho foi feito para melhorar o fluxo de trabalho no Drupal Commerce, o que significa que isso deve estar funcionando bem. Eu mesmo não testei, mas como o Drupal Commerce depende disso no Drupal 8, ele já deve estar bem estável.
O módulo funciona adicionando um widget ao campo de referência da entidade que cria o formulário, portanto deve ser praticamente plug and play. O único requisito é que o usuário tenha uma referência à sua entidade personalizada.
fonte
Eu acredito que isso deveria ser possível. Infelizmente, não tenho tempo para escrever hoje, no entanto, acho que você deve ter em mente o seguinte:
form_id
eform_build_id
usados pelo Drupal para reconhecer qual formulário foi enviado.unset($sub_form['actions'])
antes de anexar o subformulário ao formulário principal.#tree
o formulário para poder capturar os valores do sub-formulário em um bolso separado na variável POST. Exemplo,$form['#tree'] = TRUE; $form['sub-form'] = $sub_form;
Isso disponibilizará seus valores de subformulário em$form_state['values']['sub-form']
.sub-form
valores$form_state['values']
(espero que você entenda o que quero dizer).Espero que ajude! Parece um inferno de um experimento! Boa sorte.
fonte
form_build_id
,form_token
,form_id
eactions
fez o botão desaparecer e fez o trabalho 'forma exterior' novamente. Vou brincar um pouco mais e informar como tudo deu certo.$form_state ['values']
(as chaves do elemento do formulário estão vazias). Provavelmente ainda não é possível, mas espero descobrir isso algum dia.A resposta teórica (que não funciona, mas essa é a mais próxima que cheguei). Postando aqui para referência e um ponto de partida para outros.
Altere o formulário do usuário.
Enviar manipulador:
fonte