Obtener el objeto de nodo en hook_form_FORM_ID_alter

13

Siga esta pregunta, pero no tengo suficiente reputación para pedir aclaraciones en un comentario.

Estoy portando un módulo contribuido a Drupal 8. El código sugerido en el CR y la publicación mencionados anteriormente no funciona:

$node = $form_state->getFormObject()->getEntity();

Nada se carga en la variable $ node.

Mi IDE de PHPStorm da una advertencia para getEntity (): el método 'getEntity' no se encuentra en la clase Drupal \ Core \ Form \ FormInterface menos ... El método referenciado no se encuentra en la clase de materia.

Tampoco presenta este método para completar el código.

En la causa de uso, estoy haciendo referencia a:

use Drupal\Core\Entity;
use Drupal\Core\Entity\EntityInterface;
use Drupal\node\Entity\Node;
use Drupal\Core\Render\Element;
Bundio
fuente

Respuestas:

13

PhpStorm no sabe como el tipo de objeto de formulario es dinámico pero está bien.

Si quieres hacerlo feliz, envuélvelo en una condición como:

if ($form_state->getFormObject() instanceof EntityForm) {
  ...
}

De cualquier manera, definitivamente debería funcionar si implementa la forma correcta. Si no lo hace, debería terminar con un error fatal no solo sin un objeto de nodo.

Necesitas compartir tu código exacto si quieres una respuesta más específica, eso es todo lo que puedo decirte.

Berdir
fuente
Gracias Berdir No sabía que $ node no es el objeto de nodo como en D7. Entonces $ node-> nid no funciona, pero $ node-> Id () sí.
Bundio
7

Aunque se eligió la respuesta correcta, creo que es necesario explicar algunas cosas:

  • El método getFormObject()solo está disponible en formas de tipo EntityForm.
  • Si lo está haciendo hook_form_node_form_alter(), sabe que el formulario es siempre un formulario de nodo, por lo que está seguro de invocar getEntity()el objeto del formulario.
  • Sin embargo, si está haciendo un hook_form_alter()enlace general , es posible que desee $form_idverificar si es correcto o si el objeto del formulario es realmente un NodeFormo un EntityForm. Esto evitará errores de PHP si el formulario no es un formulario de entidad / nodo.
  • En cuanto a su IDE y la finalización del código, puede decirle a su IDE que el $form_objectque está tratando es un NodeFormo un EntityForm. Esto hará que muestre pistas más apropiadas.
/** @var \Drupal\Core\Entity\EntityForm $form_object */
$form_object = $form_state->getFormObject();
if ($form_object instanceof EntityForm) {
  $entity = $form_object->getEntity();
  // Do something with the entity.
}
Jigarius
fuente
1
lo mejor de todo, gracias por la aclaración!
Dazag
2

Para que su IDE sepa cuál es el tipo de variable y qué está disponible para ello, debe escribir una pista sobre sus variables.

La sugerencia de tipo es el tipo de variable agregado antes del nombre de la variable del parámetro (en el ejemplo a continuación arrayy FormStateInterFace).

Ejemplo:

/**
 * On form submit, do something.
 *
 * @param array
 *   The form array.
 *
 * @param \Drupal\Core\Form\FormStateInterface
 *   The form state array.
 */
function _submit_hook_name(array $form, FormStateInterface $form_state) {
  $node = $form_state->getFormObject();
  // Do something...
}

Para enviar enlaces, debe usar el Drupal\Core\Form\FormStateInterfacetipo ... por lo tanto, en la parte superior del archivo, asegúrese de usar esa clase use Drupal\Core\Form\FormStateInterface;.

Los estándares de codificación de Drupal establecen que debe escribir cast y explicar el tipo en el docblock. El esfuerzo extra ayuda en el futuro. ;)

Seb
fuente