[Gelöst] Views Sortierung nach Umkreis - abhängig von Location, die in einem CCK Feld des gerade aktiven Users steht

am 11.07.2011 - 21:37 Uhr in
Hallo, ich hoffe die sperrige Frage schreckt niemanden ab... denn ich hoffe, daß es sich für jemanden der sich mit PHP auskennt nur um ein kleines Problem handelt:
Ich habe Nutzerprofile mit content_profile erstellt und erfasse die Adresse als eigenes CCK-Feld vom Typ "Location" - aber nicht(!) als die klassische User-Location.
Weiter habe ich dazu natürlich location, GMap etc. im Einsatz und alles funktioniert prima - ich habe per Views auch schon Umkreissuchen für diverse Fälle gebaut...
Jetzt stoße ich mit dem View (Tabellenansicht) an einer banalen Stelle an ein Problem, da keine der "Auswahlfunktionen" genügen:
Ich möchte alle nodes (die auch alle eine gültige Location haben) zum Start per Sortierung in aufsteigender Entfernung zur Userlocation (die in dem eigenen CCK Feld!) anzeigen.
Schön einfach wäre das, wenn ich hier die "Profil-Location" der UID nehmen könnte... dann würde ich wohl die UID des gerade aktiven Nutzers als Argument angeben und könnte die "Proximity" Sortierung der anzuzeigenden nodes auf die Location der UID beziehen...
Jetzt komme ich an die relevante Location aber nicht über diesen Weg oder eine andere "Standardauswahl".
Was ich benötige, ist die Location, die im CCK Feld "field_userlocation" des Benutzerprofils des gerade aktiven Nutzers gespeichert ist.
Meine Weisheit reicht jetzt gerade noch bis hier: Ich nehme trotzdem als Argument die UID des gerade aktiven Nutzers auf - dann hätte ich doch zumindest schon mal die Info verfügbar, wer da gerade als Nutzer unterwegs ist... Dann würde ich bei der Proximity Sortierung die Auswahl treffen: "Use PHP Code to determine lat long"... so und dann bräuchte ich doch nur noch funktionierenden Code, der sinngemäß folgendes macht:
Nutze die UID aus dem Argument und nimm von diesem User die Lat/Long Werte aus dem Feld "field_userlocation"...
Kann das so funktionieren? Wie lautet der PHP Schnipsel, den ich in der Proximity Sortierung benötige...?
- Anmelden oder Registrieren um Kommentare zu schreiben
Ich verstehe Dein Posting
am 11.07.2011 - 23:47 Uhr
Ich habe Dein Posting jetzt 6 Mal durchgelesen aber ich verstehe es nicht ganz.
Ich möchte alle nodes (die auch alle eine gültige Location haben) zum Start per Sortierung in aufsteigender Entfernung zur Userlocation (die in dem eigenen CCK Feld!) anzeigen.
Was meinst Du damit (zum Start)? Wenn der (angemeldete) User die Startseite betrachtet (auf der der View mit der Umkreissuche eingebunden wurde)? Oder wenn der User ein fremdes User-Profil besucht (auf dem dann ein Block/view mit der Umkreissuche zu finden ist)?
Musst Du nicht einfach nur als Argument "Benutzer-ID des angemeldeten Benutzers" wählen wenn Du anhand der Locations-Infos des angemeldeten/betrachtenden Users eine Umkreissuche durchführen willst? Unter "Sortierung" wählst Du dann "Ort: Entfernung / Umgebung" (aufsteigend/absteigend) und dort wählst Du das CCK-Locationfeld (Location to use:) aus welches die Location-Informationen des Users enthält.
Oder willst Du das Content-Profile des angemeldeten User laden und diese NID übergeben?
Entschuldigung wenn mein Post
am 12.07.2011 - 09:57 Uhr
Entschuldigung wenn mein Post etwas strubbelig war... hier nochmal ausführlicher/präziser:
Ausgangssituation Profile:
Die Userprofile sind alle mit content_profile angelegt und enthalten diverse CCK-Felder.
Eines dieser CCK Felder ist das Feld "Adresse" vom Typ "location".
Das ist aber nicht(!) gleichzusetzen mit einer "location", die ich dem node=nid, bzw. der uid zuweisen würde - diese location-information wird nicht gefüllt und nicht genutzt
Das Feld Adresse wird bei der Registrierung als Pflichtfeld gefüllt (Minimum PLZ+Ort) und damit ja auch von location/GMap verarbeitet und geocodiert
Ausgangssituation Content Type "Telefonbucheintrag"
Jeder Telefonbucheintrag enthält ein Pflichtfeld Adresse vom Typ location
Gewünschte Funktion:
Beim Aufruf des Telefonbuchs wird per Views eine Tabelle erzeugt, die alle nodes vom Typ Telefonbucheintrag anzeigt
Bei anonymen Nutzern ist mir die Sortierung egal - das könnte ich nach Belieben nach PLZ, Name etc. machen...
Bei angemeldeten Nutzern soll die Tabelle aber die Einträge in aufsteigender Entfernung von der Nutzer-Adresse anzeigen.
So...
Dein genannter Ansatz geht ja auch genau in diese Richtung - nur habe ich ihn schon erfolglos durchgespielt.
- Die uid des angemeldeten Nutzer als Argument fand ich schlüssig - die kann man ja als "Standardargument" bekommen...
- Umkreissortierung finde ich bei "Sortierung" - dort kann ich dann auch die Umkreissortierung um die location der uid auswählen... aber diese location ist ja leer...
Weg/Problem A:
Ich nehme die uid als (Standard)Argument und mache die Umkreissortierung um die uid - dort kann ich aber nur das genutzte Argument (also die uid) auswählen und nicht die "location to use"...
>>Daher wäre hier mein Ansatz gewesen, bei der Umkreissortierung "use PHP code..." zu wählen und mit geeignetem Code auf das CCK-Feld "user_location" im Profil des Nutzers (uid aus Argument) zuzugreifen und die lat/long Informationen so zu ermitteln...
Weg/Problem B:
Wenn ich für die Umkreissortierung nicht eine uid, sondern eine nid als Argument nutze, kann ich tatsächlich die "location to use" auswählen und finde dort auch das CCK Feld "user_location"
>>Problem ist hier, daß ich die Info bzgl. des aktuellen Nutzers - also die node-id des Profils des angemeldeten Nutzers - als nid-Argument übergeben müsste...
Bei beiden Wegen komme ich also mit den Views-Basics so nicht zurecht, sondern müsste irgendwo eingreifen.
Weg A scheint für mich gar nicht so abwegig, nur fehlt mir leider so gut wie jede PHP Kenntnis, bzw. korrekte Syntax, die in diesem Views Feld helfen könnte...
Zitat:Weg/Problem B:Wenn
am 12.07.2011 - 15:03 Uhr
Weg/Problem B:
Wenn ich für die Umkreissortierung nicht eine uid, sondern eine nid als Argument nutze, kann ich tatsächlich die "location to use" auswählen und finde dort auch das CCK Feld "user_location"
>>Problem ist hier, daß ich die Info bzgl. des aktuellen Nutzers - also die node-id des Profils des angemeldeten Nutzers - als nid-Argument übergeben müsste...
Ja - genau! Und das machst Du folgendermaßen. Die Ansicht ist eine "Node-Ansicht"!
Dort wählst Du als Argument "Global: Null" -> "Standardargument zu Verfügung stellen" -> "PHP-Code"
Dort kommt folgender Code rein! (ohne PHP-Start und End-Tag)
<?php
global $user;
if (arg(0) == 'node' && is_numeric(arg(1))) {
$account = user_load($user->uid);
if (isset($account->uid)) {
$node = content_profile_load('profile', $account->uid);
return $node->nid;
}
}
?>
Wichtig: In diesem Beispiel heißt der Inhaltstyp des Content-Profiles "profile" - wenn der Inhaltstyp bei Dir anders heißt, musst Du im Code die "maschinenlesbare Bezeichnung" ändern/anpassen!
Mit diesem Code lädst Du das Content-Proifle des betrachtenden Users und gibst die NID des Content-Profile-Nodes als Argument zurück, sodass die Umkreissuche anhand der dort vorhandenen Location-Infos durchgeführt wird. Über "Sortierkriterium" stellst Du ein wie die Ergebnisse, relativ zum betrachtenden User, sortiert werden sollen.
Der View wird aber nur angezeigt wenn der betrachtende User ein "angemeldeter User" ist. Wenn er ein "Gast" ist, wird der View nicht angezeigt! Für Gäste müsstest Du also einen 2ten "Umkreissuche-View" erstellen und dort einen "Standardwert" einstellen oder was auch immer. Die Sichtbarkeit der Views steuerst Du in den View-Einstellungen über "Zugriff" -> Rolle oder (je nach dem wie der View im Node angezeigt wird) über einen If-Anweisung.
Anmerkung:
Wenn der betrachtende User seine eigene Telefoneinträge nicht sehen soll, nimmst Du als zusätzliches Argument "Node: Beitrags-ID" mit dem selben Code von oben - zusätzlich aktivierst Du im unteren Bereich die Option "Argument ausschließen".
Ich habe das Geschriebene bei mir ausprobiert und hier funktioniert es wunderbar.
Blödsinn, was ich geschrieben
am 12.07.2011 - 16:30 Uhr
Blödsinn, was ich geschrieben habe....
Sieht schlüssig aus, funktioniert (bisher) aber nur halb...
am 12.07.2011 - 21:19 Uhr
Danke schon mal für deine Antwort und den Codeschnipsel. In der Theorie kann ich das genau so nachvollziehen und ich denke auch, daß ich alle von dir beschriebenen Schritte 1:1 umgesetzt habe.
In der Praxis funktioniert das bei mir aber noch nicht ganz... Die Lösung hat ja zwei Elemente - a) das Argument, daß per PHP Code die nid des aktuell eiogeloggten user-profiles zurückliefern soll und b) die Umkreissortierung, die zu der nid und dem CCK Feld "user_location" die entsprechende Sortierung macht.
Teil b) funktioniert definitiv - wenn ich in der Views-Live-Vorschau eine nid als Argument angebe, so wird die Umkreissortierung definitiv auf die location dieser nid=user-profile bezogen...
was Teil a) angeht... meine user-profiles haben auch den maschinenlesbaren Namen "profile"... also keine Änderung in deinem Code notwendig...
nur bekomme ich trotzdem offensichtlich keine nid aus dem Code zurückgeliefert - weder wenn ich die gewünschte Tabelle als Seite oder als Panel ausgeben möchte, noch in der Views Live-Vorschau. Selbst da sollte Global:Nulll ja als nid die nid des gerade eingeloggten Admin-Accounts zurückliefern und diese für die Umkreissuche bereitstellen... tut´s noch nicht... ich probier mal noch ein wenig rum und melde mich wieder.
Hast Du beim Code den
am 12.07.2011 - 21:26 Uhr
Hast Du beim Code den PHP-Start und End-Tag weggelassen?
Wo wird der View aufgerufen? In einem Node oder ist es ein View (Page) mit einem eigenen Pfad?
... weder wenn ich die gewünschte Tabelle als Seite oder als Panel ausgeben möchte ...
Also verwendest Du entweder einen View (Page) mit eigenem Pfad oder der VIew wird (über Panels) in/auf einem User-Profile angezeigt?
Der Reihe nach: 1. ja, Start
am 13.07.2011 - 09:12 Uhr
Der Reihe nach:
1. ja, Start und Ende Tags habe ich weggelassen
2. Aufgerufen habe ich den View inzwischen in versch. Varianten:
- ursprünglich war die Ansicht als "Inhaltsausschnitt" in Panels eingebunden - da habe ich dann bei den Ausschnitt-Einstellungen noch "Argumenteingabe: >Aus Panel Argument >> Erstes" eingestellt -> kein Ergebnis - der Pane wird auf der Panelseite gar nicht angezeigt.
- testweise habe ich als Ansicht aber auch noch eine Seite /testtb hinzugefügt, weil ich dachte, es funktioniert vielleicht was mit der Argumentübergabe in den Ausschnitt nicht funktioniert... -> auch kein Ergebnis - die Seite wird gar nicht erst erzeugt/gefunden, also der gleiche Effekt wie beim Panel
- noch nicht einmal die Live-Vorschau zeigt etwas an... sobald ich das Global:Null Argument mit dem PHP Code in den View einbaue, verschwindet sofort die Live-Vorschau ("Abfrage Es wurde keine Abfrage ausgeführt"). Mal unabhängig davon, ob ich jetzt nach dem Arg sortieren will oder nicht, sobald das Argument drin ist, kommt da nix mehr... ausser natürlich, wenn ich für die Live-Vorschau von Hand eine gültige nid als Argument eingebe - dann wird artig nach der CCK-user_location dieser nid sortiert.
Zu deiner letzten Frage die (vielleicht noch wichtige?) Info: Das "Telefonbuch" wird (über Panels) nicht (!) als Element in/auf einem User-Profile angezeigt, sondern auf einer eigenen Panelseite "Telefonbuchstartseite".
Die enthält verschiedene Panes von denen die Telefonbuchsuche nur ein Element ist und läuft unter [domain]/telefonbuch.
Und noch während ich das hier schreibe, habe ich (natürlich ohne zu wissen, was ich da wirklich anrichte... :-D) die "äussere If-Schleife" entfernt - und: es funktioniert!
Aber da die Abfrage
<?php
if (arg(0) == 'node' && is_numeric(arg(1))) {
?>
Zumindest scheint hier aber der Grund für das Scheitern zu liegen - nur wie müsste/könnte man diese Schleife ändern, damit sie funktioniert?!
Hallo,die If-Anweisung zu
am 13.07.2011 - 10:12 Uhr
Hallo,
die If-Anweisung zu entfernen, um zu sehen ob da der Fehler liegt, wäre der nächste Vorschlag gewesen aber Du hast es ja schon selbst gemacht.
<?php
if (arg(0) == 'node' && is_numeric(arg(1))) {
?>
bedeutet, dass der Code nur ausgeführt wird wenn die aufgerufene Seite ein "Node" und numerisch ist. z.B. domain.com/node/1234
Wenn es ein User-Profile wäre z.B. domain.com/user/1234 dann würde er nicht ausgeführt werden.
Ich kenne mich mit Panels leider überhaupt nicht aus daher weiß ich nicht wie dort die Argumente lauten.
Wenn es aber, ohne die If-Anweisung, keine Probleme gibt, lass sie erstmal weg.
Zu Panels kann ich leider nichts weiter sagen!
Läuft! :-)
am 13.07.2011 - 11:08 Uhr
Ah - ok... dann könnte das schlicht und einfach daran gescheitert sein, daß in keinem der Fälle, die ich ausprobiert habe, der Aufruf mit "domain.com/node/1234" erfolgt ist... meine Seiten laufen alle mit Alias (also die Panel-Seite mit domain.com/Telefonbuch), der View-Testseite habe ich den festen Pfad domain.com/testtb gegeben und die Live-Vorschau in der Views-Admin Oberfläche erfüllt das Kriterium ja auch nicht... Wenn die Abfrage wirklich nur dafür war (und nicht noch irgendwelche anderen drohenden Fehler abfangen sollte), dann lasse ich sie mal guten Gewissens weg.
Ich habe das ganze Ding jetzt auch schon online. Funktioniert super!
Tatsächlich muß man aber für anonyme Nutzer einen zusätzlichen View anlegen (ohne Argument und Sortierung...). Aber das ist ja speziell mit Panels kein Problem - da gibt´s jetzt halt 2 komplette View-Panes und je nach Rolle (anonym vs. auth) wird halt immer nur einer angezeigt.
Und jetzt noch vielen Dank für den besten Support, den ich je hier im Forum erlebt habe... ;-)
Ich habe zwar schon viele hilfreiche Antworten auf meine (tlw. amateurhaften) Fragen bekommen aber so prompt, umfassend und detailliert war das noch nie. Sonderlob! ;-)
Gern geschehen. (rot werd)
am 13.07.2011 - 11:12 Uhr
Gern geschehen. (rot werd) :-)