È possibile impostare dinamicamente le impostazioni del cercapersone di Views?


13

Ad esempio, si ha una vista che viene visualizzata quando si visualizza un determinato tipo di nodo, ma si desidera che le impostazioni del cercapersone siano diverse per ogni singolo nodo. Stavo pensando di creare un campo CCK come "impostazione cercapersone" e quindi di dargli un'opzione intera di xy. Ma non so se è possibile in qualche modo collegare dinamicamente quel campo nelle impostazioni delle Viste. O c'è un altro modo per farlo forse?

Risposte:


18

L'hook delle viste che si desidera utilizzare è quello hook_views_pre_buildche viene chiamato prima della creazione della query. Ora questo presuppone che tu abbia una certa esperienza di sviluppo del modulo di base e che tu abbia familiarità con l'API delle viste.

Dovresti essere in grado di fare:

/*
 * Implementation of hook_views_pre_build().
 */
function hook_views_pre_build(&$view) {

  // Make sure this is only for the specific view you want to modified
  if ($view->name == "foo_bar") {

    // Get the x-y value from where you're storing it (in your example the node object).
    $pager_count = get_count_for_this_node();

    // Lets also make sure that this is a number so we won't destroy our view.
    if (is_numeric($pager_count)) {

      // Now lets set the pager item to what ever out count is.
      $view->pager['items_per_page'] = $pager_count;
    }
  }
}

Sopra stiamo usando un hook di viste che viene chiamato prima che la query di visualizzazione sia costruita in questo modo il cercapersone e tutto il resto rifletterà il cambiamento.

Avvertenza: gli hook di viste devono essere utilizzati solo se si capisce cosa sta succedendo. Il codice sopra è scritto per views-2.x.

Spero che sia di aiuto.


Fantastico grazie. Non ho ancora alcuna esperienza di sviluppo del modulo, ma sto iniziando con questo per un paio di cose che voglio realizzare. Ho una comprensione funzionante di PHP, quindi posso seguire quello che sta succedendo in quel pezzo di codice che hai incollato sopra. Penso che questo mi aiuti molto. Grazie.
Jay,

1
Per Views 3.x il codice pertinente deve essere modificato in$view->items_per_page = $pager_count;
stevenw00

è possibile impostare in modo dinamico anche l'offset di ogni pagina?
Shekoufeh,

2

Per Drupal 7, Only dovrebbe scrivere quanto segue:

$view->items_per_page = $pager_count;

Nell'esempio:

/**
 * Implements hook_views_pre_build().
 */
function module_name_views_pre_build(&$view) {
  if ($view->name == "foo_bar" && $view->current_display == 'foo_display') {
    $pager_count = get_count_for_this_node();
    if (is_numeric($pager_count)) {
      $view->items_per_page = $pager_count;
    }
  }
}

Uso un esempio di codice di @ericduran.


1

È necessario utilizzare la funzione di preelaborazione delle viste

/*
 * Implementation of hook_views_pre_render().
 */
function MYMODULE_views_pre_render(&$view){
  // $view->name
  // $view->current_display
  // ...
  // look for other variables in $view object
}

"preprocess" è per il tema e pre_render è troppo tardi (la query era già stata eseguita) - l'hook pre_build è molto meglio.
Mojzis,

1

Per aggiornare il risultato delle visualizzazioni e il cercapersone in hook_views_pre_render, è possibile effettuare le seguenti operazioni:

<?php

/**
 * Implementation of hook_views_pre_render().
 */
function MODULENAME_views_pre_render(&$view) {
  if ($view->name == 'my_view' && $view->current_display == 'my_display') {
    // View result update logic.
    // e.g.
    // $result = array();
    // foreach ($view->result as $k => $row) {
    //   if (whatever is your condition) {
    //     $result[$k] = $row;
    //   }
    // }

    // Assuming $result has data as per your logic.
    // Update the pager according to result.
    $view->query->pager->total_items = count($result);
    $view->query->pager->update_page_info();
    // Add results to view.
    $view->result = $result;
  }
}

Questo dovrebbe funzionare !! ;)


Eccellente! Volevo limitare il numero di elementi in una determinata pagina dipendeva dagli articoli restituiti dalla query. Verificherà al più presto questo metodo.
Jens,

Non funziona esattamente. Le righe scaricate non vengono visualizzate nella pagina successiva. Quindi finisci con il contenuto mancante. Ha bisogno di ulteriori indagini.
Jens,

0

Il codice di @tanmayk mi ha aiutato. In hook_views_pre_render sono state aggiunte solo queste 2 righe di codice

$view->query->pager->total_items = $nr;
$view->query->pager->update_page_info();

Ma non avevo bisogno di aggiungere i risultati alla vista.

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.