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
313
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.881
526
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
Vererben von Kindartikel ek auf den Vaterartikel JTL-Wawi 1.10 1
Stücklisten Auswertung - Bedarfsermittlung vom Vaterartikel JTL-Wawi 1.10 0
Neu Abfrage Kinderartikel aktiv für Verkaufskanal, aber Vaterartikel inaktiv Eigene Übersichten in der JTL-Wawi 4
Neu JTL Shop: Ausblenden von Unterkategorien (In der Mitte) möglich ? Allgemeine Fragen zu JTL-Shop 0
Neu am Packtisch Versandarten ausblenden Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 1
Neu Eingangsrechnungen für Benutzergruppen ausblenden User helfen Usern - Fragen zu JTL-Wawi 0
Neu Header nicht ausblenden Templates für JTL-Shop 1
Neu Kredit- und Debitkarte, wo finde ich diese Zahlungen ? Allgemeine Fragen zu JTL-Shop 2
Neu Amazon vergibt Rabatte an Kunde und Kunde fehlt der Beleg bzw. Rechnung zu hoch Amazon-Anbindung - Fehler und Bugs 0
Neu Lieferzeiten für Dropshipping und eigene Artikel richtig in Shopware 6 bzw. Wawi anzeigen Schnittstellen Import / Export 1
Neu Buchungsgründe für Bareinnahmen und -ausgaben auf Tagesabschluss ausweisen JTL-POS - Ideen, Lob und Kritik 0
Neu Hilfe für Amazon und Lister 2.0 gesucht Amazon-Anbindung - Ideen, Lob und Kritik 0
Neu Teilrechnung und Versandkosten JTL-Wawi - Fehler und Bugs 2
Neu Shop-Admin: Versandarten und Zahlungsarten nicht aufrufbar Allgemeine Fragen zu JTL-Shop 11
Neu JTL-Shop Lieferanten Artikelnummer und Suchbegiffe für Onlineshop werden im Shop nicht gefunden Allgemeine Fragen zu JTL-Shop 5
Neu Datenbankabfrage - Suchen und Ersetzen User helfen Usern - Fragen zu JTL-Wawi 4
Neu Behandlung von JTL Shop Coupons und Retouren in JTL Wawi Arbeitsabläufe in JTL-Wawi 0
In Diskussion Verkaufe gebrauchtes POS Set Terminal, Bondrucker und Kassenschublade JTL-POS - Fragen zu Hardware 0
Neu Händlerbund Plugin: "Zahlung und Versand" wird nicht automatisch übernommen Plugins für JTL-Shop 2
Neu Bestand und Preisanbgleich Lister 1.0 nach 31.07.25 noch möglich Amazon-Lister - Ideen, Lob und Kritik 1
Neu 1.10.12.0 Beta Oberfläche ladet keine Daten und wir unbenutzbar JTL-Wawi - Fehler und Bugs 1
Neu Export Auftragspositionen mit Positionswerten und diversen Kundendaten JTL-Wawi 1.7 2
Artikelbestände im POS sehen und exportieren Allgemeine Fragen zu JTL-POS 0
Neu Ausschalten des Menü Servicedesk und des Buttons in der WaWi User helfen Usern - Fragen zu JTL-Wawi 1
JTL Retoure Umtausch anlegen und Rest erstatten JTL-Wawi 1.9 1
Neu JTL Debug 2.0.4 und Shop 5.5.2 - Fehler 500 Plugins für JTL-Shop 3
Neu URL und Hosting in Heimnetzwerk nicht erreichbar JTL-Shop - Fehler und Bugs 19
SCX -> ausländische Marktplätze zB Kaufland, Conrad - wie kann ich Titel und Beschreibung auf italienisch übergeben (oder generell Sprache wechseln) kaufland.de - Anbindung (SCX) 0
JTL WaWi 2 Mandanten - B2B und B2C Artikel und Bestände automatisch abgleichen JTL-Wawi 1.6 3
Neu JTL WaWi und anderes POS User helfen Usern - Fragen zu JTL-Wawi 1
Neu Getrennte Auswertung von Pick- und Packleistung möglich? JTL-WMS / JTL-Packtisch+ - Ideen, Lob und Kritik 1
Beschaffung/Bestellungen Steuerung von Mwst % in Positionen ohne Lieferantenzuordnung und Freipositionen. JTL-Wawi 1.10 0
Neu Nach Update auf 5.5.2: Extrem lange Ladezeiten im Front- und Backend Installation / Updates von JTL-Shop 11
Neu JTL‑Wawi: Beim Drucken fehlen Body‑Inhalte – nur Header und Footer gedruckt Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 1
Neu Packtisch+: Scannen und manuelle Auswahl von MHD-Artikeln JTL-WMS / JTL-Packtisch+ - Fehler und Bugs 0
In Diskussion JTL WAWI + FFN + OrangeConnex Workflow für Versand und Lagerbestand JTL-Workflows - Ideen, Lob und Kritik 0
Neu Gleiche Designvorlage für eBay und JTL-Shop mit globalen Textbausteinen nutzen Allgemeine Fragen zu JTL-Shop 0
Neu Feedback, Anregungen und Meinungen benötigt zu unserem JTL Tool zwecks Lieferanten- und Artikelmanagement Dienstleistung, Jobs und Ähnliches 2
Gelöst Läuft Swisbit TSE mit Android 14 und Epson TM30 Drucker? JTL-POS - Fragen zu Hardware 1
Varianten und der Amazon Lister 2.0 Amazon-Lister - Fehler und Bugs 0
Neu Attributs- und Merkmalsuche Tool Allgemeine Fragen zu JTL-Shop 0
Neu Tipps für erfolgreiche ERP-Schulungen und Änderungsmanagement Smalltalk 0
Neu §12 Abs. 3 UStG für Solar- und Photovoltaikanlagen User helfen Usern - Fragen zu JTL-Wawi 8
Shopware 5 Connector und WaWi 1.9.7.1 / 1.9.8.0 JTL-Wawi 1.9 12
Neu Offizielle Vorstellung des CSS Formular- und Retouren-Manager Plugins für JTL-Shop 0
In Diskussion Workflow auf Zahlungseingang und Zahlungsweise JTL-Workflows - Ideen, Lob und Kritik 1
Neu Testshop und Liveshop gleicher Stand/gleiche Plugins Allgemeine Fragen zu JTL-Shop 1
Neu Fehler bei Anbindung JTL Wawi und JTL Shop 5 JTL-Shop - Fehler und Bugs 1
Neu JTL-Connector (Drittanbieter) Auftragsnummer und Ext. Belegnummer setzen Onlineshop-Anbindung 0
Neu Windows 11 und die Farbverwaltung User helfen Usern 3

Ähnliche Themen