Neu Konfigurator Warengruppen in sep. TABs darstellen

Conny

Sehr aktives Mitglied
7. September 2009
550
60
Hi,

ich brauche mal dringend Hilfe bei der Umsetzung eines Problems
Es geht um einen Uhrenshop wo man das Band dazu wählen muss.
Wenn im Konfigurator eine "Konfigurationsgruppe" erstellt wird und man alle Bänder in diese tut,
verliert man schnell die Übersicht (40 Bänder und mehr).

b3.png

Deswegen hatte ich mir überlegt diese in Warengruppen zu untergliedern.
Lederbänder = Warengruppe 1
Massivbänder = Warengruppe 2
Silikonbänder = Warengruppe 3

Dies würde ich jetzt gerne in TABs darstellen
b4.png
b5.png

Ich kann schon einiges in Sachen Template - aber leider hört es hier bei mir auf.

Ich dachte mir, bevor ich das Array ausgebe, erstelle ich für jede Warengruppe ein neues
und gebe diese dann aus.

Das ganze befindet sich in /templates/evo/productdetails/config.tpl

Wer hilft mir bitte beim coden ???
Ich brauche nur die Arrays (pro Warengruppe eins) - oder eine bessere Idee das Problem umzusetzten.
Den Rest hoffe ich selbst hin zu bekommen.

LG Conny
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
519
Halle
Hallo Conny,
das Problem hierbei ist, dass die Komponenten innerhalb der Konfigurationsgruppe einfach anhand der festgelegten Sortierung sortiert sind. Um diese jetzt vernünftig in Tabs aufzuteilen, müsstest du das Komponenten-Array ($oGruppe->oItem_arr) zuerst in deine Warengruppen splitten. Wenn du das im Template und nicht über ein Plugin lösen willst, dann könntest du das über eine eigne Smarty-Funktion machen, die dir ein Array (deine Tabs) mit den enthaltenen Komponenten zurückliefert. Für die Ausgabe im Template iterierst du dann über dieses Array, um deine Tabs (Bootstrap) zu erstellen.

Anm.: Statt Warengruppe würden sich hier auch Attribute anbieten, damit nicht im Template hart kodierte Beschriftungen für die Tabs verwendet werden müssen, sondern sich diese einfach automatisch aus den zugeordneten Attributwerten - die dann auch mehrsprachig sein können - ergeben.
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
519
Halle
Als Anregung mit Attributen:
functions.php erweitern:
PHP:
$smarty->registerPlugin('function', 'splitWarengruppe', 'splitWarengruppe');

/**
 * @param array  $params
 * @param Smarty $smarty
 * @return array|null
 */
function splitWarengruppe($params, &$smarty)
{
    $tabbed = [
        'Sonstige' => [],
    ];

    $configItems = $params['configItems'];
    /** @var Konfigitem $configItem */
    foreach ($configItems as $configItem) {
        /** @var Artikel $product */
        $product = $configItem->getArtikel();
        if (isset($product->AttributeAssoc['Warengruppe'])) {
            $tabbed[$product->AttributeAssoc['Warengruppe']][] = $configItem;
        } else {
            $tabbed['Sonstige'][] = $configItem;
        }
    }

    if (isset($params['assign'])) {
        $smarty->assign($params['assign'], $tabbed);

        return null;
    }

    return $tabbed;
}
In der config.tpl den Bereich:
PHP:
<ul class="list-group">
    {foreach from=$oGruppe->oItem_arr item=oItem name=konfigitem}
        ...
    {/foreach}
</ul>
Erweitern:
PHP:
<ul class="list-group">
    {splitWarengruppe configItems=$oGruppe->oItem_arr assign=wkTabs}
    <ul class="nav nav-tabs">
        {foreach from=$wkTabs item=tab key=tabName name=tabs}
            <li{if $smarty.foreach.tabs.first} class="active"{/if}><a data-toggle="tab" href="#tab{$tabName}">{$tabName}</a></li>
        {/foreach}
    </ul>
    <div class="tab-content">
        {assign var=curTabName value=''}
        {foreach from=$wkTabs item=tab key=tabName name=tabContent}
            {if $tabName !== $curTabName}
                <div id="tab{$tabName}" class="tab-pane fade{if $smarty.foreach.tabContent.first} in active{/if}">
            {/if}
            {foreach from=$tab item=oItem name=konfigitem}
                ...
            {/foreach}
        {if $tabName !== $curTabName}
            </div>
            {assign var=curTabName value=$tabName}
        {/if}
        {/foreach}
    </div>
