Come visualizzare un campo prima del titolo del nodo?


41

Sto cercando di visualizzare un determinato campo prima del titolo del nodo quando visualizzo un teaser in D7.

In effetti voglio passare da questo a questo .

Ho cercato di aggiornare node.tpl.php ma noto che si separa $titleda $contentquindi non sono sicuro di come affrontarlo. Dopo alcune ricerche ho scoperto che le persone hanno suggerito di usare i moduli CCK e ConTemplate per aggirare questo problema in Drupal-6, ma mi chiedo se esiste una soluzione più Drupal-7.

Eventuali suggerimenti?


Oltre a tutte le soluzioni di template basate su php, puoi anche fare molta strada solo con CSS. I margini negativi possono fare molto. Nel tuo esempio jsfiddle sarebbe simile a questo .
marcvangend,

L'avevo considerato, ma cosa succede per i titoli lunghi ?
irishbuzz,

Hai perfettamente ragione, funziona solo se il titolo ha un'altezza fissa. Come ogni soluzione, ha i suoi punti deboli. Personalmente, penso che (indipendentemente dal design e dalla tecnologia che stai utilizzando) i titoli lunghi dovrebbero essere evitati educando i redattori, ma mi rendo conto che non è sempre un'opzione.
marcvangend,

Risposte:


53

Questo è davvero abbastanza semplice con Drupal 7.

Con rendere hidesai che hai la possibilità di controllare il posizionamento di un singolo elemento $contentsenza dover stampare tutti gli elementi che ti piacevano in Drupal 6.

Un modello di nodo semplificato è simile al seguente:

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

Una piccola modifica gestirà le tue esigenze:

<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, puoi generare un elemento. Questo è più intelligente della semplice stampa di materiale, poiché Drupal terrà traccia di ciò che è stato reso, per evitare che la stessa cosa venga stampata due volte sul posto. Quando si esegue il rendering del campo sopra il titolo, si rimuove anche ciò che viene visualizzato quando $contentviene visualizzato.


2
Molto bella. In un mondo ideale potrebbe essere meglio dire a Drupal di trattare il campo del titolo come qualsiasi altro campo, ma almeno in Drupal 7 abbiamo soluzioni semplici come questa. Kudos @googletorp!
irishbuzz,

Per la cronaca: questo non è affatto diverso da Drupal6, contrariamente a quanto potrebbe dissuadere il commento sopra.
Berkes,

1
@berkes: se si stampano i campi singolarmente in D6, è necessario mantenere il modello di nodo e modificare il codice per poter aggiungere nuovi campi. Questa è una grande differenza rispetto a D7 in cui è possibile continuare ad aggiungere campi e utilizzare l'interfaccia utente per ordinarli.
googletorp

render è davvero nuovo. Ma il suo concetto non lo è. Esistono diversi trucchi per ottenere lo stesso risultato. Non intendevo dire che in Drupal6 sia altrettanto semplice, pulito e piacevole. Solo che è anche possibile .
Berkes,

@googletorp c'è un modo per stampare un campo in page.tpl.php?
CocoSkin,

9

Display Suite è anche piuttosto interessante.

Display Suite ti consente di avere il pieno controllo della visualizzazione dei tuoi contenuti utilizzando un'interfaccia di trascinamento della selezione. Organizza i tuoi nodi, visualizzazioni, commenti, dati utente ecc. Nel modo desiderato senza dover passare attraverso dozzine di file modello. Un elenco predefinito di layout (solo D7) è disponibile per un divertimento ancora più intenso!


È un bel modulo, ma sfortunatamente sembra offrire il controllo solo per i campi senza titolo, quindi nessun aiuto qui. Grazie lo stesso.
irishbuzz,

In realtà non è vero, devi solo installare tutti i moduli richiesti: drupal.org/project/ds , drupal.org/project/nd & drupal.org/project/nd_contrib
Decifra il

@Decipher: installare 3 moduli per spostare un tag immagine sopra il tag h2? Stai scherzando, vero :)
Berkes,

@berkes - Installazione di Drupal per visualizzare una pagina web, stai scherzando vero? Il mio punto è che con questi moduli installati puoi fare così tanto, proprio come con Drupal puoi fare così tanto, ma puoi anche usarlo per risolvere un compito umile.
Decifrare il

@Decipher: l'installazione di moduli generici offre sicuramente nuove opportunità al tuo sito. Ma è sconsigliabile installare visualizzazioni, view-gallery, cck, filefiend e image-field per visualizzare semplicemente una fila di immagini. Sarebbe bene avvisare se le visualizzazioni, il cck e il resto saranno utilizzati per più di questo solo elenco di immagini. Ma l'OP non ha menzionato affatto questo.
Berkes,

8

Dai un'occhiata al modulo Titolo: http://drupal.org/project/title . Potrebbe rivelarsi utile per il tuo scenario. L'ho installato / abilitato per qualche motivo, probabilmente simile al tuo, e sembrava dare flessibilità su come posizionare il campo del titolo.

Da allora l'ho disabilitato (e sto usando Display Suite), quindi il mio richiamo potrebbe essere un po 'impreciso.


5

Questa è una soluzione hacker e sono sicuro che qualcuno inventerà qualcosa di più elegante, ma nel caso in cui tu sia bloccato, e nessuno lo fa ...

È possibile utilizzare page.tpl.phpper rimuovere del $titletutto la stampa e aggiungere un nuovo campo personalizzato chiamato Titolo con nome macchina $ new_title o qualcosa del genere. Poi sul nodo modificare, nascondere la casella Titolo originale, e sul nodo Salva uso Computerizzata campo o qualche PHP personalizzato per copiare l' $new_titlea $title.

Dopotutto, scrivi alcuni css per far sembrare $ new_title come il titolo della pagina prima e dovresti essere in grado di posizionare qualunque campo nell'ordine che preferisci, semplicemente trascinandolo nella schermata di gestione dei campi. Perché hai copiato sopra $new_titleper $title, il titolo della pagina nella barra del browser dovrebbe essere ancora di lavoro e nulla deve lamentarsi di perdere i titoli dei nodi.

Come ho detto, è un trucco, ma funzionerebbe. Fammi sapere se hai bisogno di maggiori informazioni


1
Grazie per il suggerimento Frederik. Come indichi, è tutt'altro che ideale ma sembra una delle poche soluzioni possibili. Aggiungerò alla tua soluzione suggerendo che il modulo auto_nodetitle dovrebbe essere usato se si adotta questo approccio. Lascerò la domanda aperta per ora perché spero davvero che ci sia un modo migliore e potrei iniziare una taglia. +1 per il tuo sforzo lo stesso.
irishbuzz,

4

page.tpl.php (ghirlanda)

...
      <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';
  }
}

Non sono sicuro di seguire quello che sta succedendo qui poiché il primo frammento di codice fornisce poche indicazioni su ciò che è nuovo e ciò che esiste. Sto anche usando il tema Zen piuttosto che Garland, anche se i cambiamenti richiesti dovrebbero essere simili. Nel secondo frammento di codice stai invocando un hook_preprocess_page ()? Puoi espanderci con un esempio più concreto?
irishbuzz,

Nel secondo codice abbiamo definito una nuova variabile "custom_block". Guarda parte del primo codice in cui stiamo stampando 'custom_block'. <? php if ($ custom_block): print '<div id = "custom-block" class = "clear-block">'. $ custom_block. '</div>'; finisci se; ?> basta definire le regole per generare questa variabile. Così? :)
dobeerman

4

Questo non si applica alla domanda Teaser nel post originale, ma per le persone che si imbattono in questo e vogliono solo farlo accadere nella vista completa, ecco un'opzione senza codice: mostra il campo in un blocco (usando le viste, per esempio) e posiziona quel blocco sopra il tuo blocco di contenuti ma nella stessa regione.


Sono ancora un drupal n00b, potresti spiegarmi cosa intendi?
Kenny Wyland,

3

Penso che dovresti usare le funzioni di pre-elaborazione nel tuo template.php

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

E come ulteriore

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

scaricare le variabili e fare tutto quello che vuoi. aggiungere / rimuovere / aggiornamento.


1
Queste funzioni non alterano l'ordine in cui vengono emessi il titolo e altri campi del nodo. Per questo, è necessario modificare il file modello.
kiamlaluno

Capisco. Pensavo che volessi aggiungere un valore di campo al titolo.
dobeerman,

3

L'ho risolto con una soluzione senza codice usando Display Suite e la sua funzione extra "Region to Block". Mi piace di più questa soluzione per la sua flessibilità.

Fondamentalmente, abilitare la parte extra "Region to Block", abilitare la visualizzazione "Contenuto full-text" in Display Suite. (supponendo che si desideri visualizzare il contenuto sopra il titolo nella visualizzazione a nodo completo, allo stesso modo è possibile utilizzarlo per qualsiasi altra modalità di visualizzazione tranne Predefinito). Ora, nella parte "Gestione della visualizzazione" di "Contenuto full-text", nella parte inferiore dello schermo, dovrebbe essere visualizzata la scheda "Blocca regioni". Immettere il nome del nuovo blocco lì, salvare e trascinare e rilasciare i campi desiderati in questo blocco. Infine, sposta il blocco appena creato nella schermata Blocchi da qualche parte sopra il titolo del nodo.

Puoi vedere il video dello stesso approccio qui: http://www.youtube.com/watch?v=y4wyjxyhbNA , ovviamente devi posizionare il blocco sopra il titolo (non sulla barra laterale di sinistra) alla fine.


2

Per i modelli zen sotto il codice funziona per me.

<?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;
}
?>

Quindi, infine, puoi facilmente stampare il tuo campo in page.tpl.php;

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

per quanto riguarda page.tpl.php, stavo ricevendo un avviso variabile indefinito con quello con Business Responsive Theme ma quando ho rimosso il condizionale, funziona bene. In altre parole, ho cambiato <? Php if ($ my_image_field): print render ($ my_image_field); finisci se; ?> a <? php print render ($ my_image_field); ?> Che sembra non generare alcun avviso in tutte le mie pagine.
Amy Niebel,

2

So che avresti già usato qualche tema per costruire e ora stai cercando di aggiungere i campi nella parte superiore del titolo.

I miei suggerimenti a tutti gli sviluppatori che sviluppano temi su Drupal 7 sarebbero quelli di utilizzare: tema Omega + moduli Context e Delta. Ciò fornisce una base molto solida per il layout.

E flessibilità nell'organizzazione di regioni, blocchi e campi.


1

Puoi farlo con il modulo pannelli


Vecchia risposta qui, ma questo ha catturato una bandiera. Sarebbe meglio spiegare un po 'come i pannelli possono essere utilizzati in questa situazione.
mpdonadio

Panels è un enorme sovraccarico per lo spostamento di un campo in una posizione diversa.
Akko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.