Standard Sortierung Listenansicht oder zusätzliche Sortieroption

Hallo,

 

ich war lange Zeit noch in der 3.5.er Shopware Version unterwegs, wesshalb ich mich aktuell schwer in SW5 hineinvollziehen kann. Wir benötigen für einen Shop eine neue StandardSortierung bzw. die möglichkeit eine weitere neue Sortierung zur Artikel Listenansicht hinzuzufügen.

SwagCustomSort wurde bereits angeschaut ist aber relativ Komplex um sich darausdie wichtigen Infos abzuleiten, da dort noch weit mehr dran hängt als nur die Sortierung. Gibt es die möglichkeit über die sw.phar ähnlich der Filtel auch ein Plugingerüst für eine Sortierung zu generieren?

Das ausprobieren der Beispiele von: https://developers.shopware.com/developers-guide/shopware-5-search-bundle/?_ga=1.11489460.1816342462.1458026312#concept—small-example

bringt uns leider auch nicht weiter.  Dies liefert nur die Fehlermeldung:

Expected Shopware\Bundle\StoreFrontBundle\Struct\ProductContextInterface instead of Shopware\Bundle\StoreFrontBundle\Struct\ShopContextInterface. This will be changed in \Shopware\Bundle\SearchBundleDBAL\PriceHelperInterface in SW 5.2 in Shopware/Bundle/SearchBundleDBAL/PriceHelper.php on line 71

womit wir erst mal so nix anfangen können. Unser Demo Code ist folgender:

limit(10);
    $catID=2421;
    $criteria->addCondition(new CategoryCondition([$catID]));
    $criteria->addSorting(new PriceSorting());

    $context = $this->get('shopware_storefront.context_service')->getShopContext();
    $service = $this->get('shopware_search.product_number_search');

    /**@var $result ProductNumberSearchResult*/
    $result = $service->search($criteria, $context);

    $numbers = [];
    foreach($result->getProducts() as $product) {
       $numbers[] = $product->getNumber();
    }

    $this->d($numbers);

    exit;
  }
  
  private function d($obj){
    echo ""; var_dump($obj); echo "";
  }
  
}

?>

 

Ich hoffe ihr könnt uns einen Tipp geben…

 

Danke

 

Gruß

 

Florian

Das hier ist top:

1 „Gefällt mir“

Hallo pixelecho,

ich kann nur dieses Plugin empfehlen:

http://store.shopware.com/wbm8351453219168/individuelle-sortierung-in-kategorien-fuer-shopware.html

 

Im Bundle mit der indivieduellen Sortierung pro Kategorie ist das für mich ein Must-have. Sehr freundlicher und direkter Support.

 

Gruß, MArkus

2 „Gefällt mir“

Danke für die Tips.SwagDefaultSort kannte ich noch nicht. Ich schaue mal ob sich damit alles abbilden läßt. Da wir eine relativ spezielle Sortierung benötigen.

Es sollen erst alle Artikel ausgegeben werden die nicht älter als 90 Tage sind und danach alle nach Verkäufen. Sprich der Filter für die Ausgabe soll aus mehreren unterschiedlichen Kriterien zusammengesetzt werden. WIsst ihr Spontan ob man so etwas damit abbilden kann?

Leider bekomme ich mit den beschriebenen Modulen nicht die gewünschte Sortierung hin. Schade das Shopware sich hier mit der Dokumentation so bedeckt hält. EIn einfaches Beispiel wie man die Listenansicht um eine eigene Sortierung erweitert würde sicher vielen weiterhelfen, als aufgeblähte Tutorial Plugins bei denen erstmal das Zusammenspiel der unterschiedlichen Klassen auseinanderklambüsern muss.

Ich habe nun die gewüsnchte sortierung umsetzen können. Nun habe ich “nur noch” das Problem das die neue Sortierung zwar in der Selectbox ausgegebn wird anch auswahl dieser auch danach sortiert wird, ich jedoch möchte das die neue Sortierung als Standard ausgewäjlt ist. Wie bekomme ich es nun also hin diese neue Sortierung als standard zu setzen?

Bootstrap.php

subscribeEvent('Enlight_Controller_Front_StartDispatch', 'registerSubscriber');
        $this->subscribeEvent('Shopware_Console_Add_Command', 'registerSubscriber');
        return true;
    }

    public function afterInit()
    {
        $this->get('Loader')->registerNamespace(
            'SwagSearchBundle',
            $this->Path()
        );
    }
    public function getLabel()
    {
        return 'Pixelecho - Individuelle Sortierung';
    }

    public function getVersion()
    {
        return "1.1.4";
    }

    public function registerSubscriber()
    {
        $this->get('events')->addSubscriber(
            new SearchBundleSubscriber(
                Shopware()->Container(),
                $this->Path()
            )
        );
    }

    public function getInfo()
    {
        return array(
            'label' => $this->getLabel()." ".$version,
            'autor' => 'XXXX XXX',
            'version' => $this->getVersion(),
                'copyright' => 'Copyright © 2016, xxxxxx',
                'source' => "Local",
                'description' => 'Individuelle Sortierung für die Listenansicht.',
                'license' => 'Lizenz',
                'support' => 'http://www.xxxx.de/',
                'link' => 'http://www.xxxxxxx.de/'
        );
    }
}

