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
315
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
529
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 Seltsamer Fehler bei PayPal-Checkout: "Warenkorb enthielt Vaterartikel..." JTL-Shop - Fehler und Bugs 2
Neu Merkmale Vaterartikel Allgemeine Fragen zu JTL-Shop 0
Seit dem Update meines JTL-Shops auf Version 5.7.1 funktioniert die Verbindung zwischen JTL-Wawi 2.0.4.0 und dem Shop nicht mehr. JTL-Wawi 2.0 2
Neu JTL-WMS und JTL-POS... Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 0
Neu Versandart nach Volumengewicht und Lieferland Allgemeine Fragen zu JTL-Shop 2
Neu SUNMI V3 MIX – Touchscreen und USB-Maus frieren nach einigen Minuten ein JTL-POS - Fehler und Bugs 1
Beantwortet [Shop 5.7.2 / Wawi 2.0.5] GPSR-Daten werden am Artikel nicht angezeigt trotz korrekter Übertragung und installiertem Plugin Allgemeine Fragen zu JTL-Shop 1
Amazon VCS-Lite und Externe Belege JTL-Wawi 1.11 1
Neu PPWR und Versandetikett Business Jungle 5
Neu DSVGO konform 1000 Kunden in WaWi und Shop löschen! User helfen Usern - Fragen zu JTL-Wawi 4
Neu Der wahrscheinlich östlichste JTL Servicepartner: Standortvorteil, faire Preise und vieles mehr Dienstleistung, Jobs und Ähnliches 16
Neu Rechte-Fehler im J10n Modul und Auswirkung auf base.mo.php in div. Plugins (Shop 5.7.1) JTL-Shop - Fehler und Bugs 0
Neu Kundengruppeneinstellungen für Mindestabnahme und Abnahmeintervall löschen User helfen Usern - Fragen zu JTL-Wawi 0
Neu Shop 5.7.1 und Downloadmodul Allgemeine Fragen zu JTL-Shop 1
Neu Plugin: JTL Exportformat Google Shopping gibt <g:google_product_category> unter Shop 5.7.1 und Wawi 2.0.4 nicht aus Plugins für JTL-Shop 1
Neu Widerrufbutton und Handy JTL-Shop - Fehler und Bugs 1
ändern von Servernamen nach Neuinstallation von SQL und Verbindung mit neuem Server in der Wawi JTL-Wawi 2.0 2
Neu Neues Tool - eBay Penner finden, beenden und neu listen Schnittstellen Import / Export 0
Neu Arbeiten mit Lieferanten EKs - Workflows und SQL User helfen Usern - Fragen zu JTL-Wawi 6
Angebliche externe Aufträge "für Rechnungserstellung freigeben" und Rechnungen erstellen. Gibt es dazu eine akzeptable Erklärung von JTL? JTL-Wawi 1.11 1
Fehlermeldungen bei Einrichtung DHL 4.0 "Objektverweis" und "Konfiguration Versandart" JTL-Wawi 1.11 2
Fehler nach Update auf Version 1.11.11 und 2.0.4 JTL-Wawi 2.0 7
Neu Es werden keine Marken ausgedruckt und die Portokasse lässt keine Anmeldung zu. Smalltalk 5
Neu Newsletter Problem und Fragen Allgemeine Fragen zu JTL-Shop 2
Neu MS Server und MS SQL Installation von JTL-Wawi 5
Neu Seller2Go – Mobile App & JTL-Plugin für Bestellungen, Support und Produktmanagement Plugins für JTL-Shop 0
Keine Datenübertragung trotz bestehender Verbindung und funktionierendem Server JTL-Wawi 2.0 35
Neu buersten.de stellt sich vor (und lädt euch ein!) Shops stellen sich vor 4
Neu Bestellabgleich Shopify - JTL | Point of Sales und Online Stores Shopify-Connector 2
Dashboard lädt nicht und Umsatzanzeige rechnet falsch seit Update auf 1.11.8 JTL-Wawi 1.11 8
Neu Falsch erzeugte Ausgangszahlung bei Teilzahlungen und Retoure (Kauf auf Rechnung) Arbeitsabläufe in JTL-Wawi 0
Neu Kritisches Problem bei DHL 4.0: Handelsstücklisten brechen EU- und Exportversand JTL-ShippingLabels - Fehler und Bugs 25
Neu Besucher und Kampagnen Statistik Konfiguration Betrieb / Pflege von JTL-Shop 0
Bestellabgleich mit JTL Wawi und WooCommerce 1h verzögert JTL-Wawi 2.0 0
JTL-Worker 2.0 - Einrichtung als Dienst - Auffälligkeiten und Problemlösungen für manche JTL-Wawi 2.0 3
Neu Summenanzeige in Zahlungen (F7) und Beschaffung (F3) JTL-Wawi - Ideen, Lob und Kritik 0
Neu jtl POS und wawi 1.11.9 Bestände User helfen Usern - Fragen zu JTL-Wawi 3
Neu Custom Checkout - Conversion optimiert mit Speicherung von Standard-Versandart und Zahlungsart am Kunden JTL-Shop - Ideen, Lob und Kritik 1
In Diskussion Workflow mit UND / ODER - Bedingung erstellen JTL-Workflows - Ideen, Lob und Kritik 7
Ameise-Export: Umsatzsteuer stimmt nicht mit Differenz aus Netto und Brutto überein (insbesondere bei mehreren Steuersätzen) JTL-Wawi 1.11 0
Neu Amazon DIVID- und Lucid-Nummer User helfen Usern 0
Neu Bestände in-house und beim Lieferanten + Proforma-Rechnungen, wie? Arbeitsabläufe in JTL-Wawi 3
Neu Vater und Kinderartikel User helfen Usern - Fragen zu JTL-Wawi 11
Neu product_visibility bei JTL-Wawi und Shopware 6 Shopware-Connector 1
Probleme mit Worker und JTL-App JTL-Wawi 2.0 5
Neu Shopware 5 connector und WawI 1.11.06 bis 1.11.8 Shopware-Connector 1
Bilder unter Versand- und Zahlungsart unterschiedlich groß Einrichtung JTL-Shop5 0
Neu Widerrufsbutton: Jeder, der den Button betätigt, kann das Widerrufsformular ausfüllen und absenden - auch ohne Bestellung? Allgemeine Fragen zu JTL-Shop 94
Neu Problem mit Dantezeile und fehlerhafte Angebotsgültigkeit. Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 2
Neu JTL Pro Edition – Lizenzumstellungen und Abrechnungsfragen Smalltalk 42

Ähnliche Themen