Wie kann ich den Wert eines Filters ändern und die Ausgabe ändern, bevor die Ansicht wiedergegeben wird?

15

Wie können Sie bei Verwendung von Drupal 7 und Views 3 einen Views-Filterwert so ändern, dass er sich auf den Inhalt auswirkt, der gerade gerendert wird?

Ich habe alles versucht, was hier für D6 erwähnt wurde.

Obwohl ein paar Leute es zum Laufen gebracht haben, gibt Merlin an, dass das Ändern der display_options der falsche Weg ist, um dies zu erreichen, aber er ist vage in seiner Antwort, was zu tun ist ( http://drupal.org/node/789710#comment- 2927556 ).

Ich habe versucht:

function pages_views_pre_view($view){
    $view = views_get_view('north_carolina');
    $view->set_display('default');

    $view->display_handler->options['filters']['province']['value'] = 'Georgia';
    dsm($view->display_handler->options['filters']['province']);
}

Anmerkungen:

1) Ich habe eine Ansicht namens erstellt north_carolina, die zwei Arten von Anzeigen hat - eine Seite und einen Block (Seite_1 und Block_1).

2) Meine Filter sind auf allen Anzeigen gleich, daher versuche ich, die Standardanzeige so zu ändern, dass sie sich auf alle auswirkt.

3) Der Standardwert für meinen Filter ist "North Carolina" (den ich in der Ansichts-Benutzeroberfläche festgelegt habe). Beachten Sie jedoch, dass ich versuche, ihn in "Georgia" zu ändern.

4) Wenn ich unmittelbar danach DSM ausführe, wird angezeigt, dass der Filter geändert wurde. Meine Ergebnisse zeigen jedoch weiterhin die Ergebnisse von "North Carolina". Das Caching ist deaktiviert, und ich erhalte immer noch das Gleiche, nachdem ich drush cc all ausgeführt habe.

Ich habe auch versucht, den gleichen Code durch hook_views_pre_buildund laufen zu lassen hook_views_pre_execute.

Irgendwelche Vorschläge?

BEARBEITEN:

Wie vorgeschlagen, kann es hilfreich sein, zusätzliche Informationen zu haben. Hier ist ein Dump der Ansicht:

$view = new view();
$view->name = 'north_carolina';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'North Carolina';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'test nc block';
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
/* Field: Content: Title */
$handler->display->display_options['fields']['title']['id'] = 'title';
$handler->display->display_options['fields']['title']['table'] = 'node';
$handler->display->display_options['fields']['title']['field'] = 'title';
$handler->display->display_options['fields']['title']['label'] = '';
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE;
/* Sort criterion: Content: Post date */
$handler->display->display_options['sorts']['created']['id'] = 'created';
$handler->display->display_options['sorts']['created']['table'] = 'node';
$handler->display->display_options['sorts']['created']['field'] = 'created';
$handler->display->display_options['sorts']['created']['order'] = 'DESC';
/* Filter criterion: Content: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = 1;
$handler->display->display_options['filters']['status']['group'] = 1;
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
/* Filter criterion: Location: Province */
$handler->display->display_options['filters']['province']['id'] = 'province';
$handler->display->display_options['filters']['province']['table'] = 'location';
$handler->display->display_options['filters']['province']['field'] = 'province';
$handler->display->display_options['filters']['province']['value'] = 'North Carolina';
$handler->display->display_options['filters']['province']['exposed'] = TRUE;
$handler->display->display_options['filters']['province']['expose']['operator_id'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['label'] = 'State';
$handler->display->display_options['filters']['province']['expose']['operator'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['identifier'] = 'province';
$handler->display->display_options['filters']['province']['expose']['remember_roles'] = array(
  2 => '2',
  1 => 0,
  3 => 0,
  4 => 0,
);

/* Display: Block */
$handler = $view->new_display('block', 'Block', 'block_1');
$handler->display->display_options['block_description'] = 'test nc block';

Beachten Sie, dass diese Handler vom Modul locations bereitgestellt werden. Speziell für den Filter "Ort: Provinz" erhalte ich ein Formular zur automatischen Vervollständigung. Wenn ich in North Carolina tippe, wird es angezeigt, und das muss ich auswählen. Beachten Sie jedoch, dass Views in der SQL-Anweisung die zweistellige Abkürzung für state verwendet:

SELECT node.title AS node_title, node.nid AS nid, node.created AS node_created
FROM 
{node} node
LEFT JOIN {location_instance} location_instance ON node.vid = location_instance.vid
LEFT JOIN {location} location ON location_instance.lid = location.lid
WHERE (( (node.status = '1') AND (location.province = 'NC') ))
ORDER BY node_created DESC
LIMIT 10 OFFSET 0
blue928
quelle

Antworten:

8

Es kann schwierig sein, den genauen Teil des zu ändernden Ansichtsobjekts herauszufinden. Normalerweise exportiere ich die Ansicht zuerst und schaue mir den generierten Code an, um mich anzufangen.

Das folgende Snippet ist unverändert und funktioniert erwartungsgemäß an einem meiner Produktionsstandorte. Hoffentlich reicht es aus, um Sie in die richtige Richtung zu führen (dies ist offensichtlich ein benutzerdefiniertes Modul mit dem Namen offer_select). Wenn Sie den Code aus der exportierten Ansicht bereitstellen können, kann möglicherweise jemand einen Blick darauf werfen.

//Alter the End date filter on the offer views
function offer_select_views_pre_view(&$view) {
  if ($view->name == 'active_offers') {
    $view->display['default']->handler->options['filters']['field_end_value']['value']['value'] = time();
  }
}

--UPDATE--
Für Ihre spezifische Ansicht habe ich das Ortungsmodul installiert und einige Knoten in NC und einige in Georgia erstellt und Ihre Ansicht zum Testen importiert. In meinem benutzerdefinierten Modul (benannt dev) habe ich mit folgendem Code begonnen (mit installiertem Entwickler):

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']);
  }
}

Von da an fügte ich die in krumo angezeigten offensichtlichen Werte zum Array hinzu, bis ich hier ankam:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']['province']['value']);
  }
}

Was einfach North Carolinain Krumo gedruckt wurde. Zu diesem Zeitpunkt habe ich den Wert vom Drucken auf die folgende Einstellung geändert:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    $view->display['default']->handler->options['filters']['province']['value'] = 'Georgia';
  }
}

Und voila. Das hat funktioniert.

Adam Balsam
quelle
Cool. Wenn ich eine Chance habe, spiele ich mit Ihrer Sichtweise herum und versuche, eine konkretere Antwort zu finden.
Adam Balsam
@ blue928 so Ich habe meine Antwort mit einer speziellen Antwort auf Ihre Fragen und allgemeinen Anweisungen zu meiner Anreise aktualisiert.
Adam Balsam
das hat super geklappt. Anmerkung zur richtigen Antwort: Ein Teil meines Problems ist, dass ich views_get_view nicht aufrufen oder die Anzeige einstellen musste.
Blue928
2

Falls jemand diesen Thread auftauchte, während er auf D8 nach der gleichen Lösung suchte (wie ich):

Mit der neuen API können diese Parameter viel übersichtlicher bearbeitet werden. In diesem Abschnitt finden Sie Referenzen.

Kleines Beispiel

function dev_views_pre_view(ViewExecutable &$view, $display_id, array &$args) {
  if ($display_id === 'my_unique_display_name') {
      $args[0] = 'desired_value';
  }
}
Der Zinger
quelle