在hook_form_FORM_ID_alter中获取节点对象


13

跟进这个问题, 但是我没有足够的声誉在评论中要求澄清。

我正在将一个贡献模块移植到Drupal8。上述CR和发布中的摘要代码不起作用:

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

什么都没有加载到$ node变量中。

我的PHPStorm IDE对getEntity()发出警告:在类Drupal \ Core \ Form \ FormInterface中未找到方法'getEntity',在主题类中未找到...。

它也没有提供此方法来完成代码。

在使用原因中,我指的是:

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

Answers:


13

PhpStorm不知道表单对象的类型是动态的,但是还可以。

如果想让它开心,请将其包裹在以下条件中:

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

无论哪种方式,如果您实施正确的格式alter,它肯定都可以工作。如果不这样做,则不仅没有节点对象,还应该导致致命错误。

如果您需要更具体的答案,则需要共享确切的代码,这就是我所能告诉的。


谢谢伯迪尔。我不知道$ node不是D7中的节点对象。因此$ node-> nid不起作用,但是$ node-> Id()起作用。
Bundio

7

尽管选择了正确的答案,但我认为需要解释一些事情:

  • 该方法getFormObject()仅适用于type形式EntityForm
  • 如果您正在做hook_form_node_form_alter(),您就会知道表单始终是节点表单,因此可以安全地调用getEntity()表单对象。
  • 但是,如果要执行常规hook_form_alter()挂钩,则可能需要检查是否正确$form_id或检查表单对象实际上是a NodeForm还是an EntityForm。如果表单不是实体/节点表单,这将防止PHP错误。
  • 至于您的IDE和代码完成,您可以告诉您的IDE $form_object您正在处理的是a NodeForm或an EntityForm。这将使其显示更合适的提示。
/** @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
其中最好的,感谢您的澄清!
达扎格

2

为了让您的IDE知道变量类型是什么以及变量类型可用,您需要输入提示变量。

类型提示是在参数变量名之前添加的变量类型(在下面的示例array和中FormStateInterFace)。

例:

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

对于提交钩子,您应该使用Drupal\Core\Form\FormStateInterfacetype ...,因此在文件顶部请确保使用该类use Drupal\Core\Form\FormStateInterface;

Drupal编码标准指出,您应该键入cast并在docblock中解释类型。额外的努力将对将来有所帮助。;)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.