Neu Vaterartikel ausblenden und stattdessen Kindartikel anzeigen lassen: Lösungsansatz gesucht

Cimtana

Aktives Mitglied
28. August 2019
2
0
Guten Tag,

ich beschäftige mich seit kurzem mit der Entwicklung von Plugins, bin also noch recht unerfahren, habe jedoch schon Erfahrungen im Programmieren gesammelt. Ich habe nun die Aufgabe ein Plugin für JTL- Shop 4 zu entwickeln, welches den Vaterartikel ausblendet und stattdessen alle Kindartikel anzeigt. Ich habe mich an mehreren Ansätzen ausprobiert und auch schon nach Lösungsansätzen gegoogelt.
Ich habe auch Lösungen gefunden: Einmal hier im Forum (https://forum.jtl-software.de/threa...ategorien-und-vaterartikel-ausblenden.112451/ ) und einmal im JTL Issue Tracker (https://issues.jtl-software.de/issues/SHOP-475) - leider sind beide Lösungen nicht mehr aufrufbar.

.Hooks, bei denen ich vermutete, dass sie nützlich für die Aufgabe sein könnten:
1. HOOK_ARTIKEL_INC_FASSEVARIVATERUNDKINDZUSAMMEN
-Die Idee hier war es, die Änderungen an $oArtikel so weit wie möglich rückkangig zu machen.​
2. HOOK_ARTIKEL_CLASS_FUELLEARTIKEL
-Ähnlich Ansatz: Alle Änderungen, die Kindartikel betreffen sollten rückgangig gemacht werden​
3.1. HOOK_FILTER_INC_BAUEARTIKELANZAHL
3.2. HOOK_FILTER_INC_GIBARTIKELKEYS
-Mithilfe von Sql den Vaterartikel durch die entsprechenden Kindartikel ersetzen​
4. HOOK_SMARTY_OUTPUTFILTER
-Direkt auf die index,tpl des templates productlist zugreifen und sie soweit verändern, dass die Kindartikel anstelle des vaters angezeigt werden.​

Da ich bisher mit all diesen Ansätzen nicht weitergekommen bin, vermute ich nun, dass ich mehrere dieser Ansätze verbinden muss.


Meine Frage ist nun, ob ich mit einem meiner Lösungssätze in die richtige Richtung gehe oder komplett auf dem Holzweg bin.
 

MaxWe

Sehr aktives Mitglied
6. August 2018
311
42
Hamburg
Moin,

ich hatte vor einiger Zeit mal etwas ähnliches gebaut.. Das würde ich allerdings nicht mehr nutzen, da es aus einer alten Wawi kommt und eine sehr unschöne Lösung war^^
Ich habe gleichzeitig noch geprüft ob die Farbe überhaupt einen Lagerbestand hat und welche Größen verfügbar sind. Das ganze sollte dann so funktionieren, dass man nach einer Farbe filtert, das jeweilige Kind angezeigt wird und beim Hovern über das Kind die verfügbaren Größen angezeigt werden.
Ich habe dazu erstmal eine eigene Smarty Variable auf den Artikelseiten integriert, damit die Lagerbestände gesammelt vorhanden sind. Der nachfolgende Code ist mit Vorsicht zu genießen, bietet vielleicht aber einen Denkanstoß :)

PHP:
<?php
/**
* Hook HOOK_LETZTERINCLUDE_INC
*
* @global JTLSmarty $smarty
* @global Plugin $oPlugin
*/

