Come faccio a mostrare solo 3 degli ultimi post per ogni termine in una vista?


13

Con l'aiuto di un'altra domanda: Mostra i nodi più recenti per ciascun termine di tassonomia in Viste Sono stato in grado di creare la vista richiesta, tranne per il fatto che visualizza tutti i messaggi per ciascun termine (raggruppati per termine)? Come posso limitare ogni termine a visualizzare solo 3 dei loro ultimi post.

per esempio

Termine 1
- Posta 1
- Posta 2
- Posta 3

Termine 2
- Posta 1
- Posta 2
- Posta 3

Termine 3
- Posta 1
- Posta 2
- Posta 3

Risposte:


9

Se è necessario un solo nodo, è possibile utilizzare la relazione "Nodo rappresentativo". Ma se hai bisogno di tre nodi per ogni termine, usa qualcosa come Vista campo vista .

1) Crea una vista "figlio" per i contenuti. Qualcosa come questo: inserisci qui la descrizione dell'immagine

Aggiungi argomento termine tassonomia, limiti cercapersone, ordinamento e così via: inserisci qui la descrizione dell'immagine

Ora puoi allegare questa vista a un'altra.

2) Crea vista tassonomia: inserisci qui la descrizione dell'immagine

Aggiungi campo ID termine nascosto e quindi aggiungi campo "Globale: Visualizza": inserisci qui la descrizione dell'immagine

Non dimenticare di configurare la memorizzazione nella cache. Dalla pagina Visualizza campo visualizzazioni :

Si consiglia vivamente di utilizzare questo modulo insieme alla memorizzazione nella cache delle viste. Visualizzazioni La cache dei contenuti e le azioni della cache sono buoni modi per memorizzare le viste nella cache.


Grazie Kalabro. Anche il tuo approccio è corretto. Inizialmente stavo percorrendo questa strada, ma volevo vedere se c'era un modo migliore che creare un sacco di viste e quindi incorporare vista dopo vista.
Nigel Waters,

2
Non è una tonnellata, @NigelWaters. Sono solo due: uno per i nodi e uno per i termini. Questa soluzione è abbastanza stabile e la utilizzo per elenchi di visualizzazioni non standard.
Kalabro,

Il mio fraintendimento. Pensavo di dover creare una vista per ciascun gruppo.
Nigel Waters,

Questo è quasi perfetto per il mio caso d'uso. Il mio unico problema è il link "altro" per una vista figlio, i collegamenti alla stessa vista e visualizza ancora solo un numero limitato di elementi! I titoli della vista padre si collegano alla tassonomia che funziona come desiderato.
Segna il

Ahah - Ho creato una visualizzazione a blocchi per la vista di mio figlio con solo i primi n elementi visualizzati e un altro link. Più link passa alla visualizzazione della pagina e visualizza tutti gli elementi con un cercapersone. Grande! Ora l'unico problema è l'intestazione (nella vista principale) che si collega al termine tassonomia, ma posso scollegarlo o cambiare la visualizzazione della pagina della vista figlio con lo stesso URL.
Segna il

7

Dopo ulteriori indagini, sembra che il Riepilogo Peek potrebbe essere esattamente quello che vuoi. Gli screenshot nella documentazione sono per Drupal 6 ed è leggermente diverso in Drupal 7, quindi ho allegato alcuni screenshot aggiornati.

  • Scegli Riepilogo sbirciatina da "Filtri contestuali"> "Quando il valore del filtro non è nell'URL"> "Visualizza un riepilogo"> "Formato"

Scegli Riepilogo sbirciatina da "Filtri contestuali"> "Quando il valore del filtro non è nell'URL"> "Visualizza un riepilogo"> "Formato"

  • Vedrai una vista di sotto-viste. Fai clic sull'ingranaggio accanto al cercapersone per il gruppo che desideri limitare.

Fai clic sull'icona delle preferenze del cercapersone

  • Immettere le voci massime da visualizzare nelle opzioni del cercapersone.

Primo campo in Opzioni cercapersone

