Cara menyembunyikan judul halaman berdasarkan jenis simpul menggunakan template_preprocess_page ()

10

Saya mencoba untuk menyembunyikan judul halaman saat ini (seperti yang dicetak oleh page.tpl.php) jika halaman saat ini adalah 1) sebuah node dalam tampilan penuh (sebagai lawan dari mode teaser), DAN 2) jenis node adalah konser atau bio . Saya mencetak judul simpul untuk jenis konten ini secara langsung dalam konten simpul, jadi saya ingin menyembunyikan duplikat yang dicetak oleh page.tpl.php. Saya tidak bisa mendapatkan ini berfungsi langsung di page.tpl.php, dan bacaan saya menyarankan praktik terbaik adalah menangani logika template di template.php menggunakan fungsi preprocess dan proses. Jadi, saya mencoba menyembunyikan judul halaman saat ini (dengan 2 kondisi di atas) menggunakan template_preprocess_page(). Ini kode saya.

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

Saya membaca Bagaimana cara menguji jenis simpul untuk mencetak variabel dari template.php? dan halaman dokumentasi untuk template_preprocess_page(), dan berbagai situs lain, tapi sepertinya saya tidak bisa membuatnya berfungsi. Saya melihat saran bahwa Anda harus menelepon isset()pada $variables['node']sebelum pengujian untuk jenis node, tapi itu tidak berhasil. Saya tidak melihat solusi yang jelas diposting di mana pun, dan saya pada akhir kecerdasan saya.

diekunstderfuge
sumber

Jawaban:

9

dan bacaan saya menyarankan praktik terbaik adalah menangani logika templat di templat.php menggunakan fungsi preprocess dan proses.

Memisahkan logika dari kode rendering berarti kode di template.php menetapkan variabel yang diperiksa dalam file template. Dengan cara ini, logikanya semua terkandung dalam file template.php, sedangkan kode rendering semuanya ada dalam file template.

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()tidak berfungsi karena $variables['title']merupakan string, bukan array render. hide()selalu digunakan dengan array rendering, dan tidak memiliki efek dengan string, bahkan ketika string dilewatkan ke render().
Sebenarnya, meneruskan string (atau nilai apa pun yang bukan referensi ke variabel yang berisi array) hide()akan menyebabkan kesalahan PHP, karena fungsi menggunakan kode ini.

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

Mengecewakan $variables['title']dengan unset($variables['title'])tidak berfungsi juga, karena template_process_page()akan mendapatkan judul halaman dari drupal_get_title().

if (!isset($variables['title'])) {
  $variables['title'] = drupal_get_title();
}
kiamlaluno
sumber
Tentu saja Anda juga dapat mengubah $titlevariabel aktual dengan mytheme_process_page(&$variables) { $title = false; }.
RobW
4
@RobW itu akan menjadi mytheme_process_page(&$variables) { $variables['title'] = false; }dan itu bekerja BTW.
Duncanmoo
Catatan lain tentang ini; selama tema Anda membungkus di <?php print $title; ?>dalam <?php if (!$title_hidden): ?>Anda hanya dapat mengatur$variables['title_hidden'] = TRUE;
Duncanmoo
2

Anda dapat mengelola ini menggunakan drupal_set_title ().

function mytheme_preprocess_page(&$vars){
    if (isset($vars['node']) && $vars['node']->type == 'news'){
        drupal_set_title('');
    }
}
mohit_rocks
sumber
Ini tidak berhasil untuk saya. Mungkinkah ada hal lain yang mengesampingkan template_preprocess_page()? Saya telah menggunakan modul Theme Developer untuk memeriksa judul halaman duplikat dan mengonfirmasi bahwa itu dipanggil dari page.tpl.php. Haruskah saya berpikir untuk menghapus judul dari page.tpl.phpdan kemudian ADD itu kembali di tempat yang saya inginkan template_preprocess_page()? Saya ingin judul ditampilkan, misalnya, ketika halaman berisi tampilan node, tetapi tidak ketika halaman adalah satu node dari tipe / tipe tertentu.
diekunstderfuge
1
Ini juga bisa menghilangkan informasi penting dari pengunjung menggunakan pembaca layar. Itu juga menghapus judul halaman di tab pengguna. Pikirkan aksesibilitas sejak awal.
Rick
1

Coba ini dengan asumsi kondisi Anda benar :)

 function MYTHEME_preprocess_page(&$variables) {
        if (!empty($variables['node']) && $variables['node']->type == 'concert') {
            unset($variables['title']);
        }
    }
junedkazi
sumber
Tidak berfungsi: template_process_page () akan diset $variables['title']dengan nilai yang dikembalikan drupal_get_title().
kiamlaluno
0

Cara yang tidak terlalu rumit adalah dengan mencetak ini di page.tpl.php Anda

<?php hide($title); ?>

Tetapi jika Anda ingin menjadi dinamis saya sarankan untuk menggunakan preprocess_pageseperti yang disarankan oleh orang lain.

ninjascorner
sumber
1
Itu tidak bekerja. hide()digunakan dengan rendering array, bukan string.
kiamlaluno
0

Di CSS, saya melakukan ini dengan tema saya

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

Seperti yang direkomendasikan oleh http://www.alistapart.com/articles/now-you-see-me/

Mengapa? Karena Anda masih ingin memiliki tajuk dan h1 'terlihat' oleh pembaca layar untuk aksesibilitas. Jika Anda hanya menghilangkan nilai H1, Anda merampok pengunjung buta dan low vision Anda dari beberapa informasi yang berpotensi penting.

Rick
sumber
Ini tidak akan berfungsi. Mengapa? Karena Anda tidak dapat menambahkan CSS bersyarat tanpa bantuan dari situs pemrograman n
AyeshK
Drupal menambahkan kelas ke elemen seperti 'depan' yang digunakan di atas. Bagi saya sendiri, saya perlu menyembunyikan judul di halaman depan tetapi membiarkannya 'terlihat' oleh pembaca layar. Oleh karena itu, saya dapat menggunakan logika aturan cascading untuk secara jelas mendefinisikan kapan saya membutuhkannya disembunyikan dari pengguna yang terlihat dan ketika saya tidak.
Rick
0

saran dari mytheme_preprocess_page bekerja untuk saya tetapi jika digunakan$vars['title_hidden'] = TRUE;

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

Fungsi yang benar adalah

function mytheme_preprocess_node(&$vars) {
}

dari pada

function mytheme_preprocess_page(&$vars) {
}
Paolo Marcolli
sumber