Cách ẩn tiêu đề trang dựa trên loại nút bằng template_pre process_page ()


10

Tôi đang cố gắng ẩn tiêu đề của trang hiện tại (như được in bởi page.tpl.php) nếu trang hiện tại là 1) một nút hiển thị đầy đủ (trái ngược với chế độ trêu ghẹo), VÀ 2) loại nút là hòa nhạc hoặc sinh học . Tôi in tiêu đề nút cho các loại nội dung này trực tiếp trong nội dung nút, vì vậy tôi muốn ẩn bản sao đang được in bởi page.tpl.php. Tôi không thể làm cho điều này hoạt động trực tiếp trong page.tpl.php và việc đọc của tôi cho thấy cách thực hành tốt nhất là xử lý logic mẫu trong template.php bằng cách sử dụng các hàm tiền xử lý và xử lý. Vì vậy, tôi đang cố gắng ẩn tiêu đề trang hiện tại (với 2 điều kiện trên) bằng cách sử dụng template_preprocess_page(). Đây là mã của tôi.

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

Tôi đọc Làm cách nào để kiểm tra loại nút để in một biến từ template.php? và trang tài liệu cho template_preprocess_page()và các trang web khác, nhưng tôi dường như không thể làm cho nó hoạt động. Tôi thấy ý kiến cho rằng bạn phải gọi isset()vào $variables['node']trước khi thử nghiệm cho các loại nút, nhưng điều đó không làm việc, hoặc. Tôi đã không thấy một giải pháp rõ ràng được đăng ở bất cứ đâu, và tôi đang ở cuối cùng.

Câu trả lời:


9

và cách đọc của tôi cho thấy cách thực hành tốt nhất là xử lý logic mẫu trong template.php bằng cách sử dụng các hàm tiền xử lý và xử lý.

Việc tách logic khỏi mã kết xuất chỉ đơn giản là mã trong template.php đặt một biến được kiểm tra trong tệp mẫu. Theo cách này, logic là tất cả được chứa trong tệp template.php, trong khi mã kết xuất là tất cả trong các tệp mẫu.

template.php

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

trang.tpl.php

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

hide()không hoạt động vì $variables['title']là một chuỗi, không phải là một mảng kết xuất. hide()luôn được sử dụng với một mảng kết xuất và nó không có bất kỳ ảnh hưởng nào với một chuỗi, ngay cả khi chuỗi được truyền đến render().
Trên thực tế, việc truyền một chuỗi (hoặc bất kỳ giá trị nào không phải là tham chiếu đến một biến chứa một mảng) hide()sẽ gây ra lỗi PHP, vì hàm này sử dụng mã này.

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

Unset $variables['title']với unset($variables['title'])không hoạt động quá, như template_process_page()sẽ nhận được danh hiệu trang từ drupal_get_title().

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

Tất nhiên bạn cũng có thể thay đổi $titlebiến thực tế với mytheme_process_page(&$variables) { $title = false; }.
RobW

4
@RobW đó sẽ là mytheme_process_page(&$variables) { $variables['title'] = false; }và hoạt động BTW.
Duncanmoo

Một lưu ý khác về điều này; miễn là chủ đề của bạn kết thúc tốt đẹp <?php print $title; ?>trong <?php if (!$title_hidden): ?>bạn chỉ có thể thiết lập$variables['title_hidden'] = TRUE;
Duncanmoo

2

Bạn có thể quản lý việc này bằng drupal_set_title ().

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

Điều này đã không làm việc cho tôi. Có thể một cái gì đó khác được ghi đè template_preprocess_page()? Tôi đã sử dụng mô-đun Nhà phát triển chủ đề để kiểm tra tiêu đề trang trùng lặp và xác nhận rằng nó đang được gọi từ page.tpl.php. Tôi có nên nghĩ về việc xóa tiêu đề khỏi page.tpl.phpvà sau đó THÊM nó trở lại nơi tôi muốn sử dụng nó template_preprocess_page()không? Tôi muốn tiêu đề hiển thị, ví dụ, khi trang chứa chế độ xem các nút, nhưng không phải khi trang là một nút của một loại / loại nhất định.
diekunstderfuge

1
Điều này cũng có thể loại bỏ thông tin quan trọng từ khách truy cập bằng trình đọc màn hình. Nó cũng loại bỏ tiêu đề của trang trong tab người dùng. Hãy suy nghĩ khả năng tiếp cận từ đầu.
Rick

1

Hãy thử điều này giả sử nếu điều kiện của bạn là chính xác :)

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

Nó không hoạt động: template_ process_page () sẽ được đặt $variables['title']với giá trị được trả về từ đó drupal_get_title().
kiamlaluno

0

Cách ít phức tạp hơn là bằng cách in cái này trong page.tpl.php của bạn

<?php hide($title); ?>

Nhưng nếu bạn muốn nó năng động, tôi sẽ đề nghị sử dụng preprocess_pagetheo đề xuất của người khác.


1
Nó không hoạt động. hide()được sử dụng với mảng kết xuất, không phải chuỗi.
kiamlaluno

0

Trong CSS, tôi đã làm điều này với chủ đề của tôi

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

Theo khuyến nghị của http://www.alistapart.com/articles/now-you-see-me/

Tại sao? Bởi vì bạn vẫn muốn có tiêu đề và h1 'hiển thị' cho trình đọc màn hình để truy cập. Nếu bạn chỉ đơn giản là tước đi giá trị của H1, bạn đang cướp đi những khách truy cập mù và tầm nhìn thấp của bạn về một số thông tin quan trọng tiềm năng.


Điều này sẽ không hoạt động. Tại sao? Bởi vì bạn không thể thêm CSS có điều kiện mà không có sự trợ giúp từ trang lập trình n
AyeshK

Drupal thêm các lớp vào các yếu tố như 'mặt trận' được sử dụng ở trên. Đối với bản thân tôi, tôi cần ẩn tiêu đề trên trang nhất nhưng để nó 'hiển thị' cho trình đọc màn hình. Do đó, tôi có thể sử dụng logic của các quy tắc xếp tầng để xác định rõ ràng khi nào tôi cần ẩn nó khỏi những người dùng bị cảnh giác và khi tôi không.
Rick

0

đề xuất của huyền thoại_pre process_page hoạt động với tôi nhưng nếu được sử dụng$vars['title_hidden'] = TRUE;

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

0

Chức năng đúng là

function mytheme_preprocess_node(&$vars) {
}

thay vì

function mytheme_preprocess_page(&$vars) {
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.