Como exibir um campo antes do título do nó?


41

Estou procurando renderizar um determinado campo antes do título do nó ao exibir um teaser no D7.

Efetivamente eu quero ir a partir desta para esta .

Eu olhei em atualizar o node.tpl.php mas noto que ele se separa $titlede $contententão estou inseguro sobre como abordar isso. Após algumas pesquisas, descobri que as pessoas sugeriram o uso de módulos CCK e ConTemplate para contornar isso no Drupal-6, mas estou me perguntando se existe uma solução mais Drupal-7.

Alguma sugestão?


Além de todas as soluções de modelos baseados em php, você também pode percorrer um longo caminho apenas com CSS. Margens negativas podem fazer muito. No seu exemplo do jsfiddle, seria assim .
Marcvangend

Eu tinha considerado isso, mas o que acontece com títulos longos ?
Irishbuzz

Você está absolutamente certo, isso só funciona se o título tiver uma altura fixa. Como toda solução, ela tem seus pontos fracos. Pessoalmente, acho que (independentemente do design e da tecnologia que você está usando) títulos longos devem ser evitados pela educação dos editores, mas sei que isso nem sempre é uma opção.
Marcvangend

Respostas:


53

Isso é realmente bastante simples com o Drupal 7.

Com rendere hidevocê sabe que tem a possibilidade de controlar a colocação de um único elemento $contentsem precisar imprimir todos os itens que você mesmo precisava no Drupal 6.

Um modelo de nó simplificado se parece com isso:

<div>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

Uma pequena modificação atenderia às suas necessidades:

<div>
  <?php print render($content['field_name_of_image']); ?>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

Usando render, você pode gerar um elemento. Isso é mais inteligente do que simplesmente imprimir coisas, pois o Drupal acompanhará o que foi renderizado, para evitar que a mesma coisa seja impressa duas vezes no local. Ao renderizar o campo acima do título, você também está removendo o que é renderizado quando $contenté renderizado.


2
Muito agradável. Em um mundo ideal, seria melhor dizer ao Drupal para tratar o campo do título como qualquer outro campo, mas pelo menos no Drupal 7, temos soluções simples como essa. Kudos @googletorp!
Irishbuzz

Para constar: Isso dificilmente é diferente de Drupal6, ao contrário do que o comentário acima pode insultar.
precisa

1
@berkes: Se você imprimir campos individualmente no D6, precisará manter o modelo do nó e editar o código para poder adicionar novos campos. Essa é uma grande diferença em relação ao D7, onde você pode continuar adicionando campos e usando a interface do usuário para classificá-los também.
googletorp

render é realmente novo. Mas seu conceito não é. Existem vários truques para conseguir o mesmo. Não quis dizer que no Drupal6 isso é igualmente simples, limpo e agradável. Apenas que é possível também.
BERKES

@googletorp existe uma maneira de imprimir um campo em page.tpl.php?
precisa saber é o seguinte

9

O Display Suite também é muito legal.

O Display Suite permite que você tenha controle total sobre como o conteúdo é exibido usando uma interface de arrastar e soltar. Organize seus nós, visualizações, comentários, dados do usuário etc. da maneira que desejar, sem precisar percorrer dezenas de arquivos de modelo. Uma lista predefinida de layouts (somente D7) está disponível para ainda mais diversão com arrastar e soltar!


É um módulo interessante, mas infelizmente parece oferecer controle apenas para campos sem título, portanto não há ajuda aqui. Agradece a todos a mesma.
31511 irishbuzz

Na verdade, isso não é verdade, você só precisa instalar todos os módulos necessários: drupal.org/project/ds , drupal.org/project/nd & drupal.org/project/nd_contrib
Decifre em

@ Decipher: Instalando 3 módulos para mover uma tag de imagem acima da tag h2? Você deve estar brincando, certo :)
Berkes

@berkes - Instalando o Drupal para exibir uma página da web, você deve estar brincando, certo? O que quero dizer é que, com esses módulos instalados, você pode fazer muito, assim como o Drupal, muito, mas também pode usá-lo para resolver uma tarefa servil.
decifrar

