Shopping nur in den Hauptkategorien / Modul

Hi zusammen,

hat jemand von Euch bereits ein Modul geschrieben, das es ermöglicht nur in entsprechenden Hauptkategorien zu shoppen.

Das Prinzip ist ja eigentlich bereits im Private Shopping so umgesetzt. Allerdings wird dort bei allen Kategorien der Warenkorb geleert. Ich bräuchte das Ganze nur für die kompletten Hauptkategorien nebst deren Unterkategorien.

Also so:

Töpfe
-> Sub
-> Sub
-> Sub

Pfannen
-> Sub
-> Sub
-> Sub

Man kann also entweder nur Artikel aus der Kategorie Töpfe nebst Subs kaufen oder Artikel aus der Kategorie Pfannen. Ansonsten soll sich beim Wechsel in eine Subkategorie der Warenkorb leeren.

Hi Ray, verschiebst Du das Thema bitteschön in Module?

Hi zusammen,

suche gerade die Funktion, die beim Wechsel der Kategorien den Warenkorb leert, damit ich mir ein solches Modul basteln kann. Jemand eine Idee, wo diese denn steckt? Suche jetzt schon ne ganze Weile.

Just wo ich jetzt hier schreibe, sehe ich die Funktion in oxcmp_basket.php. Kann man Komponenten ebenfalls mit einem Modul überladen? Na, ich werds gleich wissen…

So, wenn ich jetzt noch rausbekomme, wie man auch im Basket an die ID der obersten Kategorie bekomme, ist mir schon geholfen:


<?php
class rootdeletebasket extends oxcmp_basket 
  {   
    /**
     * Returns true if active root category was changed
     *
     * @return bool
     */
    public function isRootCatChanged()
    {
        // in Basket
        $oBasket = $this->getSession()->getBasket();
        if ( $oBasket->showCatChangeWarning() ) {
            $oBasket->setCatChangeWarningState( false );
            return true;
        }

        // in Category, only then category is empty ant not equal to default category
        $sDefCat = oxRegistry::getConfig()->getActiveShop()->oxshops__oxdefcat->value;
        $sActCat = oxConfig::getParameter( 'cnid' );
        $oActCat = oxnew('oxcategory');
        if ($sActCat && $sActCat!=$sDefCat && $oActCat->load($sActCat) ) {
            // Array of maincategory ID's
            $sActRoot = array(820001, 820003);

            if ( $oBasket->getBasketRootCatId() && !in_array($oBasket->getBasketRootCatId(), $sActRoot) ) {
                return true;
            }
        }

        return false;
    }  
}

Hmm, wahrscheinlich ists weniger kompliziert als ich denke. Ich muss prüfen, ob sich der Artikel im Warenkorb in einer der beiden im Array angegebenen Hauptkategorien befindet. Ist das nicht der Fall, muss der Warenkorb geleert werden…

So wie oben funktionierts eigentlich… Nur habe ich das Problem, dass manche Artikel bspw. einer weiteren Kategorie NEU und Angebote zugeordnet sind. Wenn ich diese in den Warenkorb lege, stimmt natürlich die entsprechende getBasketRootCatId nicht mehr…

Irgendwelche Idee von der Entwicklerfront?

So, jetzt hab ich eine Lösung gefunden. Schön ists nicht, deswegen die Frage, wie ich das noch sauberer hinbekomme?

Ich überlade die oxcmp_basket folgendermaßen:


<?php
class rootdeletebasket extends oxcmp_basket 
  {   
    public function tobasket( $sProductId = null, $dAmount = null, $aSel = null, $aPersParam = null, $blOverride = false )
    {
        // adding to basket is not allowed ?
        $myConfig = $this->getConfig();
        if ( oxRegistry::getUtils()->isSearchEngine() ) {
          return;
        }       

        // adding articles
        if ( $aProducts = $this->_getItems( $sProductId, $dAmount, $aSel, $aPersParam, $blOverride ) ) {

            $this->_setLastCallFnc( 'tobasket' );
            $oBasketItem = $this->_addItems( $aProducts );
            $oxArticle = $oBasketItem->getArticle(false, $sProductId, false);
            $oxCategory = $oxArticle->getCategory();
            
            $oBasket = $this->getSession()->getBasket();
            
            if ( $oBasket && !$oBasket->getProductsCount()) {
              $this->getSession()->getBasket()->setBasketRootCatId($oxCategory->oxcategories__oxrootid->value);
            }        
            
            // new basket item marker
            if ( $oBasketItem && $myConfig->getConfigParam( 'iNewBasketItemMessage' ) != 0 ) {
                $oNewItem = new stdClass();
                $oNewItem->sTitle  = $oBasketItem->getTitle();
                $oNewItem->sId     = $oBasketItem->getProductId();
                $oNewItem->dAmount = $oBasketItem->getAmount();
                $oNewItem->dBundledAmount = $oBasketItem->getdBundledAmount();

                // passing article
                oxSession::setVar( '_newitem', $oNewItem );
            }

            // redirect to basket
            return $this->_getRedirectUrl();
        }
    } 
}

Im productmain.tpl frage ich dann wie folgt ab:


  [{assign var='categoryid' value=$oView->getCategoryId()}]
  [{assign var='articlecategory' value=$oDetailsProduct->getCategory()}]
  [{assign var='articlerootcategory' value=$articlecategory->getRootId($categoryid)}]
  
  [{assign var="session" value=$oView->getSession()}] 
  [{assign var="sbasket" value=$session->getBasket()}]
                  
  [{*artbasket: [{$sbasket->getBasketRootCatId()}]
  <br>
  artroot: [{$articlerootcategory*}]
                  
  [{if $sbasket->getBasketRootCatId() == $articlerootcategory || $sbasket->getProductsCount() == 0}]
     [{assign var="canCatBuy" value=true}]
  [{else}]
    [{assign var="canCatBuy" value=false}]
  [{/if}]   



Nun kann ich natürlich eine entsprechende Meldung ausgeben, dass nur Artikel aus einer Hauptkategorie in den Warenkorb gelegt werden dürfen und den Button entsprechend deaktivieren:

So, hab das ganze jetzt in ein Modul gepackt und natürlich entsprechende Template Blocks verwendet. Zusätzlich funktionierts nun auch im Mobile Template. Also, falls es mal jemand benötigen sollte, lassts mich wissen.

Github ist unser Freund :slight_smile:

(ach ja - Danke Dir Chris!)

Gibt es dieses Modul noch irgendwo?
Gruß, Jörg