Basic Suche in Azure

Hallo,

ich möchte gerne die Suche aus dem Basic Theme in das Azure Theme einbauen. Das Feature “Hersteller” bzw. “Kategorie” vor der Suche auszuwählen finde ich prinzipiell ganz gut.
Nur möchte ich gerne das Dropdownmenü mit den Kategorie nur mit den Hauptkategorien befüllen. Gesucht werden soll aber dann aber in allen Unterkategorien der gewählten Hauptkategorie.
Ich bekomme es ohne Probleme hin, dass nur die Hauptkategorien angezeigt werden. Allerdings wird dann auch nur in der gewählten Kategorie gesucht. Ich weiß nicht, wie ich es hinbekomme, dass die Suche sich auf die dazugehörigen Unterkategorien automatisch erweitert.

Oder, das wäre quasi die Goldrandlösung, beim Hovern auf einer Hauptkategorie im Dropdownmenü öffnet sich ein weiteres Dropdown mit den dazugehörigen Unterkategorien. Da hab ich aber auch keine Ahnung, wie ich das Umsetzen soll.

Hat jemand vielleicht eine Idee oder eventuell sogar schon Code, mit dem er mir weiterhelfen kann?

Vielen Dank schon mal.

Grüße,
Thore

Hat keiner eine Idee?

So, ich habe es mittlerweile selber gelöst.
Zu sehen ist das Ergebnis in meinem Shop…

Grüße,
Thore

Wie hast du denn das Problem mit der Suche in Hauptkategorien gelöst die keine Produkte haben?

Hallo,

ich habe zunächst die Tabelle ‘oxobject2category’ um eine Spalte ‘oxrootid’ erweitert.
Dan habe ich dieser Spalte mittels unten stehenden Befehl die oxrootid aus der Tabelle 'oxcategories’der jeweiligen oxcatnid zugewiesen.

UPDATE oxobject2category SET OXROOTID = ( SELECT OXROOTID
FROM oxcategories
WHERE oxobject2category.OXCATNID = oxcategories.OXID )

Dann habe ich in der core/oxsearch.php ab Zeile 203 die SQL-Abfrage verändert:

        if ( $sInitialSearchCat ) {
            $sCatView = getViewName( 'oxcategories', $this->_iLanguage );
            $sInitialSearchCatQuoted = $oDb->quote( $sInitialSearchCat );
            $sSelectCat  = "select oxid from {$sCatView} where oxid = $sInitialSearchCatQuoted and (oxpricefrom != '0' or oxpriceto != 0)";
            if ( $oDb->getOne($sSelectCat) ) {
                $sSelect = "select {$sSelectFields} from {$sArticleTable} $sDescJoin " .
                           "where {$sArticleTable}.oxid in ( select {$sArticleTable}.oxid as id from {$sArticleTable}, {$sO2CView} as oxobject2category, {$sCatView} as oxcategories " .
                           "where (oxobject2category.oxrootid=$sInitialSearchCatQuoted and oxobject2category.oxobjectid={$sArticleTable}.oxid) or (oxcategories.oxid=$sInitialSearchCatQuoted and {$sArticleTable}.oxprice >= oxcategories.oxpricefrom and
                            {$sArticleTable}.oxprice <= oxcategories.oxpriceto )) and ";
            } else {
                $sSelect = "select {$sSelectFields} from {$sO2CView} as
                            oxobject2category, {$sArticleTable} {$sDescJoin} where oxobject2category.oxrootid=$sInitialSearchCatQuoted and
                            oxobject2category.oxobjectid={$sArticleTable}.oxid and ";
            }
        }

Dann habe ich in das /out/azure/tpl/widget/header/search.tpl den Code aus dem basic-Theme eingefügt.
Es muss dann noch ein Ordner /out/azure/inc erstellt werden, in den die Datei category_options.tpl aus dem basic-Theme hinein kopiert wird.
In diesem tpl muss dann noch folgende Zeile

[{fun name="category_options" list=$ocat->getSubCats() sSpacer="-$sSpacer "}]

auskommentiert oder gelöscht werden.

Es war noch ein bißchen CSS-Anpassung notwendig, um die drei Boxen im Header unterzubringen. Aber die kann man im Grunde ja einfügen, wo man möchte.

Das war es schon.

Die einzige Schwierigkeit bleibt zur Zeit noch, dass natürlich bei jeder neuen Zuweisung eines Artikels zu einer Kategorie der oben genannte SQL-Befehl einmal durchgeführt werden muss.
Da man dass aber auch bequem über das Backend erledigen kann, geht es noch einigermassen. Schöner wäre natürlich, den ganzen Import-Prozess ‘oxobject2category’ zu erweitern.

Grüße,
Thore

Danke für die gute Erklärung, das sieht leider genauso umständlich aus wie ich mir das vorgestellt habe.

Wenn man nur in den Templates arbeiten kann/darf, kann man alternativ dazu auch ein disabled Attribut in den Option Tag des Kategorieauswahlfeldes einbauen. Das verhindert das man Kategorien auswählt die keine Produkte haben.

Noch eine kleine Erklärung zur Vollständigkeit.

Im foreach des Auswahlfeldes mit getNrOfArticles() testen ob die Kategorie Produkte hat und dann noch ein disabled in den Option Tag packen.

<option [{if $ocat->getNrOfArticles() == 0  }] disabled="disabled"[{/if}] ........