Dovrai modificare il cercapersone per ogni gruppo che desideri limitare, il che è un peccato.Quando si modifica il cercapersone per un gruppo, cambia le impostazioni per tutti i gruppi. Se si desidera visualizzare un numero di nodi per gruppo diverso dal numero totale di gruppi, sovrascriverlo nelle impostazioni "Formato" in "Filtri contestuali" (nella prima schermata in viola).

Ha lo svantaggio di creare essenzialmente [n] viste per [n] raggruppamenti, il che potrebbe essere un problema di prestazioni a seconda di quanti raggruppamenti hai, ma limita la query al solo numero impostato per la visualizzazione. Ciò potrebbe migliorare le prestazioni, a seconda del caso d'uso. Come sempre, cache in modo responsabile.


Sembra che un cercapersone non possa essere sovrascritto per gruppo. Se si esegue la modifica su un cercapersone in un gruppo, vengono visualizzate le impostazioni del cercapersone principale. A meno che non mi manchi qualcosa?
Nigel Waters,

Ah, hai ragione. Bene, allora è perfetto. Sarai in grado di limitarli tutti in una volta.
beth

Sfortunatamente ciò significa che anche il cercapersone influenza il numero di gruppi mostrati. Suppongo che il mio post originale sia fuorviante poiché l'esempio mostra solo tre termini con tre post ciascuno. Devo mostrare 10 o più termini con 3 post per termine su una singola pagina. Così vicino :(
Nigel Waters il

Ho sbagliato a "sostituire gli elementi da visualizzare" senza fare nulla. Usalo per determinare quanti gruppi mostrare. L'immissione di "0" ti dà infiniti gruppi.
beth

2

Un modo per limitare questo nel codice sarebbe quello di aggiungere qualcosa di simile al seguente a un modulo personalizzato:

function custom_views_pre_render(&$view) {
  //get the rows from the view just before render
  $results = $view->result;
  //create a counter
  $count = '';
  //we're going to built up a new $result array
  $new_results = array();
  //iterate through each view row
  foreach($results as $result) {
    //find the taxonomy term
    $term = $result->taxonomy_term_data_name;
    //add the term to a string of all the terms we've seen so far
    $count .= $term;
    //make sure to separate them with spaces to make them easier to count
    $count .= ' ' ;
    //count how many rows have the same term as the current one
    $term_count = array_count_values(str_word_count($count, 1));

    if($term_count[$term] <= 3){
      //if this is the third or fewer row with this term, add it to the new result array
      $new_results[] = $result;
    }
  }
  //instead of the normal view output, only show the results we put in our array.
  $view->result = $new_results;
}

Questo è per una visione dei termini della tassonomia che è collegata ai nodi tramite una relazione. Se hai solo una vista dei nodi, il tuo chilometraggio può variare.

Sebbene impedisca la visualizzazione di più di 3 per termine, ciò non impedirà alla query di restituire tutti i risultati per ciascun termine, quindi non migliora affatto le prestazioni SQL. Se si dispone di un numero molto elevato di risultati per ciascun termine, creare pannelli di visualizzazione separati e inserirli tutti in una regione utilizzando qualcosa come CTools Page Manager in modo da non eseguire query di grandi dimensioni.

Come sempre, vorrai memorizzare questo materiale nella produzione.


2
Non c'è davvero bisogno di commentare il mio genere. È abbastanza dannoso. t.co/i1dKE8hQ t.co/ATfV3mBG Ad ogni modo, Hook_views_pre_build()o hook_build_pre_execute()potrebbe essere utilizzabile per qualcosa del genere che riduce il calo delle prestazioni, ma non ho familiarità con quelli. Oppure potresti desiderare la mia risposta a questa domanda in precedenza .
Beth,

Aggiornamento: ho una buona autorità (Crell e Stevector) che "Non puoi limitare ogni gruppo separatamente in una singola query. Devi farlo nella fase di rendering. SQL non può farlo, purtroppo." Hanno anche detto "Il meglio che potresti fare è una serie di domande sindacali", ma non pensano nemmeno che Views possa farlo.
beth

Ah, ti ho scambiato per l'OP. In ogni caso, il modulo Riepilogo Peek potrebbe essere utile in questo caso, sebbene presenti i propri problemi di prestazioni. Il suo creatore avverte che è "un po 'disgustoso, ma piuttosto fico".
Beth,
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.