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.881
524
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
Neu Kinderartikel im bestehenden Vaterartikel anlegen User helfen Usern - Fragen zu JTL-Wawi 2
Filter und Workflows nicht auf Vaterartikel anwendbar JTL-Workflows - Fehler und Bugs 0
Preisliste - Kindartikel unter Vaterartikel JTL-Wawi 1.9 10
Neu Vaterartikel Lieferzeit "ab x - x Werktage Allgemeine Fragen zu JTL-Shop 0
Neu Google - Vaterartikel und Kinderartikel Smalltalk 4
EK-Preise bzw. Lieferanten ausblenden JTL-Wawi App 1
Versand, Auftrag, Dropshipping Übersicht bereits ausgelieferte ausblenden JTL-Wawi 1.9 0
Neu Einzelne Merkmale ausblenden auf Merkmalseiten Templates für JTL-Shop 5
Kategoriebaum letzten 2 gewählten Kategorien angezeigt lassen / andere ausblenden Einrichtung JTL-Shop5 0
Neu XRechnung/E-Rechnung und verschiedene eMail-Empfänger JTL-Wawi - Ideen, Lob und Kritik 1
Neu "Noch X € und wir versenden kostenfrei" hat einen Fehler Betrieb / Pflege von JTL-Shop 0
Preiskalkulation auf Grundlage von Lieferantenpreise und Lieferantenbestand JTL-Wawi 1.8 1
Neu Wasserzeichen auf Lieferschein und Rechnung auf ganze A4 Seite User helfen Usern - Fragen zu JTL-Wawi 5
Neu Connector Verhalten mit Tracking Nummern und Versandbestätigungen Shopify-Connector 0
otto.de Anbindung und Einrichtung in JTL Wawi JTL-Wawi 1.9 0
dbo.tFile und tZahlungsabgleichLogeintrag - kann man hier gefahrlos Datensätze löschen? JTL-Wawi 1.9 5
Anlage neuer Artikelstamm und Erstinventur Lager JTL-Wawi 1.9 1
Neu Breadcrumb Navigation bei Kategorie-, Hersteller- und Merkmallisten verschieden JTL-Shop - Fehler und Bugs 0
Artikelstatistik richtig einstellen und verstehen JTL-Wawi 1.9 2
Aktuelle Störung der SCX-Schnittstelle und weiterer JTL-Systeme Störungsmeldungen 1
Neu Fehlermeldungen und kaputte Designvorlage eBay-Anbindung - Fehler und Bugs 0
Seite Artikel->Sonderpreise und Sonderpreiskationen definieren JTL-Wawi 1.9 0
Neu SQL Server kein Mandant auswählbar und Dienst lässt sich nicht starten Installation von JTL-Wawi 2
Schnittstelle für Zalando, Kaufland und Otto JTL-Wawi 1.9 5
Neu Ameise-Vorlage per SQL abrufen und Daten als Ergebnis erhalten JTL Ameise - Eigene Exporte 1
Neu Übersicht Verkauf mit Artikelmenge und durchschnittlichem VK netto Eigene Übersichten in der JTL-Wawi 6
Neu Gehosteter Shop nicht mehr aufrufbar und auch kein admin-Login mehr möglich JTL-Shop - Fehler und Bugs 3
JTL-Vouchers und Shopify Allgemeine Fragen zu JTL-Vouchers 3
Neu Spam Newsletteranmeldungen und Shop Anmeldungen Allgemeine Fragen zu JTL-Shop 3
Neu Shopify Versandkosten und Mindestbestellwert Shopify-Connector 0
Neu 1.2.3.8 startet nicht und stürtzt sofort ab User helfen Usern - Fragen zu JTL-Wawi 11
Neu SQL DB läuft mit Fehler voll und crasht Server JTL-Shop - Fehler und Bugs 1
Neu Workflow und Version für Vorhaben Starten mit JTL: Projektabwicklung & Migration 3
Neu Bestellungen und Kunden werden nicht importiert JTL-Shop - Fehler und Bugs 10
Neu In Filiale umbuchen mit Packungsgröße und dort mit JTL-POS einzeln "verkaufen" User helfen Usern - Fragen zu JTL-Wawi 3
Neu POS GTIN Suche und Wawi ausbuchen JTL-POS - Fehler und Bugs 0
Neu TSE (RKSV) und USB-Reader - Android 14 JTL-POS - Fehler und Bugs 0
Neu Neueste Version Paypal Checkout: Rechnungskauf mit Ratepay und Paypal-Kreditkarte sind nicht verfügbar. Plugins für JTL-Shop 21
Neu 🎉 Neues Plugin: "Versandkosten und Lieferzeit automatisch beziehen - ShipMonk Extension" 🎉 Plugins für JTL-Shop 1
Neu Artikel per Dropshipping versenden und selbst versenden Arbeitsabläufe in JTL-Wawi 1
Neu Anfägerfragen und Installtion auf ngix server Installation / Updates von JTL-Shop 13
Neu 🎉 Neues Plugin: "Versandkosten und Lieferzeit automatisch beziehen - DHL-Express Extension" 🎉 Plugins für JTL-Shop 3
Neu Wichtige Infos zu GPSR-Attributen für JTL-eazyAuction und kommende JTL-Wawi Version 1.9.6.0 Einrichtung und Installation von JTL-eazyAuction 128
Überschriften und Titel in Angeboten JTL-Wawi 1.9 3
Rechnungen an Ebay und Amazon Kunden immer digital zusenden JTL-Wawi 1.9 0
Neu Gibt es keinen Gambio Connector mehr mehr mit PHP8 und höher? Gambio-Connector 4
Neu WooCommerce und JTL Wawi lassen sich nicht verbinden WooCommerce-Connector 3
Neu Übersetzung Shop und einiger Produkte Betrieb / Pflege von JTL-Shop 2
Neu Biete: Bastel- und Schreibwarenartikel aus Ladenauflösung Dienstleistung, Jobs und Ähnliches 0
Neu Exchange Online, OAuth und Send As JTL-Wawi - Ideen, Lob und Kritik 2

Ähnliche Themen