Hook_form_FORM_ID_alter içinde düğüm nesnesinin alınması


13

Bu soruyu takip edin, ancak bir yorumda açıklama istemek için yeterli itibarım yok.

Ben Drupal 8 katkıda bulunan bir modül taşıma. Yukarıda belirtilen CR ve yazı üzerinde önerilen kod çalışmıyor:

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

$ Node değişkenine hiçbir şey yüklenmedi.

PHPStorm IDE'm getEntity () için bir uyarı veriyor: Drupal \ Core \ Form \ FormInterface sınıfında 'getEntity' yöntemi bulunamadı ... Konu sınıfında başvurulan yöntem bulunamadı.

Ayrıca kod tamamlama için bu yöntemi sunmamaktadır.

Kullanım nedeninde atıfta bulunuyorum:

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

Yanıtlar:


13

PhpStorm form nesnesi türü dinamik olarak bilmiyor ama iyi.

Mutlu etmek istiyorsanız, aşağıdaki gibi bir durumda sarın:

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

Her iki durumda da, doğru form değişikliğini uygularsanız kesinlikle çalışmalıdır. Bunu yapmazsanız, yalnızca bir düğüm nesnesi olmadan değil, ölümcül bir hatayla karşılaşmalısınız.

Daha spesifik bir cevap istiyorsanız, tam kodunuzu paylaşmanız gerekiyor, size söyleyebileceğim tek şey bu.


Teşekkürler Berdir. $ Düğümü D7 gibi düğüm nesnesi değil farkında değildi. Yani $ node-> nid çalışmıyor, ancak $ node-> Id () çalışıyor.
Bundio

7

Doğru cevap seçilmiş olmasına rağmen, bazı şeyleri açıklamaya ihtiyaç olduğunu hissediyorum:

  • Yöntem getFormObject()yalnızca tür formlarında kullanılabilir EntityForm.
  • Bunu yapıyorsanız hook_form_node_form_alter(), formun her zaman bir düğüm formu olduğunu bilirsiniz, böylece getEntity()form nesnesini güvenli bir şekilde çağırırsınız .
  • Ancak, genel bir hook_form_alter()kanca yapıyorsanız , doğru $form_idolup olmadığını veya form nesnesinin gerçekten bir NodeFormveya bir olup olmadığını denetlemek isteyebilirsiniz EntityForm. Bu, form bir varlık / düğüm formu değilse PHP hatalarını önler.
  • IDE ve kod tamamlama konusunda, IDE'nize $form_objectuğraştığınız kişinin bir NodeFormveya bir olduğunu söyleyebilirsiniz EntityForm. Bu, daha uygun ipuçları göstermesini sağlayacaktır.
/** @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
Hepsinden iyisi, açıklama için teşekkürler!
Dazag

2

IDE'nizin değişken türünün ne olduğunu ve neyin kullanılabilir olduğunu bilmesi için değişkenlerinizi ipucu yazmanız gerekir.

İpucu türü, parametre değişkeni adından önce eklenen değişken türüdür (aşağıdaki örnekte arrayve FormStateInterFace).

Misal:

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

Gönderme kancaları için, Drupal\Core\Form\FormStateInterfacetürü kullanmanız gerekir ... bu nedenle dosyanın üst kısmında bu sınıfı kullandığınızdan emin olun use Drupal\Core\Form\FormStateInterface;.

Drupal kodlama standartları, döküm yazmanızın yanı sıra docblock'daki türü açıklamanız gerektiğini belirtir. Ekstra çaba gelecekte yardımcı olur. ;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.