Zu viele Conditions fuer Listview

Fragen zum Erstellen von Templates für webEdition.
hotcroc
Member
Beiträge: 59
Registriert: Do 23. Sep 2010, 03:15
Wohnort: Melbourne, Australien

Zu viele Conditions fuer Listview

Beitragvon hotcroc » Fr 3. Jun 2016, 01:29

Meine Damen, meine Herren,
ich bin in folgender Sackgasse gelandet und hoffe jemand hier kann mir raus helfen.

Ich habe eine website (http://www.hiphop.melbourne) wo ich eine Musikerdatenbank und einen Blog habe. Beide sind als Objekte angelegt. In der Blog-Objektklasse habe ich 5 Felder mit denen ich via WE_ID’s bis zu 5 Musiker mit einem Artikel ‘verknüpfen’ kann.

Die Felder heissen: artistID, artistID2, artistID3, artistID4, artistID5

Nun möchte ich auf der Detailseite eines Artikels eine Listview mit verwandten Artikeln ausgeben. ‘Verwandt’ heisst in diesem Fall, dass sie einen Künstler der 5 Künstler gemeinsam haben. Ich habe also auf der Dateilseite bis zu 5 Variablen von oben genannten Feldern und muss nun prüfen ob jede der fünf ID’s auch in anderen Blog-Objekten vorkommt.

Mein Lösungsansatz war die folgende Condition:

Code: Alles auswählen

<we:condition name="relatedarticles">
<we:conditionAdd field="artistID" var="artistID" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID2" var="artistID" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID3" var="artistID" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID4" var="artistID" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID5" var="artistID" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID" var="artistID2" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID2" var="artistID2" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID3" var="artistID2" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID4" var="artistID2" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID5" var="artistID2" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID" var="artistID3" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID2" var="artistID3" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID3" var="artistID3" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID4" var="artistID3" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID5" var="artistID3" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID" var="artistID4" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID2" var="artistID4" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID3" var="artistID4" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID4" var="artistID4" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID5" var="artistID4" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID" var="artistID4" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID2" var="artistID4" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID3" var="artistID4" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID4" var="artistID4" type="document" />
<we:conditionOr/>
<we:conditionAdd field="artistID5" var="artistID4" type="document" />
</we:condition>
Das gab mir aber immer alle Artikel aus anstatt der gefilterten Liste. Nach mehrmaligem erfolglosem Prüfen meines Codes auf Fehler, hab ich spasseshalber mal die Anzahl der Conditions auf ein Drittel reduziert, und siehe da, es ging. Ich nehme also an dass es ein Limit für Conditions gibt??

Ich suche nun einen anderen Lösungsansatz. Dachte vielleicht mit einem Array, wo alle ID’s von dem aktuellen Artikel in ein Array geschrieben werden und ich dann mit einer Condition nur prüfe ob die ID’s in einem der 5 Felder in anderen Artikeln in meinem Array vorhanden sind oder nicht. Nicht sicher ob das so funktionieren würde.

Ich bin leider eine totale PHP-Null und total aufgeschmissen ohne we:Tags. Bin für jede Hilfe dankbar.

WBTMagnum
webEdition Partner
webEdition Partner
Beiträge: 1825
Registriert: Di 7. Mär 2006, 16:50
Wohnort: Wien
Kontaktdaten:

Re: Zu viele Conditions fuer Listview

Beitragvon WBTMagnum » Fr 3. Jun 2016, 11:43

Hallo hotcroc,

Welche wE Version hast du denn da im Einsatz?

Lass dir doch mal die Condition ausgeben nachdem du sie definiert hast:

Code: Alles auswählen

<pre><we:var type="global" name="relatedarticles" /></pre>
Was gibt das System da zurück?


Liebe Grüße,
Sascha

hotcroc
Member
Beiträge: 59
Registriert: Do 23. Sep 2010, 03:15
Wohnort: Melbourne, Australien

Re: Zu viele Conditions fuer Listview

Beitragvon hotcroc » Fr 3. Jun 2016, 13:13

Ha! Danke Sascha!

Das hier war die Ausgabe meiner Condition:

Code: Alles auswählen

((artistID = "388")  OR (artistID2 = "388")  OR (artistID3 = "388")  OR (artistID4 = "388")  OR (artistID5 = "388")  OR (artistID = "")  OR (artistID2 = "")  OR (artistID3 = "")  OR (artistID4 = "")  OR (artistID5 = "")  OR (artistID = "")  OR (artistID2 = "")  OR (artistID3 = "")  OR (artistID4 = "")  OR (artistID5 = "")  OR (artistID = "")  OR (artistID2 = "")  OR (artistID3 = "")  OR (artistID4 = "")  OR (artistID5 = "")  OR (artistID = "")  OR (artistID2 = "")  OR (artistID3 = "")  OR (artistID4 = "")  OR (artistID5 = "") )
Da ist mir dann aufgefallen, dass wenn eines der fünf Felder nicht befüllt is, dann is diese Variable in meiner Detailsiete ja leer. Ich hab mir dann so zusammengesponnen dass das vielleicht ein Problem sein könnte wenn man einen anderen Wert damit vergleicht.

Ich habe dann meinen Code so umgeschreiben, dass die leeren Variablen auf 0 gesetzt werden. Danch sah das dann so aus:

Code: Alles auswählen

((artistID = "388")  OR (artistID2 = "388")  OR (artistID3 = "388")  OR (artistID4 = "388")  OR (artistID5 = "388")  OR (artistID = "0")  OR (artistID2 = "0")  OR (artistID3 = "0")  OR (artistID4 = "0")  OR (artistID5 = "0")  OR (artistID = "0")  OR (artistID2 = "0")  OR (artistID3 = "0")  OR (artistID4 = "0")  OR (artistID5 = "0")  OR (artistID = "0")  OR (artistID2 = "0")  OR (artistID3 = "0")  OR (artistID4 = "0")  OR (artistID5 = "0")  OR (artistID = "0")  OR (artistID2 = "0")  OR (artistID3 = "0")  OR (artistID4 = "0")  OR (artistID5 = "0") )
Und nu klappt das alles auch.


Hier ist mein fertiger code falls es jemandem hilft.

Code: Alles auswählen

<!-- variablen prüfen und wenn leer auf 0 setzen -->

<we:ifVarNotEmpty match="artistID">
	<we:var name="artistID" from="document" to="global" nameto="aidpass" />
	<we:else/>
	<?php $aidpass = 0; ?>
</we:ifVarNotEmpty>
<we:ifVarNotEmpty match="artistID2">
	<we:var name="artistID2" from="document" to="global" nameto="aidpass2" />
	<we:else/>
	<?php $aidpass2 = 0; ?>
</we:ifVarNotEmpty>
<we:ifVarNotEmpty match="artistID3">
	<we:var name="artistID3" from="document" to="global" nameto="aidpass3" />
	<we:else/>
	<?php $aidpass3 = 0; ?>
</we:ifVarNotEmpty>
<we:ifVarNotEmpty match="artistID4">
	<we:var name="artistID4" from="document" to="global" nameto="aidpass4" />
	<we:else/>
	<?php $aidpass4 = 0; ?>
</we:ifVarNotEmpty>
<we:ifVarNotEmpty match="artistID5">
	<we:var name="artistID5" from="document" to="global" nameto="aidpass5" />
	<we:else/>
	<?php $aidpass5 = 0; ?>
</we:ifVarNotEmpty>

<!-- condition erstellen -->
<we:condition name="relatedbottom">
	<we:conditionAdd field="artistID" value="\$aidpass"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID2" value="\$aidpass"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID3" value="\$aidpass"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID4" value="\$aidpass"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID5" value="\$aidpass"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID" value="\$aidpass2"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID2" value="\$aidpass2"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID3" value="\$aidpass2"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID4" value="\$aidpass2"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID5" value="\$aidpass2"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID" value="\$aidpass3"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID2" value="\$aidpass3"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID3" value="\$aidpass3"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID4" value="\$aidpass3"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID5" value="\$aidpass3"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID" value="\$aidpass4"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID2" value="\$aidpass4"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID3" value="\$aidpass4"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID4" value="\$aidpass4"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID5" value="\$aidpass4"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID" value="\$aidpass5"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID2" value="\$aidpass5"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID3" value="\$aidpass5"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID4" value="\$aidpass5"/>
	<we:conditionOr/>
	<we:conditionAdd field="artistID5" value="\$aidpass5"/>
</we:condition>

<we:listview type="object" condition="relatedbottom"> ... </we:listview>

mokraemer
Senior Member
Beiträge: 3619
Registriert: So 8. Aug 2010, 01:23
Wohnort: Mainz

Re: Zu viele Conditions fuer Listview

Beitragvon mokraemer » Fr 3. Jun 2016, 14:15

interessant wäre auch welche LV du hierfür verwendest.
Da diese Art der Verknüpfung sicherlich einen Table-Scan kommt, könnte das Problem durchaus auch bei der DB liegen. Denn hier kann dann die Abfrage einfach zu lange dauern. Entweder wird dann die Seite nicht zu Ende geladen, oder die Ausgabe ist eben leer.
Ein anderes Problem kann hier auch aufkommen, wenn man nummerische Felder mit Strings vergleicht. Evtl. muß hier auch die LV noch dazu lernen um die Abfrage besser zu optimieren.
webEdition-Kern-Entwickler


Zurück zu „webEdition Templates erstellen (we:Tags)“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 Gäste