Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Module › Views ›

Wie "zwinge" ich VIEWS als Operator "IN" anstelle von "LIKE" im Query zu verwenden?

Eingetragen von M. P.@drupal.org (19)
am 26.09.2008 - 10:06 Uhr in
  • Views

Hallo liebe Drupalgemeinde,
ich bin nun schon eine ganze Weile mit diesem Problem zugange,
vielleicht habe ich ja Glück, und Views- Experten lesen diese
Zeilen.

Es geht um eine View, welche unterhalb eines Node als Block eingebunden wird.
Jeder dieser Nodes kommt mit einer Postleitzahl.
Die View soll nun dynamisch, abhängig von der Postleitzahl des Nodes generiert werden.
Konkret soll die View andere Nodes mit Postleitzahl innerhalb eines festen Umkreises
ausgeben. Eine Umkreisfunktion welche die entsprechenden Postleitzahlen ausgibt existiert.

Ich habe die View (mit dem User- Interface) soweit erstellt,
und versucht, über das "Views argument handling" die gewünschte Funktionalität herzstellen - leider ohne den gewünschten Effekt. Ich habe es über das argument handling nicht geschafft, den VIEW-Operator so zu modifizieren, dass Sie den gewünschten Query generiert.

Diesen Query konnte ich mit dem argument Handling erzeugen:
node_data_field_postleitzahl.field_postleitzahl_value LIKE ('zip1','zip2'...)

Und diesen hätte ich gebraucht:
...node_data_field_postleitzahl.field_postleitzahl_value IN ('zip1','zip2'...)....

Habe ich den falschen Ansatz gewählt? Gibt es eine einfachere Möglichkeit,
die gewünschte Funktionalität zu erreichen?
Ansonsten müsste ich die View als Modul? ausprogrammieren und meinen
gewünschten query selber setzen?

Für Anregungen und Denkanstöße wäre ich sehr dankbar.

Besten Gruss
Markus

‹ View mit Benutzerbilder erstellen - jedoch keine Avatare zeigen view läßt sich nicht importieren ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Schreibe einen neuen Filter

Eingetragen von traxer (1009)
am 26.09.2008 - 11:16 Uhr
  1. Handelt es sich um Views 1 (für Drupal 5) oder um Views 2 (für Drupal 6)?
  2. Ich würde einen neuen Filter mit passendem Handler implementieren. Wie das geht steht in der Module Developer API zu finden in der Views Documentation.

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Traxer,

Eingetragen von M. P.@drupal.org (19)
am 26.09.2008 - 13:05 Uhr

Hallo Traxer,
vielen vielen Dank für deine Antwort.
Es geht um Views 1.x.
Sehe ich das richtig, dass ich diesen Filter dann in dem User- Interface unter "Filter"
der bestehenden View auswählen könnte?

Wird der Code als Module eingebunden?
Hier ist ein erster Entwurf, bin mir leider nicht im Klaren wie das Gerüst
für den Filter/ aussieht:

<?php
.
.
.
// Postleitzahl des Nodes
$zip = $node->field_postleitzahl[0]['value'];


// @return an array of nearby postal codes within 50 KM
$nearby = get_nearby_postal_codes ( $zip, 50 );

// hier fehlt sicher noch was?

// Filter für field_postleitzahl deklarieren
 
$table = array(
   
'filters' => array(
     
'field_postleitzahl' => array(
       
'name' => t('Umkreisfilter'),
       
'help' => t('Filtert Nodes nach Postleitzahl in einem Umkreis'),
       
'field' => 'field_postleitzahl',
       
'operator' => array('IN'),
       
'value' => $zip,
       
'value-type' => 'array',
       
// Sollte doch ohne Handler funktionieren?       
     
),
    ),
  );


// hier fehlt sicher noch was?
?>

  • Anmelden oder Registrieren um Kommentare zu schreiben

Re: Hallo Traxer,

Eingetragen von traxer (1009)
am 26.09.2008 - 13:38 Uhr
M. P.@drupal.org schrieb

Sehe ich das richtig, dass ich diesen Filter dann in dem User- Interface unter "Filter" der bestehenden View auswählen könnte?

Ja.

M. P.@drupal.org schrieb

Wird der Code als Module eingebunden?

Ja. Das heißt du schreibst eine Datei mymodule.module mit einer Funktion

<?php
function mymodule_views_tables() {
  
// Tabellen- und Filterdefinitionen
}
?>

Außerdem brauchst du noch eine Datei mymodule.info.

M. P.@drupal.org schrieb

Hier ist ein erster Entwurf, ...

Ist schon mal ein Anfang. Allerdings wirst du wohl doch einen Handler benötigen. hook_views_tables wird nämlich bei der Definition des Views ausgeführt. Also zu einem Zeitpunkt, zu dem du noch nicht weißt, welchen Wert der Benutzer als Postleitzahl eingegeben hat.

Der Handler wird dagegen bei der Ausführung des Views ausgeführt. Erst jetzt weißt du welchen Wert der Benutzer eingegeben hat.

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Traxer,

Eingetragen von M. P.@drupal.org (19)
am 30.09.2008 - 11:04 Uhr

