Obtendo o Objeto do Nó no hook_form_FORM_ID_alter

13

Acompanhe esta pergunta, mas não tenho reputação suficiente para pedir esclarecimentos em um comentário.

Estou portando um módulo contribuído para o Drupal 8. O código sugerido no CR e na postagem acima mencionados não está funcionando:

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

Nada é carregado na variável $ node.

Meu IDE PHPStorm emite um aviso para getEntity (): O método 'getEntity' não foi encontrado na classe Drupal \ Core \ Form \ FormInterface less ... O método referenciado não foi encontrado na classe de assunto.

Também não está apresentando esse método para conclusão de código.

Na causa de uso, estou referenciando:

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

Respostas:

13

PhpStorm não sabe como o tipo de objeto de formulário é dinâmico, mas está bem.

Se você quiser fazê-lo feliz, envolva-o em uma condição como:

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

De qualquer forma, ele definitivamente funcionará se você implementar a forma correta alter. Caso contrário, você deve acabar com um erro fatal, não apenas sem um objeto de nó.

Você precisa compartilhar seu código exato se quiser uma resposta mais específica, é tudo o que posso lhe dizer.

Berdir
fonte
Obrigado Berdir. Eu não sabia que $ node não é o objeto do nó como no D7. Portanto, $ node-> nid não funciona, mas $ node-> Id () funciona.
Bundio
7

Embora a resposta correta tenha sido escolhida, sinto que há necessidade de explicar algumas coisas:

  • O método getFormObject()está disponível apenas em formulários do tipo EntityForm.
  • Se você estiver fazendo hook_form_node_form_alter(), sabe que o formulário é sempre um nó, portanto você está seguro chamando getEntity()o objeto de formulário.
  • No entanto, se você estiver usando um hook_form_alter()gancho geral , convém verificar o correto $form_idou se o objeto do formulário é realmente um NodeFormou um EntityForm. Isso evitará erros de PHP se o formulário não for um formulário de entidade / nó.
  • Quanto à conclusão do seu IDE e código, você pode dizer ao seu IDE que $form_objectvocê está lidando com um NodeFormou um EntityForm. Isso fará com que ele mostre dicas mais apropriadas.
/** @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
fonte
1
o melhor de todos, obrigado pelo esclarecimento!
Dazag
2

Para que seu IDE saiba qual é o tipo de variável e o que está disponível, é necessário digitar dicas de suas variáveis.

A dica de tipo é o tipo de variável adicionado antes do nome da variável de parâmetro (no exemplo abaixo arraye FormStateInterFace).

Exemplo:

/**
 * 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 ganchos, você deve usar o Drupal\Core\Form\FormStateInterfacetipo ... portanto, na parte superior do arquivo, certifique-se de usar essa classe use Drupal\Core\Form\FormStateInterface;.

Os padrões de codificação do Drupal afirmam que você deve digitar cast e explicar o tipo no docblock. O esforço extra ajuda no futuro. ;)

Seb
fonte