</ul>
Wenn man es richtig schön machen will, dann muss man für das hart kodierte "Sonstige" noch eine eigene Sprachvariable anlegen und diese dann verwenden.
Das Ganze dient wie immer als Anregung und erhebt keinen Anspruch auf Vollständigkeit oder allumfängliche Funktionalität... ;)
 

Conny

Sehr aktives Mitglied
7. September 2009
550
60
Hi, danke - ich sehe du hast das super gut verstanden. Nur ist es so, dass hier meine Programmierkenntnisse nicht mehr ausreichen
und ich deshalb jemand bräuchte der mir dabei hilft, das Array hierfür zu erstellen. Denke, dass ich die Ausgabe dann selbst hin bekomme.

(Sorry - die Posts haben sich überschnitten)
Ich werde mich gleich mal dran machen deinen Vorschlag zu testen - Du bist SUPER - DANKE erst mal
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
519
Halle
Dann wäre das Einfachste, den leeren Array-Eintrag in der splitWarengruppe-Funktion zu löschen:
PHP:
$smarty->registerPlugin('function', 'splitWarengruppe', 'splitWarengruppe');

/**
 * @param array  $params
 * @param Smarty $smarty
 * @return array|null
 */
function splitWarengruppe($params, &$smarty)
{
    $tabbed = [
        'Sonstige' => [],
    ];

    $configItems = $params['configItems'];
    /** @var Konfigitem $configItem */
    foreach ($configItems as $configItem) {
        /** @var Artikel $product */
        $product = $configItem->getArtikel();
        if (isset($product->AttributeAssoc['Warengruppe'])) {
            $tabbed[$product->AttributeAssoc['Warengruppe']][] = $configItem;
        } else {
            $tabbed['Sonstige'][] = $configItem;
        }
    }

    if (count($tabbed['Sonstige']) === 0) {
        unset($tabbed['Sonstige']);
    }

    if (isset($params['assign'])) {
        $smarty->assign($params['assign'], $tabbed);

        return null;
    }

    return $tabbed;
}
 
  • Gefällt mir
Reaktionen: Conny

Conny

Sehr aktives Mitglied
7. September 2009
550
60
Ales hat super geklappt. Danke noch mal.
Nur noch mal eine grundlegende Frage:
Die Bänder müssen für den Shop aktiviert sein, damit sie im Konfigurator angezeigt werden.
Dadurch sind sie aber auch über die "SUCH FUNKTION" als einzelner Artikel auffindbar.
Kann man das irgendwie unterdrücken (Sie sollen ja nicht einzeln kaufbar sein)
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
519
Halle
Kann man das irgendwie unterdrücken (Sie sollen ja nicht einzeln kaufbar sein)
I.a.R. kann man das über Kundengruppensichtbarkeit regeln. Die Artikel also zwar für den Shop aktivieren, die Sichtbarkeit jedoch für alle Kundengruppen deaktivieren. Dann sind die Artikel im Shop vorhanden, aber in Listen oder über die Suche nicht sichtbar.
 
  • Gefällt mir
Reaktionen: Conny

Conny

Sehr aktives Mitglied
7. September 2009
550
60
Ich möchte dich noch mal fragen ob man die Ausgabe Arrays noch nach Artikelname sortieren kann?
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
519
Halle
Die Tab-Arrays werden in der gleichen Reihenfolge erstellt, wie die KonfigItems. Deren Reihenfolge müsste sich über die Konfigurationsgruppen in der Wawi steuern lassen.
Ansonsten sollte ein umsortieren aber prinzipiell über usort() möglich sein.
Ungetestet:
PHP:
function splitWarengruppe($params, &$smarty)
{
    ...

    foreach (array_keys($tabbed) as $key) {
        usort($tabbed[$key], function ($lft, $rgt) {
            return strcmp($lft->getArtikel()->cName, $rgt->getArtikel()->cName);
        });
    }
   
    if (isset($params['assign'])) {
        $smarty->assign($params['assign'], $tabbed);

        return null;
    }

    return $tabbed;
}
 