vielen Dank für deinen fachkundigen Rat.
Ich denke, ich nähere mich dem gewünschten Ergebnis,
allerdings schaffe ich es bisher nicht, dass die View meinen "Umkreisfilter"
unter "Filter" auch aufführt - so dass ich diesen Filter dann zumindest schonmal auswählen könnte.
Das Modul ist geschrieben und aktiviert - ist auch nicht mein erstes Modul.

Habe dann zunächst einen ganz einfachen Filter + Handler geschrieben,
welcher zu Testzwecken bewusst noch nicht die gewünschte Funktionalität besitzt.
Aber leider wird dieser nicht als verfügbarer Filter angezeigt.
Woran könnte Views sich stören bzw. mache ich einen Denkfehler?

Das Modul:

<?php
// $Id: views_nearby_filter.module$


function views_nearby_filter_views_tables() {

// Filter für field_postleitzahl deklarieren
$table = array(
   
'filters' => array(
     
'field_postleitzahl' => array(
       
'name' => t('Umkreisfilter'),
       
'help' => t('Filtert Nodes nach Postleitzahl in einem Umkreis'),
       
'operator' => 'views_handler_operator_gtlt',
       
'value' => array(
             
'#type' => 'textfield',    // Im query wird hier ein array eingesetzt
             
'#size' => 5,
             ),
       
'handler' => 'views_nearby_filter_views_handler_filter_zip',
      ),
    ),
  );

}


/**
* Views filter handler: zip filter.
*/
function views_nearby_filter_views_handler_filter_zip($op, $filter_data, $filter_info, &$query) {
   
 
$zip = ('50321');
 
$table = $filter_info['table'];
 
$table_field = $filter_info['content_db_info']['columns']['field_postleitzahl']['column'];
 
$operator = $filter_data['operator'];

 
$query->add_table($table);
 
$query->add_where("$table.$table_field $operator ('". $zip ."')");
}
?>

Eine andere Möglichkeit wäre doch auch über
hook_views_query_alter(&$query, &$view, $summary, $level)

zu gehen und den Query zu erweitern bzw. anzupassen?
Halte ersteres Vorgehen aber für sauberer.

Besten Gruß
Markus

  • Anmelden oder Registrieren um Kommentare zu schreiben

return $table

Eingetragen von traxer (1009)
am 01.10.2008 - 09:40 Uhr

Wenn ich jetzt sage: "return $table;", dann weißt du bestimmt wo diese Zeile fehlt :-)

Außerdem:

M. P.@drupal.org schrieb

Die View soll nun dynamisch, abhängig von der Postleitzahl des Nodes generiert werden.

<?php
/**
* Views filter handler: zip filter.
*/
function views_nearby_filter_views_handler_filter_zip($op, $filter_data, $filter_info, &$query) {
  if (
arg(0) != 'node' || !is_numeric(arg(1))) {
    return;
// Wenn ich nicht auf einer node-Seite bin, dann wird nicht weiter gefiltert.
 
}
 
$nid = arg(1);
 
$node = node_load($nid);
  if (
$node) {
   
$zip = $node->field_postleitzahl[0]['value'];
   
$nearby = get_nearby_postal_codes ( $zip, 50 );
   
$table = $filter_info['table'];
   
$table_field = $filter_info['content_db_info']['columns']['field_postleitzahl']['column'];
   
$operator = $filter_data['operator'];
   
$query->add_table($table);
   
$query->add_where("$table.$table_field $operator (". join(',', $nearby) .")");
  }
}
?>

Der Block sollte so konfiguriert werden, das er nur auf node-Seiten angezeigt wird. Dann ist arg(1) die $nid des Nodes der angezeigt wird. Aus diesem Node extrahierst du die Postleitzahl und fütterst sie an deine Funktion zur Umkreissuche. Das Textfeld, das du zur Koniguration zu Verfügung hast, kannst du dann für die Entfernung verwenden (so das du nicht auf 50km festgelegt bist).

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Aua, peinlich peinlich...ja

Eingetragen von M. P.@drupal.org (19)
am 09.10.2008 - 09:34 Uhr

Aua, peinlich peinlich...ja ich sollte eigentlich wissen an welche Stelle das "return" gehört ;-)

Deine Lösung läuft jetzt einfach perfekt. Vielen vielen Dank für die super Unterstützung!

Besten Gruß
Markus

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Rolle erstellen nicht zu finden
  • Medien und andere Daten mit Feeds von Drupal 7 auf Drupal 10 migrieren
  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
Weiter

Neue Kommentare

  • Rollen
    vor 3 Tagen 22 Stunden
  • Inzwischen sind wir bei
    vor 2 Wochen 15 Stunden
  • Migrieren von D7 auf D8/ D10/ D11
    vor 2 Wochen 1 Tag
  • melde mich mal wieder, da ich
    vor 9 Wochen 5 Tagen
  • Hey danke
    vor 9 Wochen 6 Tagen
  • Update: jetzt gibt's ein
    vor 10 Wochen 29 Minuten
  • Hallo, im Prinzip habe ich
    vor 10 Wochen 4 Tagen
  • Da scheint die Terminologie
    vor 10 Wochen 4 Tagen
  • Kannst doch auch alles direkt
    vor 11 Wochen 1 Tag
  • In der entsprechenden View
    vor 11 Wochen 1 Tag

Statistik

Beiträge im Forum: 250237
Registrierte User: 20466

Neue User:

  • StevenEness
  • ocvk2810
  • marouane.blel

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 32 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association