Begrijp Overschrijven in Magento Controllers

In het derde en laatste artikel van deze Magento overheersende serie, zal ik uitleggen hoe je kernbesturingsbestanden kunt overschrijven. In de vorige twee artikelen van deze serie hebben we kernbestanden voor blokken en modellen besproken door een aangepaste module te maken. In deze zelfstudie bekijken we de belangrijkste kerncontrolebestanden.

Waarom besturingseenheden vervangen?

In Magento is de controller verantwoordelijk voor de afhandeling van inkomende verzoeken en is het een backbone van de Magento routing-implementatie. Om waarschijnlijk elk verzoek in Magento af te handelen, definieert de controller verschillende acties in de vorm van controllerklassemethoden. De actiemethode van de controller bevat gerelateerde toepassingslogica die samenwerkt met weergaven en modellen om de uitvoer van die specifieke pagina voor te bereiden. Soms moet u de uitvoering van de controller wijzigen om aangepaste code te injecteren of de kerncode te wijzigen.

Zoals ik in de vorige tutorial al zei, is het nooit aan te raden om de core-bestanden rechtstreeks te wijzigen, omdat het het upgraden van Magento erg moeilijk maakt. Om dit te voorkomen, moeten we de standaardmanier volgen om de gewenste wijzigingen in kernbestanden aan te brengen: we moeten eventwaarnemers gebruiken of kernbestanden overschrijven met onze aangepaste modulebestanden. We zullen vandaag de overheersende functie bespreken.

In deze tutorial maken we een aangepaste module om te begrijpen hoe het overschrijven van de controller in Magento werkt. In deze aangepaste module zullen we zien hoe een "Product" -controllerklasse van de "Catalogus" -module kan worden vervangen. Het negeren van werken door het instellen van bepaalde XML-tags volgens de conventies van Magento.

Ik neem aan dat je bekend bent met het maken van basismodules in Magento. Als dit niet het geval is, kunt u dit artikel over het maken van aangepaste modules raadplegen. 

Een blik op de installatie

Hier is de lijst met bestanden die nodig zijn voor de gewenste setup:

  • app / etc / modules / Envato_All.xml: Het is een bestand dat wordt gebruikt om onze aangepaste module in te schakelen.
  • app / code / local / Envato / Catalogus / etc / config.xml: Het is een moduleconfiguratiebestand waarin we controleklassen instellen die met behulp van bepaalde tags worden vervangen volgens de Magento-conventies.
  • app / code / local / Envato / Catalogus / controllers / ProductController.php: Het is een aangepast controllerklassebestand dat we zullen gebruiken om de kerncontrollerklasse "Product" te vervangen.

Bestanden en mappen maken: Aangepaste module

Eerst moeten we een module-enabler-bestand maken. Maak een bestand "app / etc / modules / Envato_All.xml" en plak de volgende inhoud in dat bestand. We hebben gebruikt Envato als onze modulenaamruimte en Catalogus als onze modulenaam. Hiermee wordt onze module 'Catalogus' standaard ingeschakeld.

    waar lokaal   

Vervolgens moeten we een moduleconfiguratiebestand maken. Maak "app / code / local / Envato / Catalog / etc / config.xml" en plak de volgende inhoud in dat bestand.

    1.0        Envato_Catalog      

Ten eerste hebben we een versienummer van de module gedefinieerd met behulp van de  label. De tag is de naam van de front controller-router van de kernmodule "Catalog". Het informeert het routeringssysteem dat we de controllers van de module "Catalog" willen overschrijven. 

eindelijk, de Envato_Catalog tag wordt gebruikt om het Magento routing-systeem te informeren dat het de controllerbestanden van uw aangepaste module moet laden, indien beschikbaar. Natuurlijk laadt het de kernbestanden van de "Catalogus" -module als het deze niet onder uw module kan vinden.

Ten slotte is het enige overgebleven ding om een ​​controllerklasse te definiëren Envato_Catalog_ProductController. Laten we een controllerbestand maken "app / code / local / Envato / Catalog / controllers / ProductController.php" en de volgende inhoud in dat bestand plakken.

getRequest () -> getParam ('category', false); $ productId = (int) $ this-> getRequest () -> getParam ('id'); $ specifOptions = $ this-> getRequest () -> getParam ('options'); // Helper en params voorbereiden $ viewHelper = Mage :: helper ('catalog / product_view'); $ params = nieuwe Varien_Object (); $ Params-> setCategoryId ($ categoryId); $ Params-> setSpecifyOptions ($ specifyOptions); // Render pagina probeer $ viewHelper-> prepareAndRender ($ productId, $ this, $ params);  catch (Uitzondering $ e) if ($ e-> getCode () == $ viewHelper-> ERR_NO_PRODUCT_LOADED) if (isset ($ _ GET ['store']) &&! $ this-> getResponse () -> isRedirect ()) $ this -> _ redirect ("); elseif (! $ this-> getResponse () -> isRedirect ()) $ this -> _ forward ('noRoute'); else Mage :: logException ($ e); $ this -> _ forward ('noRoute');

We hebben een gedefinieerd Envato_Catalog_ProductController klasse die de kern verlengt Mage_Catalog_ProductController controllerklasse van de catalogusmodule. Het belangrijkste om hier op te merken is dat we het kerncontroller-bestand "Mage / Catalog / controllers / ProductController.php" vóór de klassendefinitie hebben opgenomen omdat Magento het niet automatisch zal opnemen.

In het bovenstaande voorbeeld hebben we de overschreven viewAction methode van de Mage_Catalog_ProductController klasse. Dit betekent dat wanneer een productdetailpagina aan de voorkant wordt bekeken, deze de viewAction methode gedefinieerd in uw aangepaste controllerklasse. U kunt dus de code die in die methode is gedefinieerd, aanpassen aan uw vereisten.

Conclusie

Dus vandaag hebben we geleerd om de kerncontrollerbestanden in Magento te vervangen door een aangepaste module. Ik hoop dat je deze serie leuk vond en iets nuttigs hebt geleerd dat je in je code kunt implementeren! Deel uw vragen en suggesties met behulp van de onderstaande feed!