Ich bin an dem Punkt in der Drupal-Erfahrung angelangt, an dem ich versuche, Site-Design-Herausforderungen auf der Ebene des benutzerdefinierten Codes mithilfe von Drupal- und Views-APIs zu lösen. Wie immer hat mir mein scheinbar einfacher Versuch, ein Problem zu lösen, gezeigt, wie viel ich noch nicht weiß!
Ich habe ein Knotenreferenzfeld, das auf einen Inhalt mit verwandten Fakten verweist, der von vielen verschiedenen Inhaltstypen und Unterkategorien für jeden dieser Typen verwendet wird. Während ich eine Beziehung erstellen und die 'verwandten Fakten' für eine Ansicht anzeigen kann, gibt es Probleme. Zum einen möchte ich, dass die verwandten Fakten in einem separaten Block abgelegt werden und eine einzelne Liste verwandter Fakten für die gesamte Liste der von der Ansicht bereitgestellten Artikel angezeigt wird. Views verarbeitet keine Duplikate für mehrere Nids mit derselben Referenzquelle für verwandte Fakten. Außerdem müsste ich für jeden Inhaltstyp und jede Unterkategorie separate Ansichten zu verwandten Fakten generieren, was eine ziemlich große Anzahl sein wird.
Wenn ich eine separate Ansicht für verwandte Fakten erstellen könnte, die eine Liste von Nids als Argument akzeptieren kann, könnte die Ansicht für verwandte Fakten vereinfacht werden. Meine Frage ist also, wie ich vorgehen soll. Während es innerhalb von Ansichten möglich sein kann, suche ich nach einer benutzerdefinierten Modul-PHP-Lösung , daher muss ich Folgendes erreichen:
Extrahieren Sie die Ergebnisse einer der Ansichten des Inhaltstyps als Liste von Argumenten. Zusätzlich zur Anzeige der Ansichtsergebnisse muss ich die Liste der angezeigten NIDs laden.
Rufen Sie die Ansicht "Verwandte Fakten" auf und übergeben Sie die Liste der Nids, um sie als Filter oder Kontextfilter in der Ansicht "Verwandte Fakten" zu verwenden.
Zusätzliche Information:
Mit dieser Strategie habe ich zunächst eine Ansicht definiert und versucht, die Ergebnisse daraus zu extrahieren. Dieser Versuch führte zu einem Problem beim Finden der Ergebnisse im Ansichtsobjekt ( siehe diese Frage ). Sobald ich die Ergebnisse erhalten habe, muss ich eine andere Ansicht generieren, die diese Ergebnisse als Filter enthält. Ich habe aus Code implementierte Ansichten als Include-Dateien gesehen, in denen alle Parameter codiert sind, aber keine Beispiele gefunden, die eine Ansicht definieren und generieren und die Ergebnisse mithilfe einer PHP-Funktion bearbeiten. Alle Beispiele oder Links wäre dankbar.
Bisher:
In zwei Antworten wurde der Prozess zum Anwenden der Ergebnisse einer Ansicht und zum Platzieren in einer anderen Ansicht als Kontextfilter behandelt. Ich stehe jedoch immer noch vor dem Problem, Dutzende von Inhaltstypen mit jeweils mindestens einem Dutzend Variationen des Ansichtsinhaltsbereichs zu haben. Anstatt jede Ansicht direkt mit den zugehörigen Fakten zu verknüpfen, muss jede meiner view1-Inhaltsansichten ihre Ergebnisse an eine einzelne, separate Ansicht für verwandte Fakten übergeben.
CONTENT TYPE SUB-CATEGORY RELATED FACT (nid)
Type 1 --------- General Info 101, 105
Specifications 103, 105
Inspections 102
Quality
etc...
Type 2 ----------General Info 101, 106
Specifications 102, 103
Cost factors 107
etc...
View1 findet einen bestimmten Inhaltstyp und enthält verschiedene Artikel der Unterkategorie, sortiert nach dem Wert in einem Unterkategoriefeld. Darüber hinaus enthält es ein Knotenreferenzfeld für verwandte Fakten. Zeigen Sie einen Filter für einen Inhaltstyp und eine Unterkategorie an und verfügen Sie über Felder für die Anzeige und ein ausgeblendetes Feld mit den zugehörigen Faktenreferenzknoten.
View2 filtert nach Artikeln zu verwandten Fakten und enthält einen Kontextfiltersatz für nid (obwohl die Einstellung für die URL gilt).
Unter Verwendung des Codes in Letharions Antwort erstellt die foreach-Schleife in Zeile 6 eine Liste der Artikel-IDs, nicht der zugehörigen Fakten-IDs (die Artikel enthalten einen Verweis auf verwandte Fakten, aber die zugehörigen Fakten enthalten keinen Knotenverweis auf Artikel). . Ich muss die zugehörigen Fakten-IDs aus dem Faktenfeld in jedem Knoten extrahieren. Ich habe das Faktenfeld in die View1-Definition aufgenommen, kann aber das Ergebnis seit dem Befehl dpm ($ node) nicht finden. ist abgestürzt und ich weiß nicht, wo die Werte im Array gespeichert sind.
Da es mehr als eine View1 geben wird, die für verschiedene Inhaltstypen geklont wird, hielt ich es für sinnvoll, hook_views_post_execute zu verwenden, und habe sie wie folgt codiert:
function mymodule_views_post_execute (&$sourceview) {
$nids = '';
foreach($sourceview->result as $node) {
$nids += $node->nid . ','; //I need field name for $node->facts
}
$nids = rtrim($nids, ',');
$view = views_get_view('get_related');
//dpm($nids); // Fatal error: Cannot unset string offsets...
$view->execute_display('panel_pane_1', array($nids));
}
Schließlich bin ich mir nicht sicher, ob ich die Anzeige der Ansicht an den richtigen Ort lenken muss oder ob dies einfach durch Platzieren des Inhaltsbereichs für verwandte Fakten an der Position des Panels über die Benutzeroberfläche der Panels erfolgt und das Thema der Panels den Rest erledigt.
Antworten:
Ganz oben auf meinem Kopf
Bei den Ansichten 'get_nids' und 'get_related' nimmt get_related ein
nid
Argument, das mehrere Werte akzeptiert. Diese Option ist unter "Mehr" am unteren Rand des Konfigurationsfensters versteckt.Option 1:
Option 2:
Fügen Sie get_nids einen Anzeigetyp "Kontext" hinzu und übergeben Sie diesen Kontext als Argument an eine Anzeige im Inhaltsbereich von get_related. Leider muss ich vermuten, dass Views-Kontexte die Komprimierung mehrerer Ergebnisse in einem einzigen Kontext nicht unterstützen, sodass möglicherweise eine Funktionsanforderung in Ctools erforderlich ist.
Option 3:
Beth hat einen ausgezeichneten Vorschlag in einem Kommentar, der EntityFieldQuery verwendet , wenn Sie eine reine Codelösung wünschen, die auch mit MongoDB funktioniert . Ansichten haben jedoch den Vorteil, dass der größte Teil der Arbeit in einer Benutzeroberfläche ausgeführt werden kann, was häufig praktisch ist.
quelle
Das Auffinden von Feldern innerhalb eines Knotens und das Zurückgeben einer Liste von NIDs ist genau das, wofür EntityFieldQueries geboren wurde. (Siehe auch: meine eigene Frage zum Thema ).
Ein Beispiel aus meinem Code, der bei der Übermittlung des Webformulars ausgeführt wird und in dem ich Knoten vom Typ "Quiz-Anzwer-Schlüssel" suche, um die Knoten mit dem Feld "Quiz-Referenz" zu finden, die mit der NID des aktuell validierenden Webformulars ausgefüllt sind ::
Wenn Sie dann tatsächlich Werte aus Feldern in den Knoten laden möchten, können Sie
node_load
weitere Informationen aus den gewünschten Knoten abrufen, z. B.:Jetzt
$ans_node
ist ein Array (oder Objekt, das ich vergesse), das alle Informationen in allen Feldern des Knotens enthält. Voilá!quelle
Ok, eine codierte Lösung (es gibt nur wenige), aber hier ist eine:
Schritt 2 Code
Sollte dies eine separate Antwort sein? oder eine Bearbeitung?
quelle