Ottenere l'oggetto nodo in hook_form_FORM_ID_alter


13

Seguire questa domanda ma non ho abbastanza reputazione per chiedere chiarimenti in un commento.

Sto portando un modulo contribuito a Drupal 8. Il codice suggerito sul CR e sul post sopra menzionati non funziona:

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

Nulla viene caricato nella variabile $ node.

Il mio IDE PHPStorm fornisce un avviso per getEntity (): il metodo 'getEntity' non trovato nella classe Drupal \ Core \ Form \ FormInterface meno ... Il metodo di riferimento non si trova nella classe soggetto.

Inoltre non presenta questo metodo per il completamento del codice.

Nella causa d'uso mi riferisco:

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

Risposte:


13

PhpStorm non sa come il tipo di oggetto form sia dinamico ma va bene.

Se vuoi renderlo felice, avvolgilo in una condizione come:

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

In ogni caso, dovrebbe sicuramente funzionare se si implementa la modifica del modulo corretta. In caso contrario, si dovrebbe finire con un errore fatale non solo senza un oggetto nodo.

Devi condividere il tuo codice esatto se vuoi una risposta più specifica, questo è tutto ciò che posso dirti.


Grazie Berdir. Non ero a conoscenza $ node non è l'oggetto nodo come in D7. Quindi $ node-> nid non funziona, ma $ node-> Id () funziona.
Bundio,

7

Sebbene sia stata scelta la risposta corretta, sento che è necessario spiegare alcune cose:

  • Il metodo getFormObject()è disponibile solo su forme di tipo EntityForm.
  • Se lo stai facendo hook_form_node_form_alter(), sai che il modulo è sempre un modulo nodo, quindi puoi tranquillamente chiamare getEntity()l'oggetto modulo.
  • Tuttavia, se stai eseguendo un hook_form_alter()hook generale , potresti voler verificare la correttezza $form_ido verificare se l'oggetto modulo è effettivamente un NodeFormo un EntityForm. Ciò impedirà errori PHP se il modulo non è un modulo entità / nodo.
  • Per quanto riguarda il tuo IDE e il completamento del codice, puoi dire al tuo IDE che $form_objecthai a che fare con un NodeFormo un EntityForm. Ciò consentirà di mostrare suggerimenti più appropriati.
/** @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.
}

1
meglio di tutti, grazie per il chiarimento!
Dazag,

2

Affinché il tuo IDE sappia qual è il tipo di variabile e cosa è disponibile, è necessario digitare un suggerimento per le variabili.

Il suggerimento tipo è il tipo di variabile aggiunto prima del nome della variabile parametro (nell'esempio seguente arraye FormStateInterFace).

Esempio:

/**
 * 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...
}

Per gli hook di invio, dovresti usare il Drupal\Core\Form\FormStateInterfacetipo ... quindi nella parte superiore del file assicurati di usare quella classe use Drupal\Core\Form\FormStateInterface;.

Gli standard di codifica Drupal indicano che è necessario digitare cast e spiegare il tipo nel blocco documenti. Lo sforzo extra aiuta in futuro. ;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.