Drupal 7でノードテンプレートの「属性」としてフィールドを使用するためのベストプラクティスは何ですか?ここでは「属性」という用語を大まかに使用して、HTMLフラグメントとして具体的にレンダリングできないものを意味しています。むしろ、テンプレートのどこかにあるHTMLフラグメント内にレンダリングされます。
フィールドAPIを使用すると、「コンテンツ」フィールドをHTMLで非常に簡単にラップできるため、テンプレートでレンダリングできます。レンダーツリーが機能するため、ノードテンプレートを編集する必要はありません。
次のようなコンテンツタイプを検討します。
- タイトル(title)
- ボディ(ボディ)
- 追加(field_extra)
ここで、field_extraは、ノードのタイトルに付け加えたいものです。たとえば、
<?php if (!$page && $title): ?>
<h2><?php print $title ?> — <?php print $extra; ?></h2>
<?php endif; ?>
print render($content);
これは、私が話していることを説明するための非常に単純化された例です。
アクセスできた
$extra = trim($field_extra[0]["safe_value"]);
しかし、どのように構成され、フィールドに直接アクセスすることが推奨されないかによって、show() / hide()ロジックを経由する必要があります。
私が作ることができるtheme_fieldを() 、など
function mytheme_field__field_extra ($variables)
{
$items = $variables["items"];
return count($items) == 0 ? "" : trim(drupal_render($items[0]));
}
次にrender()を使用しますが、それでもshow()/ hide()シェナンガンを実行する必要があり、フィールドを実際にレンダリングするのではなく、どこかで使用するためにプレーンバージョンを取得しようとしています。
または、これがtemplate_preprocess_node()によって本当に処理されるべきか、例えば
function mytheme_preprocess_node (&$variables)
{
$node = $variables["node"];
$language = $node->language;
if (isset($variables["field_extra"])
&& isset($variables["field_extra"][$language])
&& isset($variables["field_extra"][$language][0])) {
$variables["extra"] = trim($variables["field_extra"][$language][0]["safe_value"]);
}
}
私はこれらすべてがうまくいくことを知っています。私はここでのベストプラクティスに本当に興味があります。template_preprocess_node()がこれを処理する最良の方法だと思いますが、このケースについて決定的なものは何も見ていません。
ありがとう。