Tengo una entidad personalizada, que depende de la entidad del usuario. De hecho, depende de que me parezca lógico mostrar mi formulario de entidad dentro del formulario de perfil de usuario:
El problema que tengo ahora es el siguiente; Hay 2 botones de guardar. Y si no es lo suficientemente malo, el botón Guardar para el usuario (el inferior) ya ni siquiera funciona y el botón Guardar etiqueta blanca solo guarda la entidad de etiqueta blanca.
El formulario se modifica en el formulario de usuario de esta manera:
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),
);
}
Esperaba mezclar algunos parámetros en la $whitelabel_form
matriz (que solía funcionar en Drupal 7), pero esa matriz es enorme y no pude encontrar los botones de envío y el controlador que necesitaba.
Entonces la pregunta es, ¿se puede hacer esto? ¿Y cuál sería la forma recomendada de hacerlo?
Respuestas:
En lugar de intentar hacer lo suyo, debería probar el módulo de formulario de entidad en línea . Este módulo está hecho para este caso específico (creación / edición de entidades dentro de formularios de entidad).
Sé que se ha trabajado mucho para mejorar el flujo de trabajo en Drupal Commerce, lo que significa que debería funcionar bien. No lo he probado yo mismo, pero dado que Drupal Commerce también depende de él en Drupal 8, ya debería ser bastante estable.
El módulo funciona agregando un widget al campo de referencia de entidad que crea el formulario, por lo que debería ser bastante plug and play. El único requisito es que el usuario tenga una referencia a su entidad personalizada.
fuente
Creo que esto debería ser posible. Desafortunadamente, no tengo tiempo para escribir código hoy, sin embargo, creo que debe tener en cuenta lo siguiente:
form_id
yform_build_id
utilizado por Drupal para reconocer qué forma se presentó.unset($sub_form['actions'])
antes de agregar el subformulario al formulario principal.#tree
el formulario para que pueda capturar los valores del subformulario en un bolsillo separado en la variable POST. Ejemplo,$form['#tree'] = TRUE; $form['sub-form'] = $sub_form;
esto hará que sus valores de subformulario estén disponibles en$form_state['values']['sub-form']
.sub-form
valores$form_state['values']
(espero que entienda lo que quiero decir).¡Espero eso ayude! ¡Suena como un gran experimento! Buena suerte.
fuente
form_build_id
,form_token
,form_id
yactions
realizado el botón desaparecerá y el trabajo realizado 'forma externa' de nuevo. Jugaré con esto un poco más y les diré cómo funcionó.$form_state ['values']
(las claves del elemento de formulario están vacías). Probablemente no sea posible (todavía), pero espero resolver esto algún día.La respuesta teórica (una que no funciona, pero esta es la más cercana que obtuve). Publicando aquí para referencia y un punto de partida para otros.
Alterar el formulario de usuario.
Enviar manejador:
fuente