@ Decifrar: Com certeza, a instalação de módulos genéricos traz novas oportunidades para o seu site. Mas não é aconselhável instalar visualizações, ver galeria, cck, filefiend e campo de imagem para simplesmente exibir uma linha de imagens. Seria bom aconselhar se vistas, cck e o resto serão usados ​​para mais do que apenas esta lista de imagens. Mas o OP não mencionou nada disso.
BERKES

8

Dê uma olhada no módulo Título - http://drupal.org/project/title . Pode ser útil para o seu cenário. Eu o instalei / habilitei por algum motivo, provavelmente semelhante ao seu, e parecia dar flexibilidade de como colocar o campo de título.

Desde então, eu o desativei (e estou usando o Display Suite), então minha lembrança pode ser um pouco superficial.


5

Esta é uma solução hackish e tenho certeza de que alguém irá apresentar algo mais elegante, mas no caso de você estar preso, e ninguém o fizer ...

Você pode usar page.tpl.phppara remover $titlecompletamente a impressão e adicionar um novo campo personalizado chamado Title com o nome da máquina $ new_title ou algo assim. Em seguida, na edição do nó, oculte a caixa Título original e, no nó Salvar, use Computed Field ou algum php personalizado para copiar o arquivo $new_titlepara $title.

Depois de tudo isso, escreva um css para fazer com que $ new_title pareça com o título da página antes e você poderá colocar os campos na ordem que quiser, basta arrastar e soltar na tela de gerenciamento de campos. Como você copiou $new_titlepara $title, o título da página na barra do navegador ainda deve funcionar e nada deve reclamar da falta de títulos de nó.

Como eu disse, é um hack - mas funcionaria. Entre em contato se precisar de mais informações


1
Obrigado pela sugestão Frederik. Como você indica, está longe de ser o ideal, mas parece uma das poucas soluções possíveis. Acrescentarei à sua solução sugerindo que o módulo auto_nodetitle seja usado se seguir esta abordagem. Deixarei a questão em aberto por enquanto, pois realmente espero que exista uma maneira melhor e que eu possa começar uma recompensa. +1 pelo seu esforço da mesma forma.
31411 irishbuzz

4

page.tpl.php (guirlanda)

...
      <div id="center"><div id="squeeze"><div class="right-corner"><div class="left-corner">
          <?php print $breadcrumb; ?>
          <?php if ($mission): print '<div id="mission">'. $mission .'</div>'; endif; ?>

          /*
           * Print custom block or var
           */
          <?php if ($custom_block): print '<div id="custom-block" class="clear-block">'. $custom_block .'</div>'; endif; ?>

          <?php if ($tabs): print '<div id="tabs-wrapper" class="clear-block">'; endif; ?>
          <?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>
          <?php if ($tabs): print '<ul class="tabs primary">'. $tabs .'</ul></div>'; endif; ?>
          <?php if ($tabs2): print '<ul class="tabs secondary">'. $tabs2 .'</ul>'; endif; ?>
          <?php if ($show_messages && $messages): print $messages; endif; ?>
          <?php print $help; ?>
          <div class="clear-block">
            <?php print $content ?>
          </div>
          <?php print $feed_icons ?>
          <div id="footer"><?php print $footer_message . $footer ?></div>
      </div></div></div></div> <!-- /.left-corner, /.right-corner, /#squeeze, /#center -->
...

template.php

/**
 * Override or insert variables into the page template.
 */
function phptemplate_preprocess_page(&$variables) {
  $node = $variables['node'];
  if($node->type == MY_NODE_TYPE) {
    $variables['custom_block'] = 'bla bla bla';
  }
}

Não sei se sigo o que está acontecendo aqui, pois o primeiro trecho de código fornece pouca indicação do que é novo e do que existe. Também estou usando o tema Zen em vez de Garland, embora as alterações necessárias sejam semelhantes. No segundo trecho de código, você está chamando um hook_preprocess_page ()? Você pode expandir com um exemplo mais concreto?
31711 irishbuzz

No segundo código, definimos uma nova variável 'custom_block'. Veja parte do primeiro código em que estamos imprimindo 'custom_block'. <? php if ($ custom_block): imprime '<div id = "bloco personalizado" class = "clear-block">'. $ custom_block. '</div>'; fim se; ?> apenas defina regras para gerar essa variável. Tão? :)
dobeerman 31/03