//NUR AUSFÜHREN WENN DER SEITENTYP EINE ARTIKELLISTE IST
if (gibSeitenTyp() === PAGE_ARTIKELLISTE) {

    //SUCHERGEBNISSE HOLEN
        $Suchergebnisse = $smarty->get_template_vars('Suchergebnisse');
        
/*NEUER PLUGINTEIL - KOMPLETT EIGENE BILDVARIABLEN */   
    //ÜBER ALLE ELEMENTE IN ARTIKEL ITERIEREN
        foreach ($Suchergebnisse->Artikel->elemente as $k => $Artikel) {
    //VATERARTIKEL SETZEN
            $kVaterArtikel = $Suchergebnisse->Artikel->elemente[$k]->kArtikel;
            
    //FARBEN UND GRÖßEN BESTIMMEN UND DEREN LAGERBESTAND IN SMARTYVARIABLEN SPEICHERN.
        //Leere Arrays initialisieren, die mit jedem neuen Artikel wieder geleert werden.
            //Verfügbare Farben des Artikels
            $colours_arr = array();
            //Alle möglichen Größen des Artikels
            $Replaces = array();
            //Verfügbare Größen des Artikels
            $sizes_arr = array();
            
        //FARBEN + DEREN VERFÜGBARKEIT BESTIMMEN
            //Über die Variationen iterieren
            foreach($Suchergebnisse->Artikel->elemente[$k]->Variationen as $c => $colour){
                //Wenn der Arrayplatz in den Variationen den Namen "Farbe" hat, dann weitermachen..
                if(preg_match("/Farbe/", $Suchergebnisse->Artikel->elemente[$k]->Variationen[$c]->cName)){
                    //Über die Werte der Variation "Farbe" iterieren.
                    foreach($Suchergebnisse->Artikel->elemente[$k]->Variationen[$c]->Werte as $w => $Werte){                       
                        //Datenbankaufruf und den Lagerbestand der ausgewählten Größe in einer Smartyvariable speichern.
                        $regexp = '[[:<:]]'.$Suchergebnisse->Artikel->elemente[$k]->Variationen[$c]->Werte[$w]->cName.'[[:>:]]';
                        $fLagerbestand = Shop::DB()->executeQuery("SELECT sum(fLagerbestand) AS 'fLagerbestand' FROM tartikel WHERE kVaterArtikel=".$kVaterArtikel." AND cName REGEXP '".$regexp."' GROUP BY 'fLagerbestand'",1);
                        $Suchergebnisse->Artikel->elemente[$k]->Variationen[$c]->Werte[$w]->fLagerbestand = $fLagerbestand->fLagerbestand;
                        
                        //Das bisher leere Array $colours_arr mit den NOCH VERFÜGBAREN Farben des Artikels füllen.
                        if($fLagerbestand->fLagerbestand>0){
                            $colours_arr[$Suchergebnisse->Artikel->elemente[$k]->Variationen[$c]->Werte[$w]->cName] = $Suchergebnisse->Artikel->elemente[$k]->Variationen[$c]->Werte[$w]->oVariationsKombi->kArtikel;
                        }
                    }
                }
            }
            
        //GRÖßEN + DEREN VERFÜGBARKEIT BESTIMMEN
            foreach($Suchergebnisse->Artikel->elemente[$k]->Variationen as $s => $Sizes){
                //Wenn der Arrayplatz in den Variationen den Namen "Größe" hat, dann weitermachen..
                if(preg_match("/Gr..e/", $Suchergebnisse->Artikel->elemente[$k]->Variationen[$s]->cName)){
                    //Über die Werte der Variation "Größe" iterieren.
                    foreach($Suchergebnisse->Artikel->elemente[$k]->Variationen[$s]->Werte as $w => $Werte){
                        //Das bisher leere Array $Replaces mit den möglichen Größen des Artikels füllen, zusätzlich direkt die Regexp anfügen.
                        $Replaces[] = '/\b'.$Suchergebnisse->Artikel->elemente[$k]->Variationen[$s]->Werte[$w]->cName.'\b/';
                        
                        //Datenbankaufruf und den Lagerbestand der ausgewählten Größe in einer Smartyvariable speichern.
                        $regexp = '[[:<:]]'.$Suchergebnisse->Artikel->elemente[$k]->Variationen[$s]->Werte[$w]->cName.'$';
                        $gLagerbestand = Shop::DB()->executeQuery("SELECT sum(fLagerbestand) AS 'gLagerbestand' FROM tartikel WHERE kVaterArtikel=".$kVaterArtikel." AND cName REGEXP '".$regexp."' GROUP BY 'fLagerbestand'",1);
                        $Suchergebnisse->Artikel->elemente[$k]->Variationen[$s]->Werte[$w]->gLagerbestand = $gLagerbestand->gLagerbestand;
                        
                        //Das bisher leere Array $sizes_arr mit den NOCH VERFÜGBAREN Größen des Artikels füllen.
                        if($gLagerbestand>0){
                            $sizes_arr[] = $Suchergebnisse->Artikel->elemente[$k]->Variationen[$s]->Werte[$w]->cName;
                        }
                    }
                }
            }           
            
        //EIGENES SMARTYARRAY: VERFÜGBARE FARBEN+ZUGEHÖRIGE VERFÜGBARE GRÖßEN MIT BILDPFADEN. $Artikel->oVerfVariationen->Farbe->Bildpfade+cSeo+Größen->Werte
        //Bildpfad = /media/image/product/kArtikel/xs,sm,md,lg/cSeo.jpg
        //Dictionary zum speichern der Angaben anlegen
            $oVerfVariationen = array();
            foreach($colours_arr as $av_colour=>$Artikelnr){
                //Artikelnummer einer Farb/Größen Kombi des Artikels.
                $kArtikel = $Artikelnr;
                //Den cSeo Namen der Farb/Größen Kombi.
                $cSeo = Shop::DB()->executeQuery("SELECT cSeo FROM tartikel WHERE kArtikel=".$kArtikel,1);
                $cSeo = $cSeo->cSeo;
                //Bildpfade aus der Artikelnummer und dem cSeo erstellen.
                $cBildMini = "media/image/product/".$kArtikel."/xs/".$cSeo.".jpg";
                $cBildKlein = "media/image/product/".$kArtikel."/sm/".$cSeo.".jpg";
                $cBildNormal = "media/image/product/".$kArtikel."/md/".$cSeo.".jpg";
                $cBildGross = "media/image/product/".$kArtikel."/lg/".$cSeo.".jpg";
                
                //Verfügbare Größen dieser Farbe ermitteln.
                $colSizes = array();
                foreach($sizes_arr as $av_size){
                    //Datenbankaufruf, der ermittelt welche Größe noch mit dieser Farbe verfügbar ist.
                    $regexp = '[[:<:]]'.$av_colour.' '.$av_size.'[[:>:]]';
                    $cache = Shop::DB()->executeQuery("SELECT sum(fLagerbestand) AS 'fgLagerbestand' FROM tartikel WHERE kVaterArtikel=".$kVaterArtikel." AND cName REGEXP '".$regexp."' GROUP BY 'fLagerbestand'",1);
                    if($cache->fgLagerbestand > 0){
                        $colSizes[] = $av_size;
                    }
                }
                
                //Dictionary mit dem gewünschten Inhalt erstellen.
                $cacheDic = array("cName"=>$av_colour,"kArtikel"=>$kArtikel, "cSeo"=>$cSeo, "cBildMini"=>$cBildMini,"cBildKlein"=>$cBildKlein,"cBildNormal"=>$cBildNormal,"cBildGross"=>$cBildGross,"aSizes"=>$colSizes);   
                $oVerfVariationen[] = $cacheDic;
            }
            //Dictionary in Smarty einhängen
            $Suchergebnisse->Artikel->elemente[$k]->oVerfVariationen = $oVerfVariationen;
            
            
/* ENDE NEUER PLUGINTEIL */           
            
        }   

}
?>

