2つの異なるフック間で値を共有する


7

私のモジュールには2つのフック関数がhook_views_pre_render()ありhook_form_alter()ます。ではhook_views_pre_render()、使用可能なノードに関するデータを取得しますhook_form_alter()

からhook_views_pre_render()にデータを渡す方法を探していhook_form_alter()ます。シンプルに見えますが、うまく動作しません。誰かアイデアはありますか?

今のところ機能しているのはglobal $aVariable両方のフック関数に追加することですが、もっと良い方法があるはずだと思います。

回答:


3

あなたが使用することができますvariable_set($name, $value)し、variable_get($name, $default = NULL)


1
データがページごとに変化する場合、2人のユーザーが同じページを表示すると、このアプローチは奇妙に失敗します。
mpdonadio

form_alterはviews_pre_renderの前に呼び出されるため、共有したいデータがそこにないため、これを使用することにはなりませんでした。しかし、概念的にはvariable_setとgetを使用すると機能しますが、グローバルも機能します。
ダズ

このソリューションは、Webサイトにユーザーが1人しかいない場合にのみ機能します。シングルユーザーのウェブサイトにDrupalを使用しているのは誰ですか?また、遅いです。
rudolfbyker 2015

@rudolfbykerこれは、単一のユーザーに対してではなく、単一の値に対して機能すると言えます。そして、「単一の値」はシリアライズされたデータを使用できるため、議論の余地があります...そして、それは何と比較して遅いですか
Stefan

1. MPDの最初のコメントを参照してください。これは、variable_setがユーザーごとに一意の変数を設定するのではなく、データベースに書き込み、現在サイトにアクセスしているすべてのユーザーに対して変数が変更されるためです。2.データベースに影響を与えない他のソリューションと比較して遅い。
rudolfbyker 2015

8

Drupal 7では、格納された値が異なるページ間で永続的である必要がない場合、drupal_static()も使用できます。

drupal_static()通常はとして呼び出されdrupal_static(__FUNCTION__, $default_value)ますが、関数の名前を使用すると、を呼び出す関数からアクセスしたのと同じ値にアクセスできますdrupal_static()

使用するvariable_set()variable_get()値が異なるページ間の永続的であり、それは自動的に削除されません。最初のフックが次のようなコードを実行すると、2番目のモジュールは古い値を取得します。

if ($condition) {
  variable_set($variable_name, $value);
}

このようなコードを使用するのではなく、最初のフックは次のようなコードを実行する必要があります。

if ($condition) {
  variable_set($variable_name, $value);
}
else {
  variable_del($variable_name);
}

どの方法を選択する場合でも、値を読み取るフックが、その値を設定するフックの後に効果的に実行されていることを確認してください。


drupal_staticを使用して、hook_functions間で値を渡すことができると述べました。drupal_staticを使用して1つの関数に値を設定する明確な例を示すように回答を更新してから、そのデータを別の関数で呼び出すことができますか?
blue928 2013

また、変数が取得される前に変数セットが確実に実行されるようにする方法について詳しく説明できますか?フックに優先順位を付けて発砲するように、フックに「フック発砲の優先順位」または重みを与える方法はありますか?
blue928 2013

@ blue928いいえ、Drupalが最初に別のフックを呼び出すようにする方法はありません。同じフックの異なる実装を注文する方法があります。
kiamlaluno

どちらの場合も、フックはとdrupal_static()して呼び出され&drupal_static($value_name, $default_value)ます。値を設定する関数は通常__FUNCTION__として使用しますが$value_name、これは必須ではありません。関数が他の関数との競合を引き起こさない限り、ヘルプにプレフィックスを付けても、どんな値でも良い__FUNCTION__です。
kiamlaluno

0

あなたがでのみ利用可能な情報渡す必要がある場合hook_views_pre_renderhook_form_alter、グローバル変数を、あなたの最良の選択肢かもしれません。制限された役割を明確にするために名前を付けることが好ましい_mymodule_available_nodes

最善の方法は、2つの呼び出しに共通するオブジェクトにデータを追加することです。この場合、残念ながら共通点がないように見えるため、これは機能しません。

セッションデータを使用できる可能性がありますが、これはこのアプリケーションにとってはやり過ぎであり、グローバルに比べて明確な利点を提供していないようです。

variable_set / variable_getの使用はお勧めしません。variable_set呼び出しごとに変数キャッシュをクリアし、さらにすべての変数値がすべてのページ要求でフェッチされます。これは、絶えず変化し、サイズが大きくなる可能性のあるデータには適していません。


Drupal 7では、drupal_static()を使用できますか?
kalabro 2011

静的変数は関数に対してローカルですが、呼び出し間で値を保持します。OPは関数間で通信する方法を必要としているため、これは適用されません。drupal_staticは、定義関数の外部からリセットおよび操作できる静的データを格納する方法を提供します。
Keithm

2
が返す変数drupal_static()はに対してローカルdrupal_static()ですが、関数は参照によって変数の値を返します。つまり、呼び出し元の関数は、の静的ローカル変数であっても、変数の値を変更できますdrupal_static()
kiamlaluno
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.