4

Isso não se aplica à pergunta do Teaser na postagem original, mas para as pessoas que se deparam com isso e querem que isso aconteça na visualização completa, aqui está uma opção sem código: exibir o campo em um bloco (usando visualizações, por exemplo) e coloque esse bloco acima do seu bloco de conteúdo, mas na mesma região.


Eu ainda sou um drupal n00b, você poderia explicar o que você quer dizer?
Kenny Wyland

3

Eu acho que você deve usar funções de pré-processo no seu template.php

/**
 * Override or insert variables into the page template.
 */
function THEMENAME_process_page(&$variables) {
  // look for $variables['page_title'] if i remember
}

E como adicional

/**
 * Override or insert variables into the node template.
 */
function THEMENAME_preprocess_node(&$variables) {
  //
}

despejar variáveis ​​e fazer o que quiser. adicionar / remover / atualizar.


1
Essas funções não alteram a ordem na qual o título e outros campos do nó são gerados. Para isso, você deve alterar o arquivo de modelo.
kiamlaluno

Eu entendi. Eu pensei que você gostaria de adicionar um valor de campo ao título.
dobeerman

3

Resolvi isso por uma solução sem código usando o Display Suite e o recurso extra "Região para bloquear". Eu gosto mais desta solução por sua flexibilidade.

Basicamente, ative a parte extra "Região para bloquear", ative a exibição "Conteúdo em texto completo" no Display Suite. (supondo que você queira exibir o conteúdo acima do título na exibição do nó completo, da mesma forma você pode usá-lo para qualquer outro modo de exibição, exceto o padrão). Agora, na parte "Gerenciar exibição" de "Conteúdo em texto completo", na parte inferior da tela, a guia "Bloquear regiões" deve aparecer. Digite o novo nome do bloco, salve, arraste e solte os campos desejados nesse bloco. Por fim, mova o bloco recém-criado na tela Blocos em algum lugar acima do título do nó.

Você pode ver o vídeo da mesma abordagem aqui: http://www.youtube.com/watch?v=y4wyjxyhbNA , é claro que você precisa colocar o bloco acima do título (não da barra lateral esquerda) no final.


2

Para modelos zen abaixo, o código funciona para mim.

<?php
// this goes in template.php
// check if node type page and then add to $vars array
// declaring $vars['foo'] gives you a $foo variable to use in page.tpl.php

function YOURTHEMENAME_preprocess_page(&$vars, $hook) {
    if (isset($vars['node'])) :
        if($vars['node']->type == 'page'):       
            $node = node_load($vars['node']->nid);
            $output = field_view_field('node', $node, 'field_image', array('label' => 'hidden'));       
            $vars['my_image_field'] = $output;               
        endif;
    endif;
}
?>

Então, finalmente, você pode imprimir facilmente seu campo em page.tpl.php;

<?php
if ($my_image_field):
   print render($my_image_field);
endif;
?>

em relação ao page.tpl.php, recebi um aviso de variável indefinida com o tema Business Responsive Theme, mas quando removi o condicional, ele funciona bem. Em outras palavras, eu mudei <? Php if ($ my_image_field): print render ($ my_image_field); fim se; ?> para <? php print render ($ my_image_field); ?> O que parece não lançar nenhum aviso em todas as minhas páginas.
precisa saber é o seguinte

2

Eu sei que você já teria usado algum tema para criar e agora tentando adicionar os campos na parte superior do título.

Minhas sugestões para todos os desenvolvedores que criam o tema no Drupal 7 seriam: Tema Omega + Módulos Contexto e Delta. Isso fornece uma base muito forte para o seu layout.

E flexibilidade na organização de regiões, blocos e campos.


1

Você pode fazer isso com o módulo de painéis


Resposta antiga aqui, mas isso pegou uma bandeira. Seria melhor explicar um pouco como os painéis podem ser usados ​​nessa situação.
mpdonadio

Os painéis são enormes, apenas para mover um campo em uma posição diferente.
Akko 16/05
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.