Kategorie Artikel aus Unterkategorien

Hallo Leute,

ich hab mal wieder ein kleines Anliegen wo Ihr mir vielleicht weiterhelfen könnt.

So haben wir einen Kunden der die neuste Oxid Version verwendet.
Dieser hat vielen Kategorien mit Unterkategorien.

Er möchte die Artikel den Unterkategorien zuweisen und das die Hauptkategorien
alle Produkte aus den Untekategorien anzeigen, ohne diese dort nochmal zuzuweisen.

Wäre echt super wenn Ihr mir Tips oder Vorschläge liefern könntet.

mfg, Sebastian :rolleyes:

Glaube nicht, dass dies mit den Boardmitteln machbar ist. Aber mit einem Modul sollte es kein Problem sein.

In älteren Oxid-Versionen wird die Kategorie in der Session gespeichert, in neueren werden eigene URLs für die Detailansichten generiert. Das heißt, wenn man die Artikel anzeigen will ohne die Kategorien zuzuweisen, muss man das SQL an mehreren Stellen ändern (z.B. Liste, Suchen, Anzahl Artikel) und muss die Speicherung der Kategorie in der Session re-implementieren. Ich denke es ist einfacher ein Modul zu schreiben das die übergeordneten Kategorien automatisch bei den Artikeln einträgt.

oder automatisch mit den CSV Import von Dörk oder Dartsch

Danke für Info Jungs :slight_smile:

Da werd ich wohl mal was programmieren.
Codeschnipsel gibts dann später ^^

mfg, Sebastian :cool:

Huhu Jungs,

ich hab eine kleine Anpassung programmiert die die automatische Anzeige von Artikeln in Hauptkategorien aus Unterkategorien ermöglicht.

Dabei ist es völlig egal wie viele Unterkategorien eine Hauptkategorie hat.
Artikel werden auch nicht doppelt angezeigt wenn diese nochmal in einer übergeordneten Kategorie definiert werden.

Getestet wurde das ganze mit einer Oxid Version 4.2.xxxx!

1.)
"[B]/core/axarticlelist.php[/B]"

Zeile: 422 “public function loadCategoryArticles”


//public function loadCategoryArticles( $sCatId, $aSessionFilter, $iLimit = null )
public function loadCategoryArticles( $sCatId, $aSessionFilter, $iLimit = null, $subCats = array() )

Zeile: 444 “public function loadCategoryArticles”

[B]unter[/B]
if ($iLimit = (int) $iLimit) {
$sSelect .= " LIMIT $iLimit";
}


if( !empty($subCats) && is_array($subCats) ) {
            $sSearch            = " and oc.oxcatnid = '". $sCatId ."'";
            $sReplaceList       = array();
            $sReplaceList[]     = "oc.oxcatnid = '". $sCatId ."'";
            foreach($subCats as $key => $val) {
                $sReplaceList[] = "oc.oxcatnid = '". $val['id'] ."'";
            }
            $sReplace           = " and ( ". implode(" OR ", $sReplaceList) ." )";
            $sSelect            = str_replace($sSearch, $sReplace, $sSelect);
        }

2.)
"[B]/view/alist.php[/B]"

Zeile: 350 " protected function _loadArticles( $oCategory ) "

[B]unter[/B]
$sActCat = oxConfig::getParameter( ‘cnid’ );


$subCatList     = $this->getSubCatList();
            foreach($subCatList as $key => $val) {
                if( $val->oxcategories__oxactive->rawValue == 1 && $val->oxcategories__oxhidden->rawValue == 0 ) {
                    $subCats[]  = array(
                        'id'        => $val->oxcategories__oxid->value,
                        'pid'       => $val->oxcategories__oxparentid->value,
                        'name'      => $val->oxcategories__oxtitle->value,
                    );
                }
                $subCatsPlus    = $this->getCatSubcat($val);
                
                // Array Merge
                $subCats        = array_merge($subCats, $subCatsPlus);
            }
            //print_r($subCats);

            //$this->_iAllArtCnt = $oArtList->loadCategoryArticles( $sActCat, $aSessionFilter );
            $this->_iAllArtCnt = $oArtList->loadCategoryArticles( $sActCat, $aSessionFilter, null, $subCats );

Zeile: 377

[B]unter[/B]
protected function _loadArticles( $oCategory )

neue Funktion


function getCatSubcat($data) {
    
        // Default
        $output = array();
        
        // List
        foreach($data->_aSubCats as $key => $val) {
        
            // Val
            $output[]  = array(
                'id'        => $val->oxcategories__oxid->value,
                'pid'       => $val->oxcategories__oxparentid->value,
                'name'      => $val->oxcategories__oxtitle->value,
            );
            
            if( isset($val->_aSubCats) && !empty($val->_aSubCats) ) {
                $subCatsPlus = $this->getCatSubcat($val);
                $output     = array_merge($output, $subCatsPlus);
            }
        }
        
        // Return
        return $output;
    }

