Gezien het aantal eCommerce-raamwerken dat op de markt beschikbaar is, is Magento een van de populairste keuzes voor middelgrote tot grote webwinkels. Zowel de functieset als de architectuur helpen om het te onderscheiden van veel van de andere opties die vandaag beschikbaar zijn.
Hoewel er veel extensies van derden voor Magento beschikbaar zijn, is het ook eenvoudig om deze zelf te ontwikkelen. Het doel van deze zelfstudie is niet om te leren hoe u een aangepaste extensie maakt; er wordt echter wel van uitgegaan dat u bekend bent met het proces, omdat we een ontwerppatroon zullen gebruiken om onze eigen aangepaste module te implementeren.
Concreet zullen we kijken naar het patroon van de gebeurtenis-waarnemer. Voor degenen die onbekend zijn, registreren waarnemers zich om op een evenement te wachten, zodat ze code kunnen uitvoeren wanneer een evenement wordt ontslagen.
Zoals gezegd, gaat deze tutorial ervan uit dat u bekend bent met het ontwikkelen van aangepaste modules binnen Magento, omdat we een aangepaste module gaan maken met dat ontwerppatroon.
Ten eerste moeten we de waarnemer aangeven voor ons aangepaste evenement. Hiertoe typt u de volgende code in het bestand config.xml van uw module net binnen het globale element.
We zullen de code kort uitleggen.
... ... eenling modulename / waarnemer my_custom_method
In de bovenstaande code hebben we zojuist de waarnemer opgegeven voor het evenement met de naam my_custom_event
. Dit betekent gewoon dat wanneer my_custom_event
wordt geactiveerd, ziet u dat de waarnemer voor deze gebeurtenis is geregistreerd in uw module en voert vervolgens de code uit die is gekoppeld aan de gebeurtenis.
In ons geval zal het de methode noemen my_custom_method
gedefinieerd in de klas Namespace_Modulename_Model_Observer
.
Laten we nu een stap verder gaan. Merk op dat in de
tag, kunt u de gebeurtenissen definiëren waarvoor u de waarnemers wilt registreren. In ons geval hebben we de waarnemer geregistreerd voor het evenement
. U kunt ook meerdere waarnemers voor dezelfde gebeurtenis definiëren. In dat geval, verklaar al uw waarnemers binnen de
label.
Vervolgens wordt elke waarnemer omwikkeld met een unieke identificatie. In ons voorbeeld is dat het
. Bovendien moet u de klassenaam en de naam van de methode opgeven die moeten worden uitgevoerd. De
tag geeft de locatie van de klasse aan volgens de Magento-conventie.
In ons voorbeeld zal het zijn Observer.php
onder de model-
map van module naam
module. De methode naam wordt aangegeven door de
label. De waarde van de
tag is "singleton" wat betekent dat het hetzelfde exemplaar van het waarnemerobject voor elke gebeurtenisaanroep gebruikt.
Laten we nu, na onze waarnemer te hebben verklaard, de waarnemingsklasse en de bijbehorende methodecode creëren. Maak een bestand Observer.php
onder de Model
map van uw module. Kopieer en plak de volgende code in dat bestand.
getEvent (); // getter-methode om cid-waarde op te halen die door de coördinator is doorgegeven $ cid = $ event-> getCid (); echo $ cid; Uitgang; ?>
Hier hebben we zojuist de waarnemersklasse gemaakt. In de my_custom_method
methode, hebt u toegang tot het waarnemingsobject en de bijbehorende gegevens van de coördinator, zodat u deze kunt gebruiken om iets zinvols te doen.
In dit voorbeeld hebben we zojuist de waarde opgehaald van de cid
variabele doorgegeven via de afzendercode die we zo meteen zullen zien.
Natuurlijk moet u de module naam
en namespace
volgens uw aangepaste module in het klassenbestand en de XML-verklaring.
Omdat we de waarnemer in de aangepaste module hebben verklaard, is het enige dat overblijft om onze aangepaste gebeurtenis te verzenden.
Laten we eens kijken hoe u Magento's event dispatcher kunt gebruiken vanuit uw aangepaste module. Schrijf de volgende code in de methode van uw controller vanaf waar u de gebeurtenis wilt verzenden. Dat gezegd hebbende, kunt u de gebeurtenis ook vanaf andere plaatsen dan de controller activeren.
'123'); Mage :: dispatchEvent ('my_custom_event', $ event_data_array); ...?>
Zoals je kunt zien is het vrij eenvoudig om te verzendenhet evenement van bijna overal in Magento. Het eerste argument van de dispatchEvent
methode is de naam van de gebeurtenis en het tweede argument wordt gebruikt om de gegevens door te geven aan waarnemers.
Zoals je misschien eerder in de waarnemersklasse hebt opgemerkt, hebben we de methode getter gebruikt om toegang te krijgen tot de waarde van variabele cid
.
In de meeste gevallen zijn de gebeurtenisgegevens die aan de waarnemers zijn doorgegeven in de alleen-lezen modus. Meer specifiek, waarnemers kunnen de waarde van de variabelen die door de methode van de gebeurtenisverdeler zijn doorgegeven niet veranderen.
Stel dat u een aangepaste gebeurtenis in uw module hebt verzonden en dat de waarnemers de oorspronkelijke gegevens over de gebeurtenis kunnen wijzigen. Laten we de dispatcher-code opnieuw bekijken om dit te bereiken.
'123'); $ varien_object = nieuw Varien_Object ($ event_data_array); Mage :: dispatchEvent ('my_custom_event', array ('varien_obj' => $ varien_object)); // zou output '456' moeten uitvoeren, aangezien we de waarde in waarnemer echo $ varien_object-> getCid (); ...?>
We hebben zojuist het speciale object van Magento gebruikt Varien_Object
en onze gegevens met behulp van die doorgegeven om ervoor te zorgen dat elke wijziging van de gegevens wordt bewaard.
U moet ook de waarnemerclasscode dienovereenkomstig wijzigen. Hier is de aangepaste waarnemerklasse.
getEvent (); // getter-methode om varien-object te halen dat door de coördinator is doorgegeven $ varien_object = $ event-> getVarienObj (); $ Varien_object-> setCid ( '456'); ?>
De enige grote verandering in de code is het ophalen van de Varien
object en gebruik dat om de waarde van de array-variabele te wijzigen cid
.
Hoewel dit een relatief eenvoudige tutorial is, laat het zien hoe we het Event-Observer Pattern gemakkelijk kunnen implementeren in de context van een Magento-custom module. Op dit moment moet u bekend zijn met het maken van uw eigen aangepaste modules met behulp van het patroon gebeurtenis-waarnemer.
Aarzel niet om vragen en / of opmerkingen achter te laten in het onderstaande formulier!