Man müsste nun zum Beispiel noch die productlist\item_box.tpl via Plugin anpassen (Sollte Hook 140 sein?) und die Variablen sinnvoll Elementen zuweisen / andere ggf. Ersetzen. Gleichzeitig im Plugin noch ein Javascript einbinden, welches dann den Bildwechsel / Hovereffekt bedient.
Wie gesagt, ist schon länger her und ich war zu der Zeit ein noch blutiger Anfänger.. Daher bitte nicht 1:1 übernehmen, sondern eher als Idee ansehen :)

Grüße
 
  • Gefällt mir
Reaktionen: Cimtana

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
519
Halle
Hallo,
ich beschäftige mich seit kurzem mit der Entwicklung von Plugins, bin also noch recht unerfahren, habe jedoch schon Erfahrungen im Programmieren gesammelt. Ich habe nun die Aufgabe ein Plugin für JTL-Shop 4 zu entwickeln, welches den Vaterartikel ausblendet und stattdessen alle Kindartikel anzeigt.
Ich will dir nicht den Mut nehmen, aber die Aufgabe die du da für dein erstes Plugin hast, ist alles andere als trivial. ;)
Von den von dir gen. Hooks ist aus meiner Sicht eigentlich nur HOOK_FILTER_INC_GIBARTIKELKEYS geeignet.
Hier könnte man in der Liste alle Vaterartikel entfernen und dafür die jeweiligen Kinder einfügen. Allerdings bringt man damit die komplette Navigation durcheinander, da dann aus 20 anzuzeigenden Artikeln mal schnell ein paar hundert werden. Wenn dann zur nächsten Seite navigiert wird, was ist dann der erste Artikel auf dieser Seite?

Grundsätzlich besser geeignet wäre es hier über HOOK_FILTER_INC_GIBARTIKELKEYS_SQL direkt das zugrundeliegende SQL zu manipulieren und dort statt der Vater- die Kindartikel zu selektieren. Bei vielen und großen Varkombis wird das jedoch sehr schnell ein Perfomanceproblem.
 
  • Gefällt mir
Reaktionen: Cimtana