Zuletzt bearbeitet:

Conny

Sehr aktives Mitglied
7. September 2009
550
60
Hi, Danke erst mal für die schnelle Hilfe.
Aber irgendwas stimmt noch nicht mit der Syntax.
Bekomme nur weißen Schirm.

Die Sortierfunktion in den Konfigurationsgruppen hat leider keine Auswirkung auf die Anzeige.

PHP:
/**
* Für Bandwahl Konfigurator - erzeugt aus den Attributen für die Warengruppen "Metall, Leder, Sikion ein Array
* @param array  $params
* @param Smarty $smarty
* @return array|null
*/
function splitWarengruppe($params, &$smarty)
{
    $tabbed = [
       'Divers' => [],
    ];

    $configItems = $params['configItems'];
    /** @var Konfigitem $configItem */
    foreach ($configItems as $configItem) {
        /** @var Artikel $product */
        $product = $configItem->getArtikel();
        if (isset($product->AttributeAssoc['Warengruppe'])) {
            $tabbed[$product->AttributeAssoc['Warengruppe']][] = $configItem;
        } else {
            $tabbed['Divers'][] = $configItem;
        }
    }
   
    if (count($tabbed['Divers']) === 0) {
        unset($tabbed['Divers']);
    }

    if (isset($params['assign'])) {
        $smarty->assign($params['assign'], $tabbed);

        return null;
    }
   
     foreach (array_keys($tabbed) as $key) {
        usort($tabbed[$key], function ($lft, $rgt) {
            return strcmp($lft->getArtikel()->cName, $rgt->getArtikel()->cName);
        }
    }

   
    return $tabbed;
}
 

Anhänge

  • JTL-Wawi_tTflL6l88u.png
    JTL-Wawi_tTflL6l88u.png
    44 KB · Aufrufe: 9
Zuletzt bearbeitet:

Conny

Sehr aktives Mitglied
7. September 2009
550
60
Hatte ich auch so probiert. Hat leider keinen Erfolg gebracht.

Hier mal korrigiert.
PHP:
function splitWarengruppe($params, &$smarty)
{
    $tabbed = [
       'Divers' => [],
    ];

    $configItems = $params['configItems'];
    /** @var Konfigitem $configItem */
    foreach ($configItems as $configItem) {
        /** @var Artikel $product */
        $product = $configItem->getArtikel();
        if (isset($product->AttributeAssoc['Warengruppe'])) {
            $tabbed[$product->AttributeAssoc['Warengruppe']][] = $configItem;
        } else {
            $tabbed['Divers'][] = $configItem;
        }
    }
   
    if (count($tabbed['Divers']) === 0) {
        unset($tabbed['Divers']);
    }

    if (isset($params['assign'])) {
        $smarty->assign($params['assign'], $tabbed);

        return null;
    }
   
    foreach (array_keys($tabbed) as $key) {
        usort($tabbed[$key], function ($lft, $rgt) {
            return strcmp($lft->getArtikel()->cName, $rgt->getArtikel()->cName);
        });
    }
   
    return $tabbed;
}

Demo Url: https://testshop.classic-watch.de/Sinn-103-St-DIAPAL

firefox_1.png
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
519
Halle
Wie gesagt, die Sortierung muss noch vor das
PHP:
if (isset($params['assign'])) {
        $smarty->assign($params['assign'], $tabbed);

        return null;
    }
 

Conny

Sehr aktives Mitglied
7. September 2009
550
60
Wer lesen kann ist klar im Vorteil ..... hatte "und die Sortierung muss natürlich vor dem assign erfolgen... ;) Hab es korrigiert. " ich überlesen.
Ja, Danke - hat wie immer super geklappt. Danke für den tollen Support.
 

Ähnliche Themen