Förstå överstyrning i Magento Controllers

I den tredje och sista artikeln i den här övergripande serien i Magento kommer jag att förklara hur man överstyrar kärnkontrollens filer. I de föregående två artiklarna i denna serie diskuterade vi övergripande kärnfiler för block och modeller genom att skapa en anpassad modul. I den här handledningen tittar vi på överordnade core-kontrollerfiler.

Varför Överstyrande Controllers?

I Magento är regulatorn ansvarig för hantering av inkommande förfrågningar, och det är en ryggrad i Magento-routing-implementeringen. För att hantera förmodligen alla förfrågningar i Magento, definierar styrenheten olika åtgärder i form av reglerklassmetoder. Regleringsåtgärdsmetoden innehåller relaterad applikationslogik som interagerar med visningar och modeller för att förbereda utmatningen på den specifika sidan. Ibland behöver du ändra flödet av kontrollerens utförande för att injicera anpassad kod eller ändra kärnkoden.

Som jag sa i den tidigare handledningen rekommenderas det aldrig att ändra kärnfiler direkt, eftersom det gör uppgraderingen av Magento väldigt svårt. För att undvika detta bör vi följa standardmetoden för att göra önskade ändringar i kärnfilerna: vi bör antingen använda händelseobservatörer eller överstyra kärnfiler med våra anpassade modulfiler. Vi diskuterar den övergripande funktionen idag.

I den här handledningen gör vi en anpassad modul för att förstå hur kontrollen överordnad fungerar i Magento. I den här anpassade modulen kan vi se hur man överstyrar en "Produkt" -kontroller klass av kärnan "Katalog" modulen. Överordnade verk genom att skapa vissa XML-taggar enligt Magento-konventionerna.

Jag antar att du är bekant med grundmodulskapet i Magento. Om inte, kan du hänvisa till den här artikeln om skapande av anpassad modul. 

En blick på inställningen

Här är listan över filer som krävs för önskad inställning:

  • app / etc / modules / Envato_All.xml: Det är en fil som används för att aktivera vår anpassade modul.
  • app / code / local / Envato / Katalog / etc / config.xml: Det är en modulkonfigurationsfil där vi ska ställa in kontrollerklassens överordnade användning med vissa taggar enligt Magento-konventionerna.
  • app / code / local / Envato / katalog / controllers / ProductController.php: Det är en anpassad klassklassfil som vi använder för att åsidosätta kärnan "Produkt" -kontroller klassen.

Skapa filer och mappar: Anpassad modul

Först måste vi skapa en modul enabler fil. Skapa en fil "app / etc / modules / Envato_All.xml" och klistra in följande innehåll i den filen. Vi har använt Envato som vår modul namnrymd och Katalog som vårt modulnamn. Det aktiverar vår "Catalog" -modul som standard.

    Sann lokal   

Därefter måste vi skapa en modulkonfigurationsfil. Skapa "app / code / local / Envato / Catalog / etc / config.xml" och klistra in följande innehåll i den filen.

    1,0        Envato_Catalog      

Först har vi definierat ett modulversionsnummer med hjälp av  märka. De taggen är routerens namn på katalogen "Katalog". Den informerar routingsystemet som vi vill åsidosätta kontrollerna av "Catalog" -modulen. 

Slutligen, den Envato_Catalog tagg används för att informera Magento-routingsystemet om att det ska ladda din anpassade modulens kontrollerfiler om det finns tillgängligt. Naturligtvis laddar det kärnfilerna i katalogen "Catalog" om det inte går att hitta dem under din modul.

Slutligen är det enda som återstår att definiera en kontrollerklass Envato_Catalog_ProductController. Låt oss skapa en kontrollerfil "app / code / local / Envato / Catalog / controllers / ProductController.php" och klistra in följande innehåll i den filen.

getRequest () -> getParam ('category', false); $ productId = (int) $ this-> getRequest () -> getParam ('id'); $ specifyOptions = $ this-> getRequest () -> getParam ('options'); // Förbered hjälparparametrar $ viewHelper = Mage :: hjälpar ('catalog / product_view'); $ params = nytt Varien_Object (); $ Params-> setCategoryId ($ Kategorinr); $ Params-> setSpecifyOptions ($ specifyOptions); // Render page try $ viewHelper-> prepareAndRender ($ productId, $ this, $ params);  fångst (Undantag $ e) if ($ e-> getCode () == $ viewHelper-> ERR_NO_PRODUCT_LOADED) om (isset ($ _ GET ['store']) &&! $ this-> getResponse () -> isRedirect ()) $ this -> _ vidarebefordra ('noRoute'); annat Mage :: logException () ($ e); $ this -> _ forward ('noRoute');

Vi har definierat en Envato_Catalog_ProductController klass som sträcker kärnan Mage_Catalog_ProductController controller klassen av Catalog modulen. Det viktiga att notera här är att vi har inkluderat kärnkontrollerfilen "Mage / Catalog / controllers / ProductController.php" innan klassdefinitionen, eftersom Magento inte automatiskt kommer att inkludera det.

I ovanstående exempel har vi överträtt viewAction metod för Mage_Catalog_ProductController klass. Det betyder att när en produktdetaljer sida ses i fronten, så kallas den viewAction Metod definierad i din anpassade kontrollerklass. Så du kan ändra koden som definieras enligt den metoden enligt dina krav.

Slutsats

Så idag lärde vi oss att överstyra kärnkontrollens filer i Magento med hjälp av en anpassad modul. Jag hoppas att du har haft den här serien och lärt dig något användbart som du kan implementera i din kod! Dela dina frågor och förslag med hjälp av flödet nedan!