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?