template_preprocess_page()を使用してノードタイプに基づいてページタイトルを非表示にする方法


10

page.tpl.php現在のページが1)(ティーザーモードではなく)フルディスプレイのノードであり、かつ2)ノードタイプがコンサートまたはバイオである場合、現在のページのタイトルを(によって印刷されるように)非表示にしようとしています。これらのコンテンツタイプのノードタイトルをノードコンテンツに直接出力するので、page.tpl.phpによって出力されている重複を非表示にしたいと思います。これをpage.tpl.phpで直接動作させることはできません。私の読書では、プリプロセスおよびプロセス関数を使用して、template.phpでテンプレートロジックを処理することをお勧めします。したがって、私は(上記の2つの条件で)現在のページタイトルを非表示にしようとしていますtemplate_preprocess_page()。これは私のコードです。

<?php
    function MYTHEME_preprocess_page(&$variables) {
        if (!empty($variables['node']) && $variables['node']->type == 'concert') {
            hide($variables['title']);
        }
    }
?>

ノードタイプをテストしてtemplate.phpから変数を出力するにはどうすればよいですか?template_preprocess_page()、およびその他のさまざまなサイトのドキュメントページですが、これを機能させることができないようです。私はあなたが呼び出すために持っていることを示唆見たisset()上で$variables['node']ノードタイプを調べる前に、それはどちらか動作しませんでした。明確な解決策がどこにも投稿されていなかったので、私はもうすぐ終わりです。

回答:


9

そして私の読書は、ベストプラクティスは、プリプロセスおよびプロセス関数を使用して、template.phpでテンプレートロジックを処理することであることを示唆しています。

ロジックをレンダリングコードから分離するとは、template.phpのコードがテンプレートファイルでチェックされる変数を設定することを意味します。このようにして、ロジックはすべてtemplate.phpファイルに含まれ、レンダリングコードはすべてテンプレートファイルに含まれます。

template.php

function mytheme_preprocess_page(&$variables) {
  if (!empty($variables['node']) && $variables['node']->type == 'concert') {
    $variables['show_title'] = FALSE;
  }
}

page.tpl.php

<?php if ($show_title && $title): ?><h1 class="title" id="page-title"><?php print $title; ?></h1><?php endif; ?>

hide()$variables['title']文字列であり、レンダリング配列ではないため、機能しません。hide()は常にレンダリング配列で使用され、文字列がに渡された場合でも、文字列には影響しませんrender()
実際、hide()関数がこのコードを使用しているため、文字列(または配列を含む変数への参照ではない値)を渡すと、PHPエラーが発生します。

function hide(&$element) {
  $element['#printed'] = TRUE;
  return $element;
}

からのページタイトルの取得と同様に、unset $variables['title']with unset($variables['title'])も機能しません。template_process_page()drupal_get_title()

if (!isset($variables['title'])) {
  $variables['title'] = drupal_get_title();
}

もちろん、実際の$title変数をで変更することもできますmytheme_process_page(&$variables) { $title = false; }
RobW

4
@RobWはmytheme_process_page(&$variables) { $variables['title'] = false; }BTW であり、動作します。
Duncanmoo 2013

これに関する別の注意事項。テーマがラップ<?php print $title; ?>インされている限り、<?php if (!$title_hidden): ?>簡単に設定できます$variables['title_hidden'] = TRUE;
Duncanmoo

2

drupal_set_title()を使用してこれを管理できます。

function mytheme_preprocess_page(&$vars){
    if (isset($vars['node']) && $vars['node']->type == 'news'){
        drupal_set_title('');
    }
}

これは私にはうまくいきませんでした。何か他のものがオーバーライドできますtemplate_preprocess_page()か?Theme Developerモジュールを使用して、重複するページタイトルを検査し、それがから呼び出されていることを確認しましたpage.tpl.php。からタイトルを削除し、page.tpl.php使用したい場所に再度追加することを検討する必要がありtemplate_preprocess_page()ますか?たとえば、ページにノードのビューが含まれている場合にタイトルをレンダリングしますが、ページが特定のタイプの単一ノードである場合はレンダリングしません。
diekunstderfuge 2012

1
これにより、スクリーンリーダーを使用している訪問者から重要な情報が取り除かれる可能性もあります。また、[ユーザー]タブでページのタイトルを削除します。最初からアクセシビリティを考えてください。
Rick、

1

if条件が正しいと仮定してこれを試してください:)

 function MYTHEME_preprocess_page(&$variables) {
        if (!empty($variables['node']) && $variables['node']->type == 'concert') {
            unset($variables['title']);
        }
    }

これは機能しません。template_process_page()$variables['title']、から返された値を設定しますdrupal_get_title()
kiamlaluno

0

それほど複雑ではない方法は、これをpage.tpl.phpに印刷することです。

<?php hide($title); ?>

しかし、動的にしたい場合preprocess_pageは、他の人が提案したようにを使用することをお勧めします。


1
動作しません。hide()文字列ではなくレンダリング配列で使用されます。
kiamlaluno

0

CSSでは、これを自分のテーマに合わせて行いました

/*    Front Page - hide title  */
body.front header h1 {
 position: absolute; 
 left: -999em;    
}

http://www.alistapart.com/articles/now-you-see-me/の推奨通り

どうして?アクセシビリティのために、ヘッダーとh1をスクリーンリーダーに「可視」にしたいからです。H1の値を単純に取り除くと、視覚障害のある訪問者を潜在的に重要な情報から奪うことになります。


これは機能しません。どうして?プログラミングサイトnの助けがなければ条件付きCSSを追加できないため
AyeshK

Drupalは、上記で使用された 'front'などの要素にクラスを追加します。私自身、フロントページのタイトルを非表示にする必要がありますが、スクリーンリーダーには「表示」のままにしておきます。したがって、カスケードルールのロジックを使用して、目の見えるユーザーから非表示にする必要がある場合と非表示にする必要がある場合を明確に定義できます。
Rick

0

mytheme_preprocess_pageの提案は私にとってはうまくいきますが、使用されている場合$vars['title_hidden'] = TRUE;

function mytheme_preprocess_page(&$vars) {
  if (isset($vars['node']->type) && $vars['node']->type == 'type') {
    $vars['title_hidden'] = TRUE;
  }
}

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