วิธีซ่อนชื่อหน้าตามประเภทโหนดโดยใช้ template_preprocess_page ()


10

ฉันกำลังพยายามที่จะซ่อนชื่อของหน้าปัจจุบัน (ตามที่พิมพ์ด้วยpage.tpl.php) ถ้าหน้าปัจจุบันคือ 1) โหนดในการแสดงเต็มรูปแบบ (เมื่อเทียบกับโหมดทีเซอร์) และ 2) ประเภทโหนดเป็นทั้งคอนเสิร์ตหรือชีวภาพ ฉันพิมพ์ชื่อโหนดสำหรับประเภทเนื้อหาเหล่านี้โดยตรงในเนื้อหาโหนดดังนั้นฉันต้องการซ่อนสิ่งที่ซ้ำกันที่ถูกพิมพ์โดย page.tpl.php ฉันไม่สามารถใช้งานได้โดยตรงใน page.tpl.php และการอ่านของฉันชี้ให้เห็นว่าวิธีปฏิบัติที่ดีที่สุดคือการจัดการกับแม่แบบตรรกะใน template.php โดยใช้ฟังก์ชั่น preprocess และกระบวนการ ดังนั้นฉันกำลังพยายามที่จะซ่อนชื่อหน้าปัจจุบัน (ที่มีมากกว่า 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 โดยใช้ฟังก์ชั่น preprocess และกระบวนการ

การแยกลอจิกออกจากรหัสการแสดงผลนั้นหมายถึงว่ารหัสใน 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;
}

unsetting $variables['title']กับ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

ทราบเพิ่มเติมเกี่ยวกับเรื่องนี้; ตราบใดที่ธีมของคุณห่อ<?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()หรือไม่ page.tpl.phpผมเคยใช้โมดูลธีมสำหรับนักพัฒนาในการตรวจสอบชื่อหน้าซ้ำกันและยืนยันว่ามันจะถูกเรียกจาก ฉันควรจะคิดเกี่ยวกับการลบชื่อจากpage.tpl.phpนั้นใส่มันกลับมาที่ฉันต้องการได้โดยใช้template_preprocess_page()? ฉันต้องการให้หัวเรื่องแสดงผลตัวอย่างเช่นเมื่อเพจมีมุมมองของโหนด แต่ไม่เมื่อเพจนั้นเป็นโหนดเดียวของบางประเภท / บางประเภท
diekunstderfuge

1
นอกจากนี้ยังสามารถดึงข้อมูลสำคัญจากผู้เข้าชมโดยใช้โปรแกรมอ่านหน้าจอ นอกจากนี้ยังตัดแถบหัวเรื่องของหน้าในแท็บผู้ใช้ คิดว่าการช่วยสำหรับการเข้าถึงตั้งแต่เริ่มต้น
ริค

1

ลองสมมติว่าเงื่อนไขของคุณถูกต้อง :)

 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 คุณจะปล้นผู้ที่มองเห็นไม่เห็นและสายตาที่มองเห็นข้อมูลสำคัญบางอย่าง


สิ่งนี้จะไม่ทำงาน ทำไม? เนื่องจากคุณไม่สามารถเพิ่ม CSS แบบมีเงื่อนไขโดยไม่ได้รับความช่วยเหลือจากการเขียนโปรแกรมไซต์ n
AyeshK

Drupal เพิ่มคลาสให้กับองค์ประกอบต่างๆเช่น 'ด้านหน้า' ที่ใช้ด้านบน สำหรับตัวฉันเองฉันต้องซ่อนชื่อไว้ที่หน้าแรก แต่ปล่อยให้ 'มองเห็นได้' ไว้ในโปรแกรมอ่านหน้าจอ ดังนั้นฉันสามารถใช้ตรรกะของกฎการเรียงซ้อนเพื่อกำหนดอย่างชัดเจนเมื่อฉันต้องการมันซ่อนจากผู้ใช้สายตาและเมื่อฉันไม่ได้
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.