Cimtana

Aktives Mitglied
28. August 2019
2
0
Grundsätzlich besser geeignet wäre es hier über HOOK_FILTER_INC_GIBARTIKELKEYS_SQL direkt das zugrundeliegende SQL zu manipulieren und dort statt der Vater- die Kindartikel zu selektieren. Bei vielen und großen Varkombis wird das jedoch sehr schnell ein Perfomanceproblem.
Hallo,
danke erstmal für den Tipp. HOOK_FILTER_INC_GIBARTIKELKEYS_SQL hat mir sehr geholfen, weswegen ich jetzt auch schon ein gutes Stück weiter bin. Leider sind 3 weitere Probleme aufgetaucht

1. In der Box Preisspanne wird weiterhin nur der Vaterartikel anstatt der Kindartikel angezeigt und leider komme ich mit Hooks nicht an die entsprechende Funktion, um das Sql dort entsprechend zu verändern.
2. Das Navigationsblättern auf der Artikelseite (Also zum vorherigen oder nächsten Artikel gehen) zeigt, wenn man eins der Kindartikel geöffnet hat, nach rechts immer den ersten Kindartikel und nach links immer einen Artikel, der in der Datenbank vor den Kindartikeln auftaucht egal welche Reihenfolge die Artikel in der Liste haben.
3. 'In den Warenkorb' beim Kindartikel klicken führt zu einem Fehler. Hier weiß ich jetzt schon, dass dem Kindartikel Daten fehlen (kEigenschaft und kEigenschaftWert). Ich habe auch schon eine 'dreckige' Lösung gefunden, indem ich versteckt variation.tpl einfüge (zur info: Ich nutze bereits eine Veränderte version der index.tpl des templates productlist um 'In den Warenkorb' auch anzeigen zu lassen, wenn der Hovereffekt nicht aktiv ist.). Mein Problem hier ist, dass ich es nicht schaffe, die beiden Werte ohne variation.tpl hinzuzufügen.

Edit: Das zweite Problem konnte ich lösen, indem ich der Funktion 'gibNaviBlaettern' anstatt kArtikel kVariKindArtikel übergab mithilfe HOOK_ARTIKEL_PAGE.
Edit2: Das dritte Problem wurde jetzt auch gelöst. Das Problem hier war, dass ich die Logik bezüglich kEigenschaft und kEigenschaftWert falsch verstanden habe.
Edit3: Bei genauerem Hinsehen habe ich festgestellt, dass das erste problem nur die Spitze eines relativ großen Eisbergs ist, da innerhalb der filter_inc datei circa ein dutzend mal die Kindartikel durch SQL-Abfragen ausgeschlossen werden und es nur in 2 Fällen durch Hooks veränderbar ist.
 
