Dringende Hilfe bei interner Suche

Hallo liebe Oxid Fans,

ich brauch mal eure Hilfe,
da mir leider wieder der Lösungsansatz fehlt.
Und mir der Kopf qualmt ^^

Wir haben eine Online Schuhverkauf mit Oxid umgesetzt.
Dort gibt es die Artikel natürlich in verschieden Größen,
das wir über die Artikelvarianten gelöst haben.

Jetzt möchte der Kunde gern, das wenn ich mich in der
Kategorie " z.B. Herren Schuhe" befinde und dort alle Artikel aufgelistet werden,
das der Benutzer die Möglichkeit hat, in der Auflistung durch eine Suche nach
Schuhgrößen ( z.b. selectbox ) das Ergebnis zu optimieren.

Ich hab kein Plan, wie ich z.b. den GET Parameter “searchpara” in die Artikellist
einbringe.

Vielleicht hab Ihr eine Lösung oder Tip für mich.
Ich wäre für sehr dankbar.

mfg, Sebastian :eek:

[QUOTE=DIATOM;14487]
Dort gibt es die Artikel natürlich in verschieden Größen,
das wir über die Artikelvarianten gelöst haben.
[/QUOTE]
Das ist schon gut.:smiley:

Wenn ich das mit den Attributen richtig verstanden habe…

Kannst Du jeder Variante noch ein Attribut ‘Größe’ mit gleichen Wert geben und dann gibst Du der Kategorie auch dieses Attributund hoffst, das die Attributbugs (sind derzeit leider recht viel) nicht den Suchfilter betreffen.

[QUOTE=MBa;14488]Das ist schon gut.:smiley:

Wenn ich das mit den Attributen richtig verstanden habe…

Kannst Du jeder Variante noch ein Attribut ‘Größe’ mit gleichen Wert geben und dann gibst Du der Kategorie auch dieses Attributund hoffst, das die Attributbugs (sind derzeit leider recht viel) nicht den Suchfilter betreffen.[/QUOTE]
Ja, würde ich auch so lösen…

Erstmal danke Leute,
das hat mir schon mal etwas die Augen geöffnet und mir einen guten Ansatz gegeben.

Die Selectbox für die Attribute wird nur dargestellt wenn ein Elternelement z.B.
das Attribute “Schuhgröße” mit dem Wert “36” besitzt.

Da wir aber ein Elternelement mit Kinderelementen ( die die Schuhgrößen sind ) eingerichtet
haben, wird keine Selectbox angezeigt.

Oder kann ich dem Elternelement verschieden Schuhgrößen verpassen.

Ich versuche das gerade bissel Programmiertechnisch zu umgehen,
na mal schauen ^^

[B]UPDATE:[/B]

grüße, Sebastian

Hast recht, geht nicht.
Ich brauche das auch demnächst. :frowning:

Ich glaube, dass liegt daran, dass Varianten nicht in der ´oxobject2category´ stehen.

Schön, dass dies als Bug anerkannt wurde… nur leider in Warteschleife.

Den Workaround finde ich auch nicht so toll:

Other way to solve this - is to insert variants as separate articles and show these articles in details page using Crossselling (also some small changes in templates).

So müsste man IMHO auch die X-Sell Artikel dieser Kategorie zuordnen… Dann ist die Kategorie wieder so voll… und immer das gleiche.
Alle anderen Lösungen, die mir spontan einfallen, habe ich ein wenig bedenken, ob das nicht Probleme gibt, wenn dies doch mal gefixt wird.

Naja, vielleicht spielt die Zeit mal für mich.

Würde mich interessieren, wie Du das löst.

Oder kann ich dem Elternelement verschieden Schuhgrößen verpassen.

Ich habe mal etwas versucht.

