page.tpl.phpファイルがアクセスできる変数を作成するにはどうすればよいですか?


7

Drupal 7では、hook_node_loadを実装するモジュールがあります。これは、page.tpl.phpファイルで使用したい変数を作成します。現在ロードされているノードと同じタイプのノードの数であるとしましょう。今のところ、私は変数を次のようにグローバルにしています:

global $node_count;
$node_count = db_query("SELECT count FROM {node} WHERE type = :type", array(":type" => $node->type"))->fetchAll()[0]->count;

次に、私のpage.tpl.phpファイル内で、次のようなことを行う必要があります。

global $node_count;
echo "<p>$node_count</p>";

$node_count変数をスコープ内に、$nodeまたはそれと同じ方法で作成する方法があることを知ってい$userます。このテーマで見つけたチュートリアルには、テーマ関数全体を書き直すことが含まれているようです。複雑なことは何もしていません。.tpl.phpファイルのスコープでこの変数を作成する簡単な方法はありますか?関数のようなものですか?

回答:


6

Drupalテーマでは、テンプレート前処理関数は、特定のテンプレートで使用できる変数を準備する関数です。テンプレート前処理関数は次々に実行され、すべての変数を含む配列を渡します。独自のをの形式で、テーマのtemplate.phpに追加できますfunction THEMENAME_preprocess_TEMPLATENAME(&$variables) { // Your code here. }

hook_node_load実装のノードオブジェクトに値を追加する場合、おそらく次のようになります。

function mymodule_node_load($nodes, $types) {
  foreach ($nodes as $node) {
    $node->myvariable = 'somevalue';
  }
}

次に、page.tpl.phpの$ node-> myvariableにアクセスします。このため、Drupalは既にデフォルトで現在のノードオブジェクトを変数に追加しているため、前処理関数を記述する必要すらありません。(これはtemplate_prepocess_pageで発生します。)これは、これを単にpage.tpl.phpに追加できることを意味します。

<?php if ($node->myvariable): ?>
  <div class="myvariable">
    <?php print $node->myvariable; ?>
  </div>
<?php endif; ?>

私はこれを正しく理解していないかもしれませんが、これが私が望むものであるかどうかはよくわかりません。問題は、hook_node_load()関数内に変数を作成することです。これは私のテーマではなく、私のモジュール内にあります。themename_preprocess_pageでこれを行うことはできますか?もしそうなら、あなたは例を挙げられる可能性がありますか?ありがとう。
リボソーム

はい、わかりました。答えを更新します。
marcvangend

回答を更新しました。お役に立てば幸いです。
marcvangend

0

テンプレートファイルからアクセス可能な変数は、モジュールに実装できるプリプロセス関数で設定できます。

あなたのケースでは、あなたのモジュールは次のようなコードを実装するべきです( "mymodule"をあなたのモジュールの短い名前で置き換えてください):

function mymodule_preprocess_page(&$variables) {
  if (!empty($variables['node'])) {
    $variables['node_count'] = db_query("SELECT count FROM {node} WHERE type = :type", array(":type" => $variables['node']->type"))->fetchField();
  }
}

$variables['node']ページテンプレートはノードに関連付けられていないページにも使用されるため、空ではないことを確認します。
page.tpl.phpでは、を使用して前処理関数から同じ変数セットにアクセスし$node_countます。

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