2011-01-03 13 views

risposta

2

Per fare ciò che si vuole fare usando Views e non qualche altro modulo contribuito, come Glossario, è necessario definire e tematizzare la propria vista.

Innanzitutto, è necessario creare un nuovo nodo Visualizza. Lo chiamerò myglossary, ma non importa. Assicurati che uno dei tuoi campi sia il titolo del nodo e che sia ordinato per titolo del nodo, in ordine crescente. In altre parole, ordine alfabetico. Presumo che tu stia usando lo stile di riga non formattato (è predefinito), ma probabilmente puoi fare qualcosa di simile con gli altri stili di riga.

Quindi, devi entrare nel tuo tema. Dalla cartella views/theme, copia il modello views-view-unformatted.tpl.php nella cartella del tema che stai utilizzando. Rinominalo in views-view-unformatted - myglossary.tpl.php quindi verrà utilizzato solo per questa vista. Quindi, aprire il file template.php del vostro tema, e aggiungere una funzione di pre-elaborazione:

//Change mytheme to your theme name 
function mytheme_preprocess_views_view_unformatted__myglossary(&$vars) { 
    //If you have the devel module installed, 
    //this is a great way to see all the available variables 
    //dpm($vars); 

    $results = $vars['view']->result; 
    $rows = $vars['rows']; 

    //Sort rows into letter sets 
    $letters = array(); 
    $i = 0; 
    foreach ($results as $result) { 
    $first_letter = strtolower(substr($result->node_title, 0, 1)); 
    if (is_array($letters[$first_letter])) { 
     array_push($letters[$first_letter], $rows[$i]); 
    } 
    else { 
     $letters[$first_letter] = array($rows[$i]); 
    } 
    $i++; 
    } 

    //Generate glossary navigation 
    $nav = ''; 
    foreach($letters as $letter => $rows) { 
    $num = count($rows); 
    $cap_letter = strtoupper($letter); 
    $nav .= <<<NAV 
<a href="#$letter" class="letter_link"> 
    $cap_letter 
</a> 
($num) 
NAV; 
    } 

    //Add to variables 
    $vars['nav'] = $nav; 
    $vars['letters'] = $letters; 
} 

Poi, si dovrà modificare il file di modello è stato copiato nel corso precedenza per aggiungere nella navigazione, e per emettere le righe in uno stile di glossario:

<?php if (!empty($title)): ?> 
    <h3><?php print $title; ?></h3> 
<?php endif; ?> 

<?php if (!empty($nav)): ?> 
    <div id="glossary_nav"> 
    <?php print $nav; ?> 
    </div> 
<?php endif; ?> 

<?php foreach ($letters as $letter=>$rows): ?> 
    <a name="<?php print $letter ?>"></a> 
    <h4 class="letter"> 
    <?php print strtoupper($letter); ?> 
    </h4> 
    <?php foreach ($rows as $id=>$row): ?> 
    <div class="<?php print $classes[$id]; ?>"> 
    <?php print $row; ?> 
    </div> 
    <?php endforeach;?> 
<?php endforeach; ?> 

Potrebbe essere necessario rigenerare il registro dei temi per visualizzare le modifiche sul sito.

+0

Questo approccio potrebbe funzionare, ma non è necessario farlo. È possibile ottenere lo stesso effetto senza alcun codice personalizzato. – messedup

6

Dai uno sguardo allo the Views module, che fornisce una vista denominata "Glossario". Questo ordina il contenuto in ordine alfabetico e crea un indice di lettere di sorta. Date un'occhiata allo http://drupal.org/node/441024 sebbene sia possibile che abbia usato the Glossary module. C'è anche un modulo chiamato Dictionary (demo).

+0

Thx quasi quello che volevo; Ho seguito il tuo link e sono arrivato a quello http://nanwich.info/glossary che fa ESATTAMENTE quello che voglio. Ma sono bloccato nei punti di vista; Voglio mostrare tutte le lettere, ma posso specificare solo 1 carattere – Disco

+0

Non puoi lasciare vuoto l'argomento e poi mostrerà tutto? – shanabus

1

Se si utilizza il modulo Viste, si è provato a utilizzare un metodo di pre-elaborazione nel modello? Non sarebbe tornato i dati dal vostro datasource in quel modo, ma si potrebbe risolvere la cosa con qualsiasi metodo arbitrario si voleva una volta è stato restituito, sarebbe simile a questa:

function templatename_preprocess_views_view__All_Images(&$vars) 
{ 
    global $base_url; 
$images = array(); 
//drupal_add_js('$("a.colorbox").colorbox();','inline'); 
foreach($vars['view']->result as $img) 
{ 
    $nid = $img->nid; 
    $node = node_load($nid); 
    $images[$nid]['orig_img_url'] = $base_url . '/' . file_create_path($node->images['_original']); 
    $images[$nid]['thumb_img_url'] = $base_url . '/' . file_create_path($node->images['thumbnail']); 
} 
$vars['images'] = $images; 

}

In questo modo puoi ordinare per prima lettera e apportare modifiche all'array e questo verrà inviato alla tua visualizzazione nel modo desiderato. Questo è un esempio che ho fatto per i percorsi delle immagini, ma è possibile utilizzare la varietà di metodi di ordinamento di PHP per ottenere l'ordinamento richiesto.

+0

Puoi fare qualche esempio? – Disco

+0

usa un print_r ($ vars) per vedere con quali variabili lavorerai. È quindi possibile modificare queste variabili prima che vengano utilizzate nella vista. –

1

Il modulo Views grouping Limit può portarti dove vuoi andare.

+0

No; non voglio limitare in realtà; Voglio raggruppare la prima lettera del titolo del nodo. – Disco

12

Non è davvero necessario percorrere il percorso del codice per raggiungere questo obiettivo. È possibile vedere alcune delle informazioni qui descritte: http://drupal.org/node/641342

Fondamentalmente, aggiungere due volte il titolo del nodo alla vista. Il primo è il tuo campo normale con collegamenti, ecc. Il secondo è per il raggruppamento.

Il secondo campo contrassegnato da escludere dalla visualizzazione, rimuovere l'etichetta e tagliare il campo ad una lunghezza massima di 1 (deselezionare le opzioni di bordo, ellissi e html).

Quindi, sotto le opzioni "stile riga" troverai l'impostazione "raggruppa per", e devi solo selezionare il secondo campo del titolo del nodo.

Potrebbe essere necessario applicare ulteriore tematizzazione se si vuole avere apparire in un certo modo o, eventualmente, l'aggiunta di tasselli per ogni lettera, ma per il resto che dovrebbe lavorare per la versione 6 di Drupal con vista 2 moduli

Inoltre, ho dovrebbe indicare il gruppo tramite il modulo http://drupal.org/project/views_groupby che può offrire alcune funzionalità aggiuntive ma che non è realmente necessario per la domanda originale.

+0

bel modo di pensare, visto che sto affrontando un problema simile, come "riempiresti" le lettere che non hanno prodotto risultati? – magtak

+0

nvm l'ho ottenuto da solo: http://drupal.stackexchange.com/questions/20754/views-group-by-first-letter-of-results/20855 – magtak

+0

Con Drupal 7 non sono riuscito a trovare "stile riga" o " raggruppa per ", ma ha trovato i controlli equivalenti sotto Visualizza -> Dettagli pagina -> Formato -> Formato -> Impostazioni – tremby

0

È possibile ottenere funzionalità simili creando una vista con filtro AZ (oppure è possibile modificare tale codice). Ho scritto un post su questo problema sul mio blog. Spero che sia d'aiuto.

1

questo può essere fatto semplicemente dalle viste. L'ho fatto per creare un elenco simile per una tassonomia:

  1. Ho creato un semplice elenco di tutti i termini di tassonomia, ovvero il nome di termine come campo.
  2. Quindi ho aggiunto di nuovo il campo termine tassonomia, ma questa volta l'ho usato per ottenere il primo nome del termine, ad esempio, imposta riscrittura output-> numero limite di caratteri-> true. e impostare il limite su 1. Escludere anche questo campo dal display.
  3. Ora vai a Formato-> impostazioni e usa il campo di un singolo carattere per il raggruppamento . Alla fine ordina i risultati con il filtro dei termini della tassonomia.
Problemi correlati