2017-04-06 9 views
0
  1. Ich habe site.com/rims/?vehicleCode=P0000061000
  2. Wenn ich die Produkte mit dem Code filtern die Standardfilter nicht funktionieren.
  3. In der Installationsfunktion in der Bootstrap.php Datei ich die $ this-> subscribeEvent abonniert ( 'Enlight_Controller_Action_PostDispatchSecure_Frontend_Listing', 'onPostDispatchListing' ); Ereignis. Danach in der onPostDispatchListing Funktion habe ich:Listing Produkte in Shopware auf Basis variabler in URL senden

    /** @var \Enlight_Controller_Action $controller */ 
    $controller = $args->getSubject(); 
    $request = $controller->Request(); 
    
    // defines the default shopware VIEWS directory. 
    $view = $controller->View(); 
    $view->addTemplateDir(
        __DIR__ . '/Views/responsive' 
    ); 
    
    $shop = Shopware()->Shop(); 
    $sCategorystart = $shop->getCategory()->getId(); 
    $sCategoryID = $this->getCategoryCurrent($sCategorystart); 
    
    $oDb = Shopware()->Db(); 
    $EngineCode = $request->getParam('sVehicle'); 
    $query = "SELECT va.`articleID` 
          FROM `s_vehicle_articles` as va 
          INNER JOIN `s_articles_categories` as ac ON 
          ac.articleID=va.articleID 
          WHERE ac.categoryID=" . $sCategoryID; 
    $query .= ($EngineCode) ? " AND va.`VehicleCodeID`= '" . $EngineCode . "'" : " "; 
    
    $mResults = $oDb->fetchAll($query); 
    
    $articleModule = Shopware()->Modules()->Articles(); 
    $aProducts = array(); 
    
    foreach ($mResults as $key => $value) { 
        $article = $articleModule->sGetArticleById($value['articleID'], $sCategoryID); 
        $aProducts[] = $article; 
    } 
    
    $view->sArticles = $aProducts; 
    
  4. Der Code funktioniert und die Produkte gefiltert werden, aber die Standard-Filter funktionieren nicht, wie Preisfilter etc ..

kann jemand helfen ?

Antwort

1

Ihr Code kann keine Standardfilter verwenden, da Sie die Standardartikelliste neu schreiben.

$view->sArticles = $aProducts; 

Hinweis: in Ihrer Abfrage, die Sie nicht überprüfen wichtige Cafeterias wie:

  • Ist Produkt aktiv.
  • Ist Produkt auf Lager verfügbar mehr als 0, falls dieses Produkt Flagge haben - Artikel nicht im Lager auf Lager weniger als 1. anzeigen
  • Ist Produkt für Kundengruppe verfügbar.

Als Lösung: Sie können diese 2 Ereignisse abonnieren und Ihre Abfrage Teil hinzufügen:

$this->subscribeEvent( 
    'Shopware_Modules_Articles_GetArticleById_FilterSQL' => 'modifyQuery' 
); 
$this->subscribeEvent( 
    'Shopware_Modules_Articles_sGetArticlesByCategory_FilterSql' => 'modifyQuery' 
); 

Dann Abfrage überprüfen und erweitern mit:

public function modifyQuery(\Enlight_Controller_ActionEventArgs $args) 
{ 
    $query = $args->getReturn(); 
    //Do some modifications 
    $args->setReturn($query); 
    return $args->getReturn(); 
} 

bessere Art und Weise - fügen Sie Ihre Kriterien Shopware SearchBundleCondition, aber dieser Fall erfordert einige Forschung, können Sie von this link starten.

+0

$ criteria = new Kriterien(); $ Kriterien-> addCondition (neue CategoryCondition ([3])); // Meine Bedingung sollte der Code sein, den ich in der URL sende. Wie richte ich es ein? $ context = $ this-> get ('shopware_storefront.context_service') -> getShopContext(); $ service = $ this-> get ('shopware_search.product_number_search'); /** @ var $ result ProductNumberSearchResult */ $ ergebnis = $ service-> search ($ criteria, $ context); $ numbers = []; foreach ($ result-> getProducts() als $ product) { $ numbers [] = $ product-> getNumber(); } –

+0

@DragiPostolovski, sollten Sie Ihre eigenen Kriterien erstellen, die ConditionInterface implementiert. Aber da nicht so einfach, sollten Sie auch Ihr Modell hinzufügen (haben Sie das Modell für 's_vehicle_articles' registriert), um die Abfrage des Pakets zu durchsuchen. Überprüfen Sie meine Antwort mit der 'modifyQuery'-Funktion, diese Art der Implementierung ist sehr einfach. –