it-swarm.it

È possibile impostare dinamicamente le impostazioni del cercapersone di Views?

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 x-y. Ma non so se è possibile in qualche modo collegare dinamicamente quel campo nelle impostazioni delle Viste. O c'è un altro modo per farlo forse?

13
Jay

L'hook delle visualizzazioni che si desidera utilizzare è hook_views_pre_build che 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.

18
ericduran

Per Drupal 7, solo 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.

2
heilop

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 !! ;)

1
tanmayk

È 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
}
1
dobeerman

Il codice di @tanmayk ha fatto il trucco per me. 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.

0
adevms