hook_form_FORM_ID_alterでノードオブジェクトを取得する


13

この質問にフォローアップします が、コメントで説明を求めるのに十分な評判がありません。

寄稿されたモジュールをDrupal 8に移植しています。上記のCRおよび投稿で推測されたコードは機能していません。

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

$ node変数には何もロードされません。

PHPStorm IDEがgetEntity()に対して警告を表示します。メソッド 'getEntity'がクラスDrupal \ Core \ Form \ FormInterfaceで見つかりませんless ...参照メソッドがサブジェクトクラスで見つかりません。

また、コード補完のためにこのメソッドを提示していません。

使用原因では、私は参照しています:

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

回答:


13

PhpStormは、フォームオブジェクトのタイプが動的であるために知りませんが、それは問題ありません。

それを幸せにしたい場合は、次のような状態でラップします。

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

いずれにしても、正しい形式の変更を実装すれば、確実に機能するはずです。そうしないと、ノードオブジェクトがないだけでなく、致命的なエラーが発生するはずです。

より具体的な回答が必要な場合は、正確なコードを共有する必要があります。それだけです。


ありがとうBerdir。私は、$ nodeがD7のようなノードオブジェクトではないことを知りませんでした。したがって、$ node-> nidは機能しませんが、$ node-> Id()は機能します。
ブンディオ

7

正しい答えが選択されましたが、いくつかのことを説明する必要があると感じています。

  • このメソッドgetFormObject()は、typeのフォームでのみ使用可能ですEntityForm
  • を実行している場合hook_form_node_form_alter()、フォームは常にノードフォームであることがわかっているのでgetEntity()、フォームオブジェクトを呼び出しても安全です。
  • ただし、一般的なhook_form_alter()フックを実行している場合は、正しいことを$form_id確認するか、フォームオブジェクトが実際にa NodeFormまたはaであるかどうかを確認することができEntityFormます。フォームがエンティティ/ノードフォームでない場合、これによりPHPエラーが防止されます。
  • あなたのIDEやコード補完用として、あなたはあなたのことをIDEに伝えることができ$form_object、あなたが扱っているがありますNodeFormEntityForm。これにより、より適切なヒントが表示されます。
/** @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\FormStateInterfaceタイプを使用する必要があります。したがって、ファイルの上部で、必ずそのクラスを使用してくださいuse Drupal\Core\Form\FormStateInterface;

Drupalのコーディング標準では、docblockで型を説明し、型を説明する必要があると述べています。余分な努力は将来的に役立ちます。;)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.