Gibt es eine Möglichkeit, eine Liste von NIDs abzufangen, die von einer Ansicht erstellt wurden, und sie als Filter für eine andere Ansicht zu verwenden?

8

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:

  1. 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.

  2. 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.

Quader
quelle
2
Ist das Drupal 7? In diesem Fall würde ich die Verwendung von EntityFieldQuery empfehlen , um eine Liste der Knoten abzurufen , die Ihren Kriterien entsprechen.
Beth
Können Sie auf einen Beispielcode verweisen, in dem diese API verwendet wird? Ich bin neu in der Welt der Drupal-Codierung und muss einem Beispiel aus der Praxis folgen, um die Dinge herauszufinden.
Quader
drupal.org/node/1343708 ist eine Seite mit dem Namen "Verwendung von EntityFieldQueries".
Beth

Antworten:

3

Ganz oben auf meinem Kopf

Bei den Ansichten 'get_nids' und 'get_related' nimmt get_related ein nidArgument, das mehrere Werte akzeptiert. Diese Option ist unter "Mehr" am unteren Rand des Konfigurationsfensters versteckt.

Option 1:

$view = views_get_view('get_nids');
// Repeating query, ensure the View is set to cache the results.
$view->preview('display_machine_name', array($arg1, $arg2));

$nids = '';
foreach($view->result as $node) {
  $nids += $node->nid . ',';
}
$nids = rtrim($nids, ',');
$view = views_get_view('get_related');
$view->execute_display('display_machine_name', array($nids));
print $view->render();

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.

Letharion
quelle
Folgen Sie dem Code in views_db_object für die Methode -> execute (Views.inc Zeile 1060). Ich sehe nichts im Code der Methode, der das Argument liest (Array ($ nid)). Wie konfiguriere ich die Ansicht 'get_related' so, dass die Filterwerte im Array-Argument ($ nids) akzeptiert werden? Setze ich Filter auf "verwandten Inhalt" und Kontextfilter, um NIDs zu akzeptieren?
Quader
Entschuldigung, Sie haben absolut Recht, das hätte execute_display sein sollen , Informationen über den zu beantwortenden Kontextfilter hinzugefügt. :)
Letharion
Ich habe weitere Informationen hinzugefügt, um das Problem der Anzeige des Inhalts für die zugehörigen Fakten in der Frage abzuschließen. Bitte sehen Sie "Bisher".
Quader
Entschuldigung, ich verstehe nicht, wo das Problem liegt. Gemäß Ihrem Beitrag wird das Knotenreferenzfeld von Ihren Inhaltstypen gemeinsam genutzt, und als solche sammelt die Ansicht 'get_nids' alle referenzierten Entitäten. Wenn nicht, würde man eine Schleife über die erste Ansicht benötigen.
Letharion
1
Hmm! Ich glaube, ich war verwirrt und mache dies möglicherweise komplizierter, als es sein muss. Vielen Dank
Ashlar
2

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 ::

    $arg = arg();
    $nid = $arg[1]; //this finds us the NID of the current page
    $query = new EntityFieldQuery;  // this EntityFieldQuery searches through Entities for Nodes that point to the current Webform.
    $result = $query
        ->entityCondition('entity_type', 'node') // find nodes
        ->propertyCondition('status', 1) // that are published
        ->propertyCondition('type', 'quiz_answer_key')  // of type Quiz Answer Key
        ->fieldCondition('field_answer_quiz', 'nid', $nid, '=') // that point to the current node in their Quiz reference field
        ->execute(); // do the query
    $results        = $query->ordered_results; //grab the results

Wenn Sie dann tatsächlich Werte aus Feldern in den Knoten laden möchten, können Sie node_loadweitere Informationen aus den gewünschten Knoten abrufen, z. B.:

    $ans_key_id     = $results[0]->entity_id;
    $ans_node       = node_load($ans_key_id);       //once the correct node has been identified, load the contents of that node and suss out the answers 

Jetzt $ans_nodeist ein Array (oder Objekt, das ich vergesse), das alle Informationen in allen Feldern des Knotens enthält. Voilá!

Beth
quelle
0

Ok, eine codierte Lösung (es gibt nur wenige), aber hier ist eine:

  1. Erstellen Sie eine Ansicht , in der alle NID-Ausgaben dieser NIDs als durch Kommas begrenzte Liste abgerufen werden. Verwenden Sie dazu Felder als Ausgabe und setzen Sie Ihre Stileinstellungen auf Stil Unfomatted, Zeilenstilfelder -> machen Sie das NID-Feld inline und verwenden Sie es ein Komma als Trennzeichen.
  2. Erstellen Sie in Ihrem Modul eine Funktion , die diese Ansicht aufruft und die Ausgabe erhält
  3. Erstellen Sie Ihre zweite Ansicht (oder Anzeige). Verwenden Sie diese Funktion als Argument in Ihrer zweiten Ansicht, die tatsächlich die Anzeigeausgabe ausführt. Unter Argumenten sollte das Argument also node: nid sein. Die auszuführende Aktion sollte auf "Standard festlegen" und Sie gesetzt sein Verwenden Sie dann die PHP-Codeeinstellung, um Ihre Funktion aufzurufen: return mymodule_get_nids (); Stellen Sie sicher, dass das Kontrollkästchen "Mehrere Begriffe pro Argument zulassen" aktiviert ist

Schritt 2 Code

function mymodule_get_nids() {
    $view = views_get_view('getmynids')) // View name
        $view->set_display('mynids'); // Display name
        $view->execute();
        if ($view->result) {
         return $view->preview(); // Can't remember if this needs to be echo or return try both.
        }
    }
}

Sollte dies eine separate Antwort sein? oder eine Bearbeitung?

Andre
quelle
Ich suche nach codierten Lösungen. Ich werde die Frage klären.
Quader
Bitte korrigieren Sie mich, wenn ich falsch liege, aber soweit ich das beurteilen kann, würde dies das Problem nicht einmal lösen, da Ashlar versucht, Daten aus mehreren Beziehungen gleichzeitig abzurufen, während Anhänge nur den "aktuellen" Wert anzeigen. einer? (Es ist eine Weile her, seit ich Anhänge benutzt habe, also könnte ich mich irren)
Letharion
Danke für deinen Einsatz. Ich habe weitere Informationen hinzugefügt, um das Problem der Anzeige des Inhalts für die zugehörigen Fakten in der Frage abzuschließen. Bitte sehen Sie "Bisher".
Quader