Einblendung von Variationswerten auf dem Wunschzettel (gleich wie im Warenkorb)

hk01

Aktives Mitglied
23. Juli 2014
9
0
Hallo zusammen,

in einem Testshop versuche ich derzeit, auf dem Wunschzettel die gleichen Infos einzublenden, wie sie auch im Warenkorb zu sehen sind.

Bei unseren Produkten haben wir eine Reihe von Variationsfeldern (mehrere Pflicht-Freitextfelder sowie eine Selectbox für die Größe; geht um Bekleidung). Bevor ein Artikel auf die Wunschliste oder in den Warenkorb gelegt werden kann, müssen verschiedene Daten angegeben werden. Wenn man das Produkt nun auf den Wunschzettel legt und sich den Wunschzettel ansieht, taucht aber nur die Variationseigenschaft "Größe" auf. Die vorangehenden Pflicht-Freitextfelder werden nicht angezeigt. Legt man das Produkt nun vom Wunschzettel aus in den Warenkorb, erscheinen dort auch wieder die zusätzlichen Infos.

Wie bekomme ich es hin, dass auch auf dem Wunschzettel alles angezeigt wird?

So weit ich es herausgefunden habe, steht in der /templates/JTL-Shop3-Tiny/warenkorb.tpl (bzw. bei mir warenkorb_custom.tpl) der relevante Code:
PHP:
                              {if ($oPosition->Artikel->nIstVater == 1 || $oPosition->Artikel->kVaterArtikel > 0 && $Einstellungen.kaufabwicklung.warenkorb_varianten_varikombi_anzeigen == "Y") || ($oPosition->Artikel->nIstVater == 0 && $oPosition->Artikel->kVaterArtikel == 0)}
                                 {foreach name=variationen from=$oPosition->WarenkorbPosEigenschaftArr item=Variation}
                                    <p>{$Variation->cEigenschaftName[$smarty.session.cISOSprache]}: <strong>{$Variation->cEigenschaftWertName[$smarty.session.cISOSprache]}</strong></p>
                                 {/foreach}
                              {/if}

In der Datei /templates/JTL-Shop3-Tiny/tpl-inc/jtl_wunschliste.tpl (bzw. bei mir jtl_wunschliste_custom.tpl) scheint für die Größe das unten der relevante Code zu sein:
PHP:
                        {foreach name=eigenschaft from=$CWunschlistePos->CWunschlistePosEigenschaft_arr item=CWunschlistePosEigenschaft}
                        {if $CWunschlistePosEigenschaft->cFreifeldWert}
                           <p><b>{$CWunschlistePosEigenschaft->cEigenschaftName}:</b> {$CWunschlistePosEigenschaft->cFreifeldWert}{if $CWunschlistePos->CWunschlistePosEigenschaft_arr|@count > 1 && !$smarty.foreach.eigenschaft.last}</p>{/if}
                        {else}
                           <p><b>{$CWunschlistePosEigenschaft->cEigenschaftName}:</b> {$CWunschlistePosEigenschaft->cEigenschaftWertName}{if $CWunschlistePos->CWunschlistePosEigenschaft_arr|@count > 1 && !$smarty.foreach.eigenschaft.last}</p>{/if}
                        {/if}
                        {/foreach}

Eigentlich will ich ja einfach "nur", dass alle Zusatzinformationen angezeigt werden.

Hat da jemand einen Tipp? Oder teste ich hier in den falschen Dateien herum? Habe nämlich nicht so ganz kapiert, warum beim Warenkorb das Templatehauptverzeichnis relevant ist, bei der Wunschliste jedoch die jtl_wunschliste.tpl aus dem tpl-inc Verzeichnis.

Bin für jeden Tipp dankbar,
Grüße
 

t.oster

Gut bekanntes Mitglied
4. Dezember 2013
210
24
AW: Einblendung von Variationswerten auf dem Wunschzettel (gleich wie im Warenkorb)

Hallo,

