Como ocultar o título da página com base no tipo de nó usando template_preprocess_page ()

10

Estou tentando ocultar o título da página atual (impressa por page.tpl.php) se a página atual for 1) um nó em exibição completa (em oposição ao modo teaser) E 2) o tipo de nó é concerto ou biografia . Imprimo o título do nó para esses tipos de conteúdo diretamente no conteúdo do nó, por isso quero ocultar a duplicata que está sendo impressa por page.tpl.php. Não consigo fazer isso funcionar diretamente em page.tpl.php, e minha leitura sugere que a melhor prática é lidar com a lógica de modelo no template.php usando funções de pré-processo e processo. Então, estou tentando ocultar o título da página atual (com as 2 condições acima) usando template_preprocess_page(). Este é o meu código.

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

Eu li Como testo o tipo de nó para imprimir uma variável do template.php? e a página de documentação template_preprocess_page()e vários outros sites, mas não consigo fazer isso funcionar. Vi sugestões que você tem que chamar isset()on $variables['node']antes de testar para o tipo de nó, mas isso não quer trabalhar. Não vi uma solução clara publicada em nenhum lugar e estou no meu juízo final.

diekunstderfuge
fonte

Respostas:

9

e minha leitura sugere que a melhor prática é lidar com a lógica de modelo no template.php usando funções de pré-processo e processo.

Desacoplar a lógica do código de renderização significa simplesmente que o código em template.php define uma variável que é verificada no arquivo de modelo. Dessa maneira, a lógica está toda contida no arquivo template.php, enquanto o código de renderização está nos arquivos do modelo.

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()não funciona porque $variables['title']é uma string, não uma matriz de renderização. hide()é sempre usado com uma matriz de renderização e não tem nenhum efeito com uma string, nem mesmo quando a string é passada para render().
Na verdade, passar uma string (ou qualquer valor que não seja uma referência a uma variável que contenha uma matriz) hide()causaria um erro de PHP, pois a função usa esse código.

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

A desactivação $variables['title']com unset($variables['title'])não funciona, também, como template_process_page()iria ficar o título da página da drupal_get_title().

if (!isset($variables['title'])) {
  $variables['title'] = drupal_get_title();
}
kiamlaluno
fonte
Claro que você também pode alterar a $titlevariável real com mytheme_process_page(&$variables) { $title = false; }.
RobW /
4
@ RobW que seria mytheme_process_page(&$variables) { $variables['title'] = false; }e que funciona BTW.
Duncanmoo
Outra nota sobre isso; enquanto seu tema envolve o <?php print $title; ?>em <?php if (!$title_hidden): ?>que você pode simplesmente definir$variables['title_hidden'] = TRUE;
Duncanmoo
2

Você pode gerenciar isso usando drupal_set_title ().

function mytheme_preprocess_page(&$vars){
    if (isset($vars['node']) && $vars['node']->type == 'news'){
        drupal_set_title('');
    }
}
mohit_rocks
fonte
Isso não funcionou para mim. Poderia algo mais estar substituindo template_preprocess_page()? Eu usei o módulo Theme Developer para inspecionar o título da página duplicada e confirmei que está sendo chamado page.tpl.php. Devo pensar em excluir o título page.tpl.phpe adicioná-lo de volta para onde eu quiser template_preprocess_page()? Desejo que o título seja renderizado, por exemplo, quando a página contém uma exibição de nós, mas não quando a página é um nó único de um determinado tipo / tipos.
diekunstderfuge 16/09/12
1
Isso também pode retirar informações importantes dos visitantes usando leitores de tela. Ele também retira o título da página na guia usuários. Pense em acessibilidade desde o início.
Rick
1

Tente isso assumindo que sua condição está correta :)

 function MYTHEME_preprocess_page(&$variables) {
        if (!empty($variables['node']) && $variables['node']->type == 'concert') {
            unset($variables['title']);
        }
    }
junedkazi
fonte
Não funciona: template_process_page () seria definido $variables['title']com o valor retornado drupal_get_title().
kiamlaluno
0

A maneira menos complicada é imprimindo isso no seu page.tpl.php

<?php hide($title); ?>

Mas se você quiser que seja dinâmico, sugiro usar o preprocess_pagecomo sugerido por outros.

ninjascorner
fonte
1
Isso não funciona. hide()é usado com matrizes de renderização, não cadeias.
kiamlaluno
0

Em CSS, fiz isso no meu tema

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

Conforme recomendado por http://www.alistapart.com/articles/now-you-see-me/

Por quê? Porque você ainda deseja ter o cabeçalho e o h1 'visíveis' para rastrear os leitores quanto à acessibilidade. Se você simplesmente retirar o valor do H1, está roubando aos visitantes cegos e com baixa visão algumas informações potencialmente importantes.

Rick
fonte
Isso não vai funcionar. Por quê? Porque você não pode adicionar CSS condicional sem a ajuda de programação local n
AyeshK
Drupal adiciona classes a elementos como 'front' usados ​​acima. Para mim, preciso ocultar o título na primeira página, mas deixá-lo 'visível' para os leitores de tela. Portanto, eu posso usar a lógica das regras em cascata para definir claramente quando eu preciso escondê-lo dos usuários que enxergam e quando não preciso.
Rick
0

a sugestão de mytheme_preprocess_page funciona para mim, mas se for usada$vars['title_hidden'] = TRUE;

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

A função correta é

function mytheme_preprocess_node(&$vars) {
}

ao invés de

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