Media- und Nodeobjekte über Tags verbinden
am 08.09.2020 - 19:07 Uhr in
Liebe Community,
ich breche mir gerade mit Relationships und Contextualen Filtern einen ab. Ich möchte gerne einen Block via Views erzeugen, bei dem die Media Images angezeigt werden, die die selben Tags, wie der angezeigt Node hat.
Dafür haben sowohl der Mediatype Image als auch mein entsprechender Content Type ein Reference Feld auf das selbe Vokabular. Nun scheitere ich jedoch an den Einstellungen zum Contextualen und zu den Relationsships.
Ich dachte ich komme über den Contextualen Filter irgendwie an die Node ID und über diese an die IDs des Taxonomy Feldes des Content types. Mit deren Hilfe wollte ich die Where-Bedingung setzen, das gelingt mir jedoch mal so gar nicht.
Eventuell kann mir von euch jemand helfen und den entsprechenden Tip geben.
beste Grüße
- Anmelden oder Registrieren um Kommentare zu schreiben
Du benötigst zwei Beziehungen
am 08.09.2020 - 22:08 Uhr
Du benötigst zwei Beziehungen die erste vom Node zum Taxonomy-Begriff, die zweite vom Taxonomy-Begriff (über die erste Beziehung) zum Media Objekt. Als Kontextfilter brauchst Du dann die Node-ID. Das sollte mit einer View zu erstellen sein.
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Hier liegt jetzt leider der
am 09.09.2020 - 06:51 Uhr
Hier liegt jetzt leider der Hund begraben, ich weiß nicht wie ich die Beziehung zum Node herstellen soll. Ich kriege die Beziehung zwischen Node und Taxonomy nicht hergestellt, benötige ich dafür einen extra View?
Beim Anlegen des Views habe ich statt "Content", "Media" genommen, weil ich ja Mediaelemente anzeigen lassen will - bin ich hier eventuell schon falsch abgebogen?
Aller Anfang ist schwer...
Ich kriege es einfach nicht
am 30.09.2020 - 17:35 Uhr
Ich kriege es einfach nicht final hin. Daher bitte ich euch erneut um Hilfe, es werden mittlerweile alle Mediaobjekte angezeigt, bei denen ein Termeintrag übereinstimmt, sprich es reicht wenn das Mediaobjekt einen einzigen Termeintrag mit dem Nodeobjekt identisch hat. Mein Wunsch ist aber dass das angezeigt Mediaobjekt alle Termeinträge vom Node haben muss. Sprich, wenn der Node 5 Termeinträge hat, dann muss das Mediaobjekt auch alle 5 Einträge haben, kann aber durchaus auch mehrere haben.
Im Übersichtsbild habe ich das ganze mal versucht aufzuzeigen.
Der Filter beim der 1 ist nur da, weil für jeden gemeinsamen Tag einmal das Mediaobjekt angezeigt wird.
Über die rote zwei greife ich auf die Node ID zu. (siehe Bild views_contextualfilter)
Die rote drei stellt die Beziehung zwischen Media Objekt und Terms/Tags her.
Die rote vier stellt die Beziehung zwischen Node ID und Terms/tags her.
vielleicht hat von euch noch jemand einen Rat.
beste Grüße
Aller Anfang ist schwer...
Liebe Community, ich habe das
am 27.07.2021 - 20:11 Uhr
Liebe Community,
ich habe das Thema jetzt erstmal ruhen gehabt und doch habe ich auch dieses Jahr (pünktlich zum Urlaub) das gleiche Problem und bekomme es auch mit einem Jahr Pause nicht gelöst.
Daher versuche ich es noch einmal euch um Hilfe zu ersuchen.
Ich versuche noch einmal genauer zu beschreiben, was ich gemacht habe und was dabei rauskommt:
Ich habe ein Media Imageobjekte mit einem "Feld X" zum Vokabular "Tags" und eben einem Imagefeld.
Das Feld X kann beliebig viele Tags referencieren
Nun habe ich folgende Mediaobjekte (Titel => kommaseparierte Tags)
Media1=> Norwegen, 2020
Media2=>Rügen, 2020
Media3=> Rügen, 2021
Bei meinem Node gibt es das Feld Y, welches ebenfalls auf das Vokabular "Tags" referenziert.
Und ich habe drei Nodes (Titel=> kommaseparierte Tags => erwartete Mediaobjekte => Objekte die nach meiner Methode angezeigt werden):
"Unser Trip nach Nordnorwegen" => 2020, Norwegen => Media1 =>Media1, Media 2
"Das Jahr 2020 im Überblick" => 2020 => Media1, Media2 => Media1, Media2
"Rügen ist groß" => Rügen, 2021 => Media 3 => Media2, Media3
Das Problem bei meinem Filter scheint zu sein, das es ausreicht, wenn ein Tag übereinstimmt, das nächste Problem ist, dass für jede Tag Übereinstimmung auch die Anzahl an Bildern bekomme, sprich, wenn in einem Node 6 Tags sind und in dem Mediaobjekt sind auch 6 Tags und alle 6 stimmen überein, dann wird das Bild 6 Mal angezeigt. Bei 6 Bildern, die eigentlich zu einem Bild gehören sollten sind es dann 36.
Bei den Relationships habe ich zu erst die Beziehung A erzeugt, welche eine Beziehung zum Feld X herstellt.
Anschließend habe ich eine Beziehung zum Feld Y erzeugt.
Und bei den Contextualen Filtern habe ich die Node ID aus der URL ausgelsen.
Nur wie kann ich den Spaß jetzt erweitern, dass jedes Bild wirklich nur einmal und auch nur bei einer gesamten Übereinstimmung angezeigt wird?
mit besten Grüßen
Andy
Aller Anfang ist schwer...
bei d7 gabs eine einstellung
am 28.07.2021 - 15:24 Uhr
bei d7 gabs eine einstellung bei den query settings das hieß sowas wie "distinct"/eindeutig bei der abfrage
C.A.W. Webdesign
In den Einstellungen für den
am 30.07.2021 - 07:27 Uhr
In den Einstellungen für den View unter Advanced gibt es die Query-Settings, da kann ich den Haken bei "Distinct" setzen, die Auswirkungen sind gleich Null.
beste Grüße
Das Problem scheint tatsächlich schon recht lange bekannt zu sein: https://www.drupal.org/project/drupal/issues/2993688
Aller Anfang ist schwer...
Hier gibt es eine 8/9er
am 30.07.2021 - 15:41 Uhr
Hier gibt es eine 8/9er Version des Moduls "Views Distinct".
https://www.drupal.org/files/issues/2021-02-23/views_distinct.zip
Gefunden hier: https://www.drupal.org/project/drupal/issues/2993688#comment-14170497
Drupal rockt!!!
Leider hat auch dieses Modul
am 01.08.2021 - 10:30 Uhr
Leider hat auch dieses Modul keinerlei Auswirkungen auf die doppelten Objekte. Scheinbar ist die Funktionsfähigkeit noch nicht wirklich gegeben.
Tatsächlich finde ich es aktuell auch schlimmer, dass ich mich zu glatt anstelle, dass die beziehung vollumfänglich funktioniert.
Sprich es müssen alle Tags übereinstimmen und nicht nur einer, damit das Foto angezeigt wird.
Aller Anfang ist schwer...
Hast Du schon mit Aggregation versucht?
am 04.08.2021 - 01:23 Uhr
Ich habe es nicht gemacht, aber wahrscheinlich löst das Dein Problem
Wenn das nicht klappt, schau Dir das hier an: https://www.ostraining.com/blog/drupal/duplicate-views-results/
Drupal === lesen!
==============
WP? Auch cool!
https://intempore.com.co
Leider funktioniert dies auch
am 04.08.2021 - 16:51 Uhr
Leider funktioniert dies auch nicht. Ich bekomme eine rote SQL-Fehlermeldung, das ein Feld nicht existiert. Und auch der Hinweis von Ostraining hilft leider nicht.
Aller Anfang ist schwer...
Guten Abend, die doppelten
am 13.08.2021 - 22:04 Uhr
Guten Abend,
die doppelten Einträge habe ich jetzt relativ einfach wegbekommen. Ich hatte versucht mich nochmal mit der Anzeige von allen übereinstimmenden Tags zu beschäftigen und dabei den Filter versehentlich auf Tags delta gesetzt und den Wert auf 0 gesetzt. Dadurch sind die doppelten verschwunden. Nun bleibt das Problem mit den nicht perfekt übereinstimmenden Tags, ich habe das Problem nochmal im Bild tags verdeutlich , mein Ziel ist es das nur die Mediaelemente angezeigt werden, die alle NodeTags enthalten, d.h. das Mediaobjekt kann durchaus eine größere Anzahl an Tags haben, muss aber zwingend auch alle Tags des Nodes referenziert haben.
mit besten Grüßen
Andy
Aller Anfang ist schwer...
Mit dem Setzen von Delta auf
am 14.08.2021 - 11:04 Uhr
Mit dem Setzen von Delta auf 0 wird immer nur der erste Tag aus der Tagliste des Elements berücksichtigt und die anderen fallen weg.
Das Problem läßt sich, soweit ich das übersehe nur doch Programmierung lösen. Du erstellst zunächst eine View, die die Mediaobjekte auf alle im Kontextfilter übergebenen Tags filtert. In einer selbst geschiebenen Funktion, die hook_preprocess_node benutzt, holst Du erst alle Tags aus Deiner node, rufst dann mittels views_embed_view die angesprochene View auf und übergibst alle Tags als Kontextfilter. Die zurückgegebene Ergebnisliste bereitest Du dann in einem Array auf, das in einem twig-Template ausgegeben werden kann.
Eine andere Lösung sehe ich bei Deiner Datenstruktur nicht.
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Hi,vielen Dank für deine
am 14.08.2021 - 15:59 Uhr
Hi,
vielen Dank für deine Antwort. Dann beuge ich mich dem einfach....Ich habe mir nun jedoch gedacht, dass ich zu erst einmal versuche hook_views_query_alter() anzupassen.
Letztendlich muss der Spaß um eine generische Anzahl an:
INNER JOIN {media__field_tags} media__field_tags_value_1 ON media_field_data.mid = media__field_tags_value_1.entity_id AND media__field_tags_value_1.field_tags_target_id = '58'
und einer Gruppe von
((media__field_tags_value_0.field_tags_target_id = '62') AND (media__field_tags_value_1.field_tags_target_id = '58'))
Bis jetzt habe es geschafft den Query um eine generische Anzahl an Where-Conditions zu erweitern:
<?php
use Drupal\views\ViewExecutable;
use Drupal\views\Plugin\views\query\QueryPluginBase;
use Drupal\node\Entity\Node;
/*
* Implements hook_views_query_alter().
*/
function custom_view_query_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {
$id_view = $view->storage->id();
switch($view->storage->id()) {
case 'duplicate_of_photo_gallery_test_';
$nodeId = $view->args[0];
$node = Node::load($nodeId);
$i = 0;
foreach ($node->get('field_mt_post_tags')->getValue() as $term) {
$fieldQueryName = 'media__field_tags_value_' . $i . '.field_tags_target_id';
if ( 0 === 1) {
//INNER JOIN {media__field_tags} media__field_tags_value_1
ON media_field_data.mid = media__field_tags_value_1.entity_id AND media__field_tags_value_1.field_tags_target_id = '58'
$configuration = [
'type' => 'INNER',
'table' => 'user__field_region',
'field' => 'entity_id',
'left_table' => 'users_field_data',
'left_field' => 'uid',
'operator' => '=',
];
$join = Views::pluginManager('join')
->createInstance('standard', $configuration);
$query->queueTable('user__field_region', 'users_field_data', $join , 'user__field_region');
$query->where[1]['conditions'][] = [
"field" => $fieldQueryName,
"value" => $term['target_id'],
"operator" => '=',
];
}
$i++;
}
break;
}
}
Dazu habe ich ein Modul custom_view_query erzeugt, welches die Datei custom_view_query.views_execution.inc beinhaltet und den obigen Code abgelegt.
Die nächsten Schritte sind die Erweiterungen um eine generische Anzahl an Inner Joins und die Gruppierung der Where-Clauseln.
Ich hoffe dass die dokumentierte Lösungsfindung in Ordnung ist.
beste Grüße Andy
Aller Anfang ist schwer...