Zuletzt bearbeitet:
Ähnliche Themen
Titel Forum Antworten Datum
Bestand von Kinderartikeln wird im Vaterartikel zusammenaddiert JTL-Wawi 1.8 1
Neu Varianten vom Vaterartikel berechnen lassen User helfen Usern - Fragen zu JTL-Wawi 3
Neu Aus bestehenden Artikeln einen Vaterartikel erzeugen. JTL-Wawi - Ideen, Lob und Kritik 0
Neu Vaterartikel den günstigsten Preis der Kindervererben mittels Ameise und 0 ausschließen User helfen Usern - Fragen zu JTL-Wawi 0
Infobanner /Infoleiste ausblenden Einrichtung JTL-Shop5 1
Kunden und Artiekl ausblenden JTL-Wawi App 1
Neu Kategorienbaum in einer Unterkategorie über der Filterung ausblenden Allgemeine Fragen zu JTL-Shop 1
Neu Bestimmte Kindartikel ausblenden Allgemeine Fragen zu JTL-Shop 6
Neu Position Versandkosten und Versandkostenname in PositionTable ausblenden - neuen Vorlagen. Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 3
Neu Artikelnummer ausblenden? Gelöste Themen in diesem Bereich 4
Preise per Artikel Funktionsattribut bei einzelnen Artikeln ausblenden Einrichtung JTL-Shop5 0
Neu Konfigurationsgruppen ausblenden Betrieb / Pflege von JTL-Shop 0
Neu Workflow - Stücklisten im Auftrag abfragen und korrekt in einer Mail auflisten User helfen Usern - Fragen zu JTL-Wawi 0
Neu JTL 5, Footerdesign, Boxabstände und Ausrichtung korrigieren Templates für JTL-Shop 3
Neu Firmen- und E-Mail Einstellungen - Text hevorheben (fett) und Anordnung in Vorlage anpassen Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 0
4K Monitor und Skalierung JTL-Wawi 1.8 2
Neu Updatepolitik und Testen von Software - aktuell 5.2.4 Installation / Updates von JTL-Shop 8
Neu Es werden nur jpg Bilder angezeigt und keine webP Gelöste Themen in diesem Bereich 3
Neu Auftragszahlung über Kasse, Auftrag wird nicht als "Verpackt und Versendet" markiert JTL-POS - Fehler und Bugs 1
Neu Kassenschublade und Drucker bei iMin D4 Pro JTL-POS - Fragen zu Hardware 1
Neu eBay zusammenfassen von Aufträgen und Buchhaltung User helfen Usern - Fragen zu JTL-Wawi 0
Neu Selbstabholer und eBay User helfen Usern - Fragen zu JTL-Wawi 6
Workflows: Versandgruppen finden und ansprechen JTL-Wawi 1.8 0
Auswertung POS-Umsätze nach Wochentag und Tageszeit JTL-Wawi 1.7 0
Neu Fehler bei Sprach- und Währungsumstellung Allgemeine Fragen zu JTL-Shop 0
Neu Verkaufspreis Differenz Shop und Wawi JTL-Shop - Fehler und Bugs 4
Neu Mehrere Sprachen aktivieren und verschiede Preise pro Land erstellen Betrieb / Pflege von JTL-Shop 1
Neu Paypal Plugin Version 1.2.0 läuft und 1.4.0. läuft nicht auf derselben Umgebung Plugins für JTL-Shop 0
Neu Was steckt hinter der Zahl von 53 Bildern auf Ebay bei Variationsartikeln (und einer unsinnigen Fehlermeldung der Wawi)? JTL-Wawi - Fehler und Bugs 2
Neu Filtereinstellungen: wenn Sonderpreis bei Vater- oder Kindartikeln, Anzeige von Vater- UND Kindartikeln User helfen Usern - Fragen zu JTL-Wawi 5
Neu Sprachvariablen nicht in korrekter Groß- und Kleinschreibung JTL-Shop - Fehler und Bugs 4
Neu Gewicht auf Rechnung (Artikelgewicht und Zusatzgewicht) Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 1
Neu Neues Plugin: Google Translate / Übersetzer (DSGVO-konform und weitere Features) Plugins für JTL-Shop 2
Neu Workflow Aktion E-Mail senden kann nicht Plain und HTML Email zusammen versenden Arbeitsabläufe in JTL-Wawi 6
Neu JTL Shopify Connector und Billbee frage Shopify-Connector 0
Neu Neues Plugin: Instagram-Feed Portlet (Als Galerie- oder Slideransicht und weitere Features) + 3x kostenlose Lizenzen Plugins für JTL-Shop 4
In Bearbeitung Startschwierigkeiten Scanner und Bon Drucker Allgemeine Fragen zu JTL-POS 3
Neu JTL Worker 2.0 und tinetbestellung Technische Fragen zu den JTL-Connectoren 0
Neu Liste aller Namespaces und dessen Aufgabe Allgemeine Fragen zu JTL-Shop 0
Kundenattribute aus Shop übernehmen und aus Wawi zurück an Shop übermitteln Einrichtung JTL-Shop5 1
Neu Warenkorb Hinweise bei Bestandsänderung und Preisänderung Allgemeine Fragen zu JTL-Shop 2
In Bearbeitung Artikel über csv-Datei bearbeiten und importieren Allgemeine Fragen zu JTL-POS 3
Verbindung zu Kundencenter geht verloren und Lizenz muss erneut abgteglichen werden JTL-Wawi 1.8 16
Landingpage Header und Footer erstellen zwecks Vorbestellung Einrichtung JTL-Shop5 0
Neu klare Warnung vor den Bausteinen und der PDF in Vorlagen User helfen Usern - Fragen zu JTL-Wawi 4
Neu JTL erstellt falsche Rechnungskorrekturen für Amazon.co.uk Aufträge und verweigert den Support Amazon-Anbindung - Fehler und Bugs 5
Neu Und ewig grüsst das Murmeltier. "The EntityManager is closed" Shopware-Connector 0
Alternativpositionen und gültig von bis JTL-Wawi 1.8 0
Debitorennummern für bestehende und neue Kunden anlegen JTL-Wawi 1.8 2
In Diskussion Bondrucker - im Allgemeinen und Speziellen (Metapace T 25) JTL-POS - Fragen zu Hardware 4

Ähnliche Themen