Subscribers/SearchBundleSubscriber.php

container = $container;
        $this->pluginDir = $pluginDir;
    }

    /**
     * @inheritdoc
     */
    public static function getSubscribedEvents()
    {
        return [
            'Shopware_SearchBundle_Collect_Criteria_Request_Handlers' => 'registerRequestHandler',
            'Shopware_SearchBundleDBAL_Collect_Sorting_Handlers' => 'registerSortingHandler',
            'Enlight_Controller_Action_PostDispatchSecure_Frontend_Listing' => 'extendListingTemplate'
        ];
    }

    public function registerRequestHandler()
    {
        return new CriteriaRequestHandler();
    }

    public function registerSortingHandler()
    {
        return new RandomSortingHandler();
    }

    public function extendListingTemplate(\Enlight_Event_EventArgs $args)
    {
        $args->getSubject()->View()->addTemplateDir(
            $this->pluginDir . '/Views/'
        );
    }
}

 SearchBundleDBAL/CriteriaRequestHandler.php

get('sSort') == 99) {
            $criteria->addSorting(new RandomSorting());
        }
    }
}

SearchBundleDBAL/Sorting/RandomSorting.php

SearchBundleDBAL/RandomSortingHandler.php

orderBy('RAND()3');
    }
}

Wie gebe ich dem Shop mit das er die Standard Sortierung auf meine neue setzen soll? Oder wie kann ich die Bestehende Standard Sortierung ersetzen? Hat jemand eine idee?

Schau mal nach, welchen Wert sSort in der Standard-Sortierung hat. (Müsste 0 oder 1 sein).

Zum Ersetzen des Standards sollte es eigentlich reichen, wenn du bei

if ($request->get('sSort') == 'random')

statt ‘random’  den Standardwert setzt.

Super Tipp da hätte man eigentlich auch selbst drauf kommen können :wink: Manchmal braucht man einen Anstoß. 

Leider bringt das nicht den gewünschten effekt. Auch das umstellen über Einstellungen - Caches/Performance - Reiter Einstellungen - ALlgemein - Kategorien Standard Sortierung: auf die neue sortierung brachte keine Abhilfe. Wobei meine neu hinzugefügte sortierung dort nicht auftaucht. Ich habe daraufhin statt random als sSort für die neue Sortierung testweise “99” genommen und über die Datenbank den Wert für die standard Sortierung auch auf 99 gesetzt. Siehe da die sortierung ist als standard gewählt. Allerdings ist das Problem das die Artikel die mir angezeigt werden in einer Sortierung vorliegen die ich nicht nachvollziehen kann die die es vor der umstllugn war als meien neue Sortierung noch manuell gewählt weden musste war eine andere.

Als Anmerkung ist das das order by Random() nur ein dummy war ich habe hier eine weitaus komplexere Sortierung hinterlegt… es liegt also nicht an dem Random.

Ich habe mir jetzt anderweitig beholfen ist sicherlich nicht die beste Art die Standard Sortierung vorzugeben aber anders war es mir nicht möglich.

 

Für alle die es Interessiert ich habe ein Hook auf den Controller Listing mit der Action index gesetzt:

$this->subscribeEvent(
'Enlight_Controller_Action_Frontend_Listing_Index',
'onListingIndexAction'
);

Und dann dort für den Fall das noch kein Parameter für die gewählte sortierung übergeben wurde einfach das Parameter auf meinen “Standard” gesetzt.

    public function onListingIndexAction(Enlight_Event_EventArgs $arguments)
    {
        $listingController = $arguments->getSubject();
        $request = $listingController->Request();
        $sort = $request->getParam('sSort');
        if( empty($sort) )
        {
            $request->setParam('sSort', 99 ); // Sorgt dafür das neue Sort methode default ist....
        }
    }

Ich finde es gut das Shopware stetig weiterentwickelt wird. Auch gibt es einige an beispiel Plugins von Shopware um sich in die neue Struktur hereinzufinden, jedoch finde ich das vieles um einiges komplizierter geworden ist als es in eine der alten Shopwareversionen der fall war. Eine Code ersparnis das unzählige Zeilen Code eingespart werden finde ich nicht wirklich wieder. Eher ist alles über viele Dateien verstreut…