Viel Spaß damit :cool:

mfg, Sebastian

P.s. Der Code ist völlig frei und die Nutzung ist auf eigene Gefahr.

Hallo,

das ganze funktioniert theoretisch ja ganz gut.

Taucht bei dir auch das Problem auf das verschiedene Elemente der Auflistung nicht angezeigt werden?
(z.b. “Artikel 1-25 von 52” / “Artikel pro Seite” / usw.)

Mir fehlen also einige Elemente die sonst bei einer normalen Kategorie angezeigt werden.

Wäre toll wenn man dies noch hinbekommt.

Vielen Dank!

[QUOTE=b502;41558]Hallo,

das ganze funktioniert theoretisch ja ganz gut.

Taucht bei dir auch das Problem auf das verschiedene Elemente der Auflistung nicht angezeigt werden?
(z.b. “Artikel 1-25 von 52” / “Artikel pro Seite” / usw.)

Mir fehlen also einige Elemente die sonst bei einer normalen Kategorie angezeigt werden.

Wäre toll wenn man dies noch hinbekommt.

Vielen Dank![/QUOTE]
Ich denke, das liegt daran, dass erst spät in den normalen Prozess eingegriffen wird.

Wenn man das SQL zur Artikelauswahl für die Liste angepasst hätte, würden solche Dinge wohl auch passen, da diese vom ursprüngliche SQL-Ergebnis abgeleitet werden.

Das SQL ist hier schon angepasst, aber die Anzahl wird aus dem Cache genommen und ist dann 0. Wenn oxarticlelist::loadCategoryArticles die Anzahl liefert, sollte es gehen:

Zeile: 444 “public function loadCategoryArticles”

unter
if ($iLimit = (int) $iLimit) {
$sSelect .= " LIMIT $iLimit";
}



        if( !empty($subCats) && is_array($subCats) ) {
            $sSearch            = " and oc.oxcatnid = '". $sCatId ."'";
            $sReplaceList       = array();
            $sReplaceList[]     = "oc.oxcatnid = '". $sCatId ."'";
            foreach($subCats as $key => $val) {
                $sReplaceList[] = "oc.oxcatnid = '". $val['id'] ."'";
            }
            $sReplace           = " and ( ". implode(" OR ", $sReplaceList) ." )";
            $sSelect            = str_replace($sSearch, $sReplace, $sSelect);
            
            //Diese 2 Zeilen liefern die Anzahl
            $oRet = oxDb::getDb()->Execute( $sSelect );
            $iArticleCount = $oRet->recordCount();
        }

Vielen Dank! Das ganze funktioniert perfekt!

Vielen vielen dank! Hat super geklappt!

Sollte Standard sein! :slight_smile:

dann hier rein damit:

http://oxid.uservoice.com/forums/31940-feature-requests

(bitte in Englisch)

Der Hack ist super, aber leider werden nach dem Klick auf “In den Warenkorb” keine Produkte der Kategorie mehr angezeigt.

Hat jemand vielleicht eine Lösung?

Dankeschön!

funktioniert der Hack eigentlich auch unter aktuellen Versionen? Will es nicht drauf ankommen lassen :wink:

Funktioniert in der 4.4.8. perfekt :slight_smile:

Hm,

scheint in der aktuellstenb Version(4.6.2) nicht zu funktionieren.
Wenn ich genau nach Anleitung ändere (wobei der Code nicht mehr der gleiche ist wie damals) erhalte ich folgende Fehlermeldung:

Parse error: syntax error, unexpected '{', expecting T_FUNCTION in /home/******/public_html/core/oxarticlelist.php on line 434

Ich nehme an, es liegt daran,dass der vorgeschlagene zu ändernder code

//public function loadCategoryArticles( $sCatId, $aSessionFilter, $iLimit = null )
public function loadCategoryArticles( $sCatId, $aSessionFilter, $iLimit = null, $subCats = array() )

In der Form nicht mehr der gleiche ist

Hallo an alle,
ich weiß der Thread ist schon einbisschen alt aber ich hab diese Methode mit meinem Shop bei Version 4.10.1 eingesetzt und die Oberkategorie kann schon die Artikel von Unterkategorie anzeigen, aber es fehlt die Navigation zu nächste Seite. Zb bei Kat A hab ich 100 Artikel (inklusiv die von Unterkategorie) und ich stellt ein , dass pro Seite 40 Artikel angezeigt werden, dann sind nur die erste 40 angezeigt, und es gibt keine Möglichkeit, zu nächste Seite zu navigieren.
Vielleicht kann jm mir helfen…
Vielen Dank.
Grüß
Judas.