…und zwar habe ich nun
[ul]
[li]kaufbare Variatnen, jewails mit einen Attribut der gleichen Gruppe
[/li][li]nichtkaufbare Hauptprodukte
[/li][LIST]
[li]diesen habe ich per SQL alle Attribute der jewailigen Varianten gegeben.
[/li][LIST]
[li]oxabject2attribute
[/li]OXID => muss eindeutig sein (unterscheidet sich)
OXOBJECTID => ID des Masterartikels
OXATTRID => ID des Attributes
OXVALUE => Größe der Varianten (unterscheidet sich)
[/ul]
[li]von dem Datenbankmodell her geht dies, aber halt nicht vom Admin aus.
[/li][/LIST]
[li]Beispiel:
[/li][ul]
[li]Master:
[/li][LIST]
[li]Attribut Größe: 39 und
[/li][li]Attribut Größe: 40 und
[/li][li]…
[/li][/ul]
[li]Variante 39:
[/li][ul]
[li]Größe: 39
[/li][/ul]
[li]Variante 40:
[/li][ul]
[li]Größe: 40
[/li][/ul]
[li]…
[/li][/LIST]
[/LIST]

Es scheint so zu gehen, aber ich würde dies noch intensiv testen, bevor es auf die Kunden losgelassen wird.
… und ich habe nicht getestet, was die ‘ähnlichen Artikel Funktion’ daraus macht.

Vielleicht is ja doch rechtzeitig ein Fix draußen.

@OXID: Feature-Request
Fände ich eh schön, wenn man ein Attribut einen Artikel mehrmals geben kann.
Beispiele:
[ul]
[li]Elektronik: Ein Netzteil kann von 220V umschaltbar auf 110V sein.
[/li][li]Bücher: Ein Buch kann von mehreren Autoren geschrieben worden sein.
[/li][li]Musik: Ein Lied kann mehrere Genres oder Stimmungen haben. Auch hier sind mehrere Künstler nicht selten.
[/li][li]Auto: Ein Ersatzteil kann in mehreren Autos eingebaut werden.
[/li][li]Sonstiges: Ein ‘Etwas’ kann aus mehreren Materialien hergestellt worden sein.
[/li][li]usw.
[/li][/ul]

Huhu,

ich hatte mir auch noch paar Gedanken gemacht und
mich mit dem Marco Steinhäuser unterhalten.

Er meinte das die Programmierer die Zuweisung der Attribute für
Kinderelemente nicht erlaubt haben, weil dies bei z.b. bei Artikeln
mit mehr als 10 Varianten zu echten Performance Problemen führen könnte,
wenn nach diesen gefiltert wird. ( Das soll erst am Version 4.2 möglich sein )

Meine erste Idee war, die Filterung dann wirklich so zu programmieren.
Das alle Kinderelement mit dem Attribut gefunden werden und dann
am Ende für die Filterung die entsprechenden Oxid´s der Elternelemente
ausspuckt werden ( Mal abgesehen von der Performance, da es hier nur
um eine Variante geht. ) ( Und keine Tanzschuhe Marco ^^ )

Meine zweite und wie ich finde vielleicht bessere Idee ist.
Das die Attribute bei der Zuweisung an die Kinderelement auch gleich
dem Elternelement zugewiesen werden. Dann kann man später einfach
nach den Elternelementen filtern und bekomme ein gewünschtes Ergebnis.

Ich werde mich heute mal dran probieren.
Wenn es klappt, gibt es natürlich den Quellcode für euch ^^

mfg, Sebastian

so, ich gesell mich mal zu euch, denn auch bei mir heißt es nun: filtern.

die kunden sollen so filtern können:
anwender: a, b, c
anwendungsgebiet: a, b, c

hierbei können nur die elternelemente gefunden werden, das ist ok.
so ist es ja auch aktuell.

bei anwender funktioniert das ganze, jedoch[B] beim anwendungsgebiet kommt keine dropdown liste[/B].
Ja, ich habe mehrere Artikel die die gleichen Werte in den Attributen tragen. Wie auch beim Anwender geschehen. Beisst sich hier irgendwas? oder kann nur nach einem attribut gesucht werden? Oder ist das sogar ein bug, von dem oben die rede war?? :frowning:

