Einige Seiten (Pfade) repräsentieren eine Entität. Zum Beispiel:
- Die Seiten auf diesen Pfaden stellen eine Knotenentität dar, entity_id (nid) ist XX:
- / node / xx
- / node / xx / delete
- / node / xx / edit
- Die Seite in diesem Pfad stellt eine Suchserverentität dar (definiert durch das Such-API-Modul). Entity_id (Maschinenname) ist 'apache_solr':
- / admin / config / search / search_api / server / apache_solr
Wie laden Sie die Basisdaten zu dieser Entität (ID und Typ) ein, wenn der Hook oder die Funktion, in der Sie sich befinden, diese nicht an Sie weitergibt?
Die Standardmethode zum Abrufen der aktuellen Entität ist anscheinend die Verwendung menu_get_object($entity_type,$position_of_id_in_url)
. Dies setzt jedoch voraus, dass Sie nur für einen Entitätstyp codieren: Sie müssen den Entitätstyp programmgesteuert angeben, und noch schlimmer, Sie als Mensch müssen die URL-Position der Entitäts-IDs, die diese Entität verwendet, recherchieren und hart codieren .
Das nächste, was ich bisher finden kann, ist, die zugrunde liegende System-URL für die Seite zu erhalten (z. B. substr(request_uri(),strlen($base_path))
), dann eine monströse Schalterliste zu schreiben, die auf so etwas wie diesem Vorschlag basiert , zu raten und dann Fälle für jede mögliche Entität, von der Sie glauben, dass eine Site sie jemals haben könnte, hart zu codieren . Aber es muss etwas Besseres geben, oder?
Eine allgemeine Lösung aus dem Kern wäre am besten, aber ich akzeptiere auch eine Antwort, die von gängigen Modulen wie ctools ( Seitenmanager , Kontexte usw.), Entity API , Devel usw. abhängt .
Meine unmittelbare Notwendigkeit besteht darin, Formulare innerhalb hook_field_widget_form()
eines Widgets zu bearbeiten , das (mit der entsprechenden Konfiguration und den entsprechenden Modulen) an jeden feldfähigen Entitätstyp angehängt werden kann. Während eine allgemeine Lösung am besten wäre, würde ich auch eine enge Antwort akzeptieren, die nur innerhalb dieser Funktion oder in Formularen funktioniert (Die ID und die Daten, die für den Entitätstyp spezifisch sind, scheinen in $ -Form vergraben zu sein, sind jedoch in einer Entität eingegeben tippspezifisch, so dass es wie ein Henne-Ei-Problem erscheint, wenn man es aus der Form bringt.
------------ BEARBEITEN ------------------
Es scheint, dass einige Leute Schwierigkeiten haben, das einfache allgemeine Problem zu verstehen. Hier ist ein alternativer Anwendungsfall (ein weiteres separates, aber verwandtes Problem, mit dem ich konfrontiert bin). Angenommen, Sie haben eine Ansicht, in der einige Entitäten aufgelistet sind. Diese Ansicht befindet sich als Block / Bereich auf Seiten, die eine Entität darstellen können, z. B. eine Knotenseite oder ein Benutzerprofil (oder beide). Sie haben einen Hook eingerichtet, der die Ansichtsdaten liest und die Ergebnisse durchschaut ( foreach $view->result as...
). Angenommen , es ist hook_views_pre_renderDas heißt, Sie haben nur das Objekt $ view. Sie möchten etwas tun (z. B. die Zeile entfernen oder einige Felddaten ändern), wenn die Ansichtsergebniszeile dieselbe Entitäts-ID und denselben Entitätstyp wie die Seite hat. Sie haben die Logik, diese Daten aus den Ansichtsergebnissen zu extrahieren. Sie müssen also nur den Entitätstyp und die Entitäts-ID der generierten Seite nachschlagen, um einen Vergleich durchzuführen. Diese Daten befinden sich irgendwo in Drupal. Wenn dies nicht der Fall wäre, hätte Drupal nicht herausfinden können, dass diese Ansicht geladen werden muss. Wie bekommen Sie es also, wenn es nicht an den Hook oder die Funktion übergeben wird, in der Sie sich befinden?
Antworten:
In Drupal Core können Sie dies nicht tun. Das relevante Problem zum Hinzufügen solcher Funktionen ist hier .
Der Kern selbst gibt immer zwei Argumente weiter:
quelle
Der einfachste Weg, dieses Problem zu lösen, ist die Implementierung
hook_entity_load()
.Dann wird an das von zurückgegebene Objekt
menu_get_object()
ein entity_type gebunden.quelle
Ich habe im Modul Token Filter (D7-Version) etwas entdeckt, das so funktioniert :
Ziemlich klug - es findet eine Funktion heraus, die vor dem Aufruf seiner Funktion aufgetreten sein muss und $ entity_type und $ entity enthält ($ entity_id würde auch anstelle von $ entity funktionieren), und schaut durch das Backtrace-Objekt zurück, bis es gefunden wird.
Token Filter ist ein Feldverarbeitungsmodul , daher weiß es, dass seine Funktion nach einem Aufruf von field_attach_view () immer aufgerufen wurde . Ich bin nicht der Meinung, dass es eine gute generische Alternative zu field_attach_view gibt - aber der allgemeine Ansatz scheint zu funktionieren und ein fallspezifischer Kandidat kann immer für einen bestimmten Fall gefunden werden, indem ein Backtrace-Debug-Code (ehemals defekter Link behoben) in den Punkt eingefügt wird in dem Code, in dem Sie die Entität abrufen und sehen müssen, was verfügbar ist (überprüfen Sie dann die Logik und testen Sie, um sicherzustellen, dass sie immer vorhanden ist).
quelle
Folgendes funktioniert für mich, um Entität und Entitätstyp nach Pfad abzurufen:
quelle
kann das helfen?
quelle
function custom_module_get_entity_and_entity_type_by_path()
. Ich frage mich, in welchen Fällen meine Lösung nicht funktioniert, da Sie viel mehr tun, um den entity_type zu finden.Die eigentliche Antwort auf diese Frage hängt davon ab, warum Sie die Daten benötigen und auf welcher Ebene des API-Schichtkuchens Sie arbeiten.
Wenn Sie die Entität für eine Seite möchten , können Sie dies nicht tun. Eine bestimmte Seite kann viele Entitäten enthalten. (Jeder Knoten, Kommentar, Taxonomie ... sind alle Entitäten.)
Wenn Sie verwenden
hook_field_widget_form()
, implementieren Sie ein Feld in der Feld-API. Ihre Antwort finden Sie in der Dokumentation : Der Entitätstyp lautet$element['#entity_type']
, und Sie können die Entitäts-ID nicht abrufen, da Felder, die die API implementieren, sich nicht selbst betreffen sollten damit.Also: Warum brauchen Sie die Entitäts-ID?
quelle