Pregunta:
Quiero que el campo de título de cada nuevo nodo del tipo de contenido de Agenda se construya automáticamente a partir de un campo de fecha en ese mismo nodo.
He tratado de diversas maneras estableciendo el #default_value
y #value
en la $form
array en hook_form_FORM_ID_alter()
pero sin efecto.
¿Cómo puedo conseguir esto?
Respuesta:
A continuación, se explica cómo hacerlo con una devolución de llamada del generador de entidades.
<?php
use Drupal\Core\Form\FormStateInterface;
use Drupal\node\NodeInterface;
//Implements hook_form_FORM_ID_alter()
function agenda_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id) {
$form['title']['#access'] = FALSE;
$form['#entity_builders'][] = 'agenda_node_builder';
}
function agenda_node_builder($entity_type, NodeInterface $node, $form, FormStateInterface $form_state)
{
$date_of_meeting = $node->field_date_of_meeting->date->format('Y-m-d');
$node->setTitle('Agenda for meeting on '.$date_of_meeting);
}
Notas:
-
Descubrí que la devolución de llamada tenía que configurarse en
hook_form_BASE_FORM_ID_alter()
lugar dehook_form_FORM_ID_alter
en cuyo caso no se llamó.
No llegué al fondo de esto, pero probablemente tenga algo que ver con el hecho de que los ganchoshook_form_alter()
se llaman en el siguiente orden:hook_form_alter()
,hook_form_BASE_FORM_ID_alter()
,hook_form_FORM_ID_alter()
. -
Node
#entity_builders
Node
ofrecen un objeto de entidad deNode
para su modificación antes de ser almacenado cuando finalmente se envía el formulario.
Gracias a @Berdir por los consejos.