welchen sinn hat es, dass ich nur in den hauptkategorien suchen kann? (woher soll der besucher das wissen?)
Kann das auch in den Unterkategorien angewandt werden?

könnte man auch per checkboxen eine verknüpfung dieser attribut als suche realisieren. beispiel:
anwender a und b sucht anwendungsgebiet c und f.

vielen dank für euer feedback. gruß

[QUOTE=DIATOM;14753]
ich hatte mir auch noch paar Gedanken gemacht und
mich mit dem Marco Steinhäuser unterhalten.

Er meinte das die Programmierer die Zuweisung der Attribute für
Kinderelemente nicht erlaubt haben, weil dies bei z.b. bei Artikeln
mit mehr als 10 Varianten zu echten Performance Problemen führen könnte,
wenn nach diesen gefiltert wird. ( Das soll erst am Version 4.2 möglich sein )
[/QUOTE]

Ich verwende die Version 4.2.
Wenn ich bei den Varianten Attribute zuweise, werden diese noch nicht im “Kategoriefilter” bei den Attributen angezeigt.

Muss man hier noch im Adminbereich etwas freischalten oder gibt es dieses Feature noch nicht ?

[B]UPDATE:[/B]
Verwende nun die Lösung von MBa vom 14.06.2009.

Hallo Leute,

ich habe endlich die Lösung gefunden.
Ist zwar nicht die tollste, aber es funktioniert :slight_smile:

So habe ich jetzt die Möglichkeit geschaffen, das in der Produktauflistung
ein Dropdown angezeigt wird, das die verschiedenen Schuhgrößen der
Produkte auslistet und damit dann die Artikelauflistung gefiltert werden kann.

[B]Zu sehen unter:[/B] http://www.shoes-berlin.de

[B]Folgende Änderung sind dafür nötig:[/B]

[B]1.)[/B]
/out/basic/list.tpl
( unter ‘<div id=“content”>’ )


        [{if $oView->getGenSizeList()}]
        <div>
            <form action="[{ $oViewConf->getSelfLink() }]" method="get">
                <label for="size">Suche nach Verfügbarkeit:</label>
                 
                <select name="size" id="size">
                    <option value="">bitte auswählen ...</option>    
                    [{foreach from=$oView->getGenSizeList() item=sl name=test_sizeList}]
                        <option value="[{$sl}]" [{if $sl==$oView->getParamSize()}]selected="selected"[{/if}]>Größe [{$sl}]</option>
                    [{/foreach}]
                </select>
                 
                <input type="hidden" name="cl" value="[{ $oViewConf->getActiveClassName() }]" />
                <input type="hidden" name="cnid" value="[{ $oView->getParamCnid() }]" />
                <input type="submit" value="Suchen" />
            </form>
        </div> 
        [{/if}]

[B]2.)[/B]
/view/alist.php
( ganz unter unter “function getActiveCategory()” )


    function getGenSizeList() {
    
        $sArticleTable = getViewName( 'oxarticles' );
    
        $list       = array();
        $cnid       = $this->getParamCnid();
        $sO2CView   = getViewName( 'oxobject2category' );
        $sSearch    = array("ist lieferbar", "st lieferbar", "ist verfügbar", "die Größe", "Größe", "die");
        $sReplace   = array("","","","","","");
        
        $sSql   = "SELECT 
                        oxart.oxvarselect as oxvarselect
                    FROM $sO2CView as oc     
                    LEFT JOIN $sArticleTable as art ON ( art.oxid = oc.oxobjectid )
                    LEFT JOIN $sArticleTable as oxart ON ( oxart.oxparentid = art.oxid  )
                    WHERE 
                        oc.oxcatnid = '". $cnid ."' and
                        art.oxparentid = '' and
                        oxart.oxparentid != '' and 
                        oxart.oxvarselect != '' and 
                        oxart.oxactive = 1 and 
                        oxart.oxstock > 0
                    GROUP by oxart.oxid
                    ORDER by oxart.oxvarselect ASC 
                    ";
                    //echo $sSql;
        $rs = oxDb::getDb(true)->execute( $sSql);
        if( $rs != false && $rs->recordCount() > 0 ) {
            while (!$rs->EOF) {
                $nr = trim(str_replace($sSearch, $sReplace, $rs->fields['oxvarselect']));
                if( !in_array($nr, $list) ) {
                    $list[] = $nr;
                }
                $rs->moveNext();
            }
        }
        asort($list);
        return $list;
    }
    
    function getParamCnid() {

        if ( ( $sVar = oxConfig::getParameter( 'cnid' ) ) ) {
            return rawurlencode( rawurldecode( $sVar ) );
        }
    }
    
    function getParamSize() {

        if ( ( $sVar = oxConfig::getParameter( 'size' ) ) ) {
            return str_replace("%2C", ",", rawurlencode( rawurldecode( $sVar ) ));
        }
    }