ich habe ähnliches vor. Eine Inspektion mit "Smarty Smarter Debug" zeigt, dass es in dem Array $CWunschlistePosEigenschaft leider nicht die gewünschten Informationen gib. Allerdings für die Seitenbox, also in $Boxen.Wunschliste->CWunschlistePos_arr. Bei Freifeldern ist zusätzlich das Problem, dass in einem Array zwar der Wert, aber nicht mehr der Name des Freifeldes steht.

Meine Lösung ist ziemlich ekelhaft, deswegen möchte ich den Code hier nicht posten, aber die Vorgehensweise ist folgende:
- Suche in
$Boxen.Wunschliste->CWunschlistePos_arr den Eintrag für deine aktuelle Position (kWunschlistPos sollte übereinstimmen). Dort gehe ->Artikel->Variationen durch um an die Namen (cName) zu kommen. Zu jeder Variation suchst du (mithilfe derer kEigenschaft) in ->CWunschlistePosEigenschaft_arr den entsprechenden Eintrag. Der (Freifeld-) Wert steht da in cFreifeldWert.
 

t.oster

Gut bekanntes Mitglied
4. Dezember 2013
210
24
AW: Einblendung von Variationswerten auf dem Wunschzettel (gleich wie im Warenkorb)

Ach... wozu die falsche Scheu

in jtl_wunschliste(_custom).tpl:

unter
Code:
<div class="desc">                        <p><a class="konfiglink{$smarty.foreach.wunschlistepos.index}" href="{$CWunschlistePos->Artikel->cURL}">{$CWunschlistePos->cArtikelName}</a></p>
(ca Zeile 103)

Code:
{*MOD:Variationen anzeigen *}
{*find same position in Boxen, because there are the values actually loaded.*}
{foreach from=$Boxen.Wunschliste->CWunschlistePos_arr item="pos"}
    {if $pos->kWunschlistePos == $CWunschlistePos->kWunschlistePos && count($pos->CWunschlistePosEigenschaft_arr) > 0}
        {foreach key="index" from=$pos->Artikel->Variationen item="Variation"}
          {if $Variation->cTyp == "FREIFELD"}
            {foreach from=$pos->CWunschlistePosEigenschaft_arr item="eigen"}
                {if $eigen->kEigenschaft == $Variation->kEigenschaft}
                    <p><b>{$Variation->cName}: </b>{$eigen->cFreifeldWert}</p>
                {/if}
            {/foreach}
          {/if}
        {/foreach}
    {/if}
{/foreach}
{*endmod*}

Achtung: Bisher nur für Freifelder, da das für meine Zwecke ausreicht. Wer den Rest auch braucht, ich mache gerne ein Angebot 😉
 
Zuletzt bearbeitet:

t.oster

Gut bekanntes Mitglied
4. Dezember 2013
210
24
AW: Einblendung von Variationswerten auf dem Wunschzettel (gleich wie im Warenkorb)

Ich habe gerade festgestellt, dass die oben genannte Lösung nur bis zum nächsten Logout funktioniert.
Um das ganze Robust zu machen, braucht man eine PHP-Funktion, die einem die Variationswerte aus der Datenbank liest. Hier meine Version:

1. In die templates/JTL-Shop3-Tiny/php/functions.php

Code:
function uit_wishlistvariations($params, &$smarty)
{
    $kWunschlistePos = $params['kWunschlistePos'];
    $query = "SELECT e.cName, e.cTyp, e.nSort, v.cFreifeldWert, v.cEigenschaftWertName
        FROM twunschlisteposeigenschaft AS v
        LEFT JOIN teigenschaft AS e ON v.kEigenschaft = e.kEigenschaft
        WHERE v.kWunschlistePos = $kWunschlistePos
        ORDER BY e.nSort";
    $result = $GLOBALS['DB']->executeQuery($query, 2);
   if (isset($params['assign']))
   {
      $smarty->assign($params['assign'], $result);
   }
   else
   {
      return $result;
   }
}
$smarty->register_function("uit_wishlistvariations", "uit_wishlistvariations");

Jetzt kann man im Template mit
Code:
{uit_wishlistvariations kWunschlistePos=TODO assign="Variationen"}
sich zu jeder Wunschlistenposition die Eigenschaften holen. Für die Anzeige wie oben gefordert, reicht:

In der jtl_wunschliste(_custom).tpl im div class="desc" (gleiche Stelle wie oben, ca Zeile 80
Code:
<div class="desc">
      <p><a class="konfiglink{$smarty.foreach.wunschlistepos.index}" href="{$CWunschlistePos->Artikel->cURL}">{$CWunschlistePos->cArtikelName}</a></p>
      {*MOD:Variationen anzeigen *}
      {uit_wishlistvariations kWunschlistePos=$CWunschlistePos->kWunschlistePos assign="variations"}
      {if isset($variations) && count($variations) > 0}
          {foreach from=$variations item="Variation"}
             {if $Variation->cTyp == "FREIFELD"}
                  <p><b>{$Variation->cName}: </b>{$Variation->cFreifeldWert}</p>
              {else}
                  <p><b>{$Variation->cName}: </b>{$Variation->cEigenschaftWertName}</p>
             {/if}
          {/foreach}
      {/if}
      {*endmod*}
 

t.oster

Gut bekanntes Mitglied
4. Dezember 2013
210
24
AW: Einblendung von Variationswerten auf dem Wunschzettel (gleich wie im Warenkorb)

Ich sehe gerade beim Durchlesen des Templates, dass eigentlich die Eigenschaften korrekt geladen sein sollten und angezeigt würden, wenn das der Fall wäre:
In der Originalen jtl_wunschliste.tpl steht:

Code:
                         {foreach name=eigenschaft from=$CWunschlistePos->CWunschlistePosEigenschaft_arr item=CWunschlistePosEigenschaft}
                        {if $CWunschlistePosEigenschaft->cFreifeldWert}
                           <p><b>{$CWunschlistePosEigenschaft->cEigenschaftName}:</b> {$CWunschlistePosEigenschaft->cFreifeldWert}{if $CWunschlistePos->CWunschlistePosEigenschaft_arr|@count > 1 && !$smarty.foreach.eigenschaft.last}</p>{/if}
                        {else}
                           <p><b>{$CWunschlistePosEigenschaft->cEigenschaftName}:</b> {$CWunschlistePosEigenschaft->cEigenschaftWertName}{if $CWunschlistePos->CWunschlistePosEigenschaft_arr|@count > 1 && !$smarty.foreach.eigenschaft.last}</p>{/if}
                        {/if}
                        {/foreach}

Also scheint es definitv ein Bug im Shop zu sein, dass diese Eigenschaften nicht geladen werden.
 

t.oster

Gut bekanntes Mitglied
4. Dezember 2013
210
24
AW: Einblendung von Variationswerten auf dem Wunschzettel (gleich wie im Warenkorb)

Hier mein Aktueller Stand:
Es ist ein Bug im JTL-Shop, der dafür sorgt, dass das Array "
$CWunschliste->CWunschlistePos_arr[]->CWunschlistePosEigenschaft_arr" nicht gefüllt ist, zumindest nicht immer, also nach re-login usw.

Hier ein kleines Plugin, welches genau das wieder fixt. Am Template muss nichts geändert werden, es sollten alle Variationen direkt in der Wunschliste angezeigt werden:

http://upstart-it.com/uit_fix_wunschliste.zip

 

hk01

Aktives Mitglied
23. Juli 2014
9
0
AW: Einblendung von Variationswerten auf dem Wunschzettel (gleich wie im Warenkorb)

Hallo,
danke für den Vorschlag. Meine Frage ist momentan nicht mehr ganz aktuell, ich werde aber versuchen, es im Auge zu behalten, wenn ich nochmal dran bin. Komme dann ggf. auf Sie zurück, danke 🙂
 

Ähnliche Themen