web-dev-qa-db-ja.com

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

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ファイルのスコープでこの変数を作成する簡単な方法はありますか?関数のようなものですか?

7
rybosome

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

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; ?>
6
marcvangend

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

あなたのケースでは、モジュールは次のようなコードを実装する必要があります(「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を使用して、前処理関数から同じ変数セットにアクセスします。

0
kiamlaluno