[B]3.)[/B]
/core/oxarticlelist.php
( in der “function _getCategorySelect(” )
( unter “filtering ?” )


// ----------------------------------
        // variante ?
        $sArtVariante = '';
        $getArtVartiantFilter = $this->_getArtVariantFilter();
        if( !empty($getArtVartiantFilter) ) {
            $sArtVariante .= " and artvar.oxvarselect LIKE '%". $getArtVartiantFilter ."%'";
            $sArtVariante .= " and artvar.oxactive = 1";
            $sArtVariante .= " and artvar.oxstock > 0";
        }
        /*
        $sSelect = "SELECT $sFields FROM $sO2CView as oc left join $sArticleTable
                    ON $sArticleTable.oxid = oc.oxobjectid
                    WHERE ".$this->getBaseObject()->getSqlActiveSnippet()." and $sArticleTable.oxparentid = ''
                    and oc.oxcatnid = '$sCatId' $sFilterSql GROUP BY oc.oxcatnid, oc.oxobjectid ORDER BY $sSorting oc.oxpos, oc.oxobjectid ";
        */
        $stringSearch   = $sArticleTable.".";
        $stringReplace  = "oxart.";
        $extraSQL       = str_replace($stringSearch, $stringReplace, $this->getBaseObject()->getSqlActiveSnippet() );
        $sFields        = str_replace($stringSearch, $stringReplace, $sFields);
        $sFilterSql     = str_replace($stringSearch, $stringReplace, $sFilterSql);
        $sSorting       = str_replace($stringSearch, $stringReplace, $sSorting);
        $sSelect = "SELECT 
                        $sFields 
                    FROM $sO2CView as oc 
                    left join $sArticleTable as oxart ON ( oxart.oxid = oc.oxobjectid )
                    left join oxarticles as artvar ON ( artvar.oxparentid = oc.oxobjectid  )
                    WHERE 
                        ". $extraSQL ." and
                        oxart.oxparentid = '' and 
                        oc.oxcatnid = '". $sCatId ."' 
                        $sFilterSql 
                        $sArtVariante
                    GROUP BY oc.oxcatnid, oc.oxobjectid 
                    ORDER BY $sSorting oc.oxpos, oc.oxobjectid ";

[B]4.) ( NUR BEI ÄLTEREN OXID VERSIONEN NÖTIG )[/B]
/core/axarticle.php
( in der “function getSqlActiveSnippet(” )
( unter “// enabled time range check ?” )


//do not check for variants
        /*
        if ( $myConfig->getConfigParam( 'blUseStock' ) ) {
            $sQ = " $sQ and ( $sTable.oxstockflag != 2 or ( $sTable.oxstock + $sTable.oxvarstock ) > 0  ) ";
            //V #M513: When Parent article is not purchaseble, it's visibility should be displayed in shop only if any of Variants is available.
            if ( !$myConfig->getConfigParam( 'blVariantParentBuyable' ) ) {
                $sQ = " $sQ and ( $sTable.oxvarcount=0 or ( select count(art.oxid) from $sTable as art where art.oxstockflag=2 and art.oxparentid=$sTable.oxid and art.oxstock=0 ) < $sTable.oxvarcount ) ";
            }
        }
        */
        
        if ( $myConfig->getConfigParam( 'blUseStock' ) ) {
            $sQ = " $sQ and ( $sTable.oxstockflag != 2 or ( $sTable.oxstock + $sTable.oxvarstock ) > 0  ) ";
            //V #M513: When Parent article is not purchaseble, it's visibility should be displayed in shop only if any of Variants is available.
            if ( !$myConfig->getConfigParam( 'blVariantParentBuyable' ) ) {
                $sTimeCheckQ = '';
                if ( $myConfig->getConfigParam( 'blUseTimeCheck' ) ) {
                     $sDate = date( 'Y-m-d H:i:s', oxUtilsDate::getInstance()->getTime() );
                     $sTimeCheckQ = " or ( art.oxactivefrom < '$sDate' and art.oxactiveto > '$sDate' )";
                }
                $sQ = " $sQ and IF( $sTable.oxvarcount = 0, 1, ( select 1 from $sTable as art where art.oxparentid=$sTable.oxid and ( art.oxactive = 1 $sTimeCheckQ ) and ( art.oxstockflag != 2 or art.oxstock > 0 ) limit 1 ) ) ";
            }
        }

mfg & have fun,
Sebastian

[QUOTE=DIATOM;14753]
Er meinte das die Programmierer die Zuweisung der Attribute für
Kinderelemente nicht erlaubt haben, weil dies bei z.b. bei Artikeln
mit mehr als 10 Varianten zu echten Performance Problemen führen könnte,
wenn nach diesen gefiltert wird. ( Das soll erst am Version 4.2 möglich sein )
[/QUOTE]

Performance-Optimierung ist aus meiner Sicht auch ein Thema, an das die Crew verstärkt rangesetzt werden sollte.

Die obige Aussage impliziert, dass die zuständigen Entwickler mal SQL-Nachilfe nehmen sollten (sorry, bin sonst sehr zufrieden mit Oxid). Aber SQL-Datenbanken sind dafür gebaut, aus Millionen von Datensätzen unter der Voraussetzung richtiger Indexierung innert Millisekunden das Dataset zurückzugeben.

Optimistische Grüße,
Achim

Hi,

das hat er gesagt, ja? Interessant… :slight_smile:

Performance-Optimierung ist ein Dauerthema, an dem wir ständig dran sind wie die Terrier: Man wird schliesslich daran gemessen. Es gibt immer wieder vor Releases recht umfangreiche Performance-Tests auf dem Fat-Boy und Performance-Audits durch Andere. Übrigens sollte sich seit der Version, die DIATOM einsetzt und der aktuellen Version auch etwas getan haben. Siehe Release Notes auf der OXIDforge.

Achim, wenn Du dazu gute Ideen oder Tipps hast, würde ich mich freuen, wenn Du Dich auch auf der Mailing-List engagierst.

Gruß

Hallo Leute,

ich find es ja toll das Ihr euch über das Performance Thema gedanken machen,
aber ich finde das meine Lösung für das eigentliche Thema des Threads hier zu kurz kommt. :rolleyes:

Für alle die es vielleicht interessiert.
Ich habe es geschafft eine Produktlisten Filterung für Artikel Attribute zu ermöglichen.

Wie in meinen angegebenen Beispiel, kann man die Produktauflistung nach Schuhgrößen Filtern. :wink:

grüße,
Sebastian

Hallo Diatom,

ich benötige zur Zeit auch eine Filtermöglichkeit auf verschiedenen Artikelvarianten.
Ich habe beim Durchsuchen des Forums diesen Thread hier entdeckt und deine Lösung scheint wohl auch zu funktionieren. Nun wollte ich diese implementieren aber es fehlt wohl noch die funktion _getArtVariantFilter(), auf die in _getCategorySelect(…) zugegriffen wird.
Könntest du diese Funktion auch noch posten?

Vielen Dank schomal!

Edit: Habe grad gesehen, dass die Funktion eigentlich nur den gesetzten Filter abholt. Das bekomme ich bestimmt noch hin :slight_smile: