בכדי לעקוב אחרי המדריך הבא תצטרכו שני דברים:
- התקנה של מג'נטו בגרסה 1.9
- n98-magerun
למי שלא מכיר, n98-magerun הוא כלי שימושי ביותר למפתחי מג'נטו, המאפשר לנו לבצע בזריזות פעולות נפוצות ואינטראקציות עם המערכת שגוזלות לנו זמן יקר מדי יום.
אחד מהכלים שמג'נטו מעמידה לרשותנו היא האפשרות להריץ קוד משלנו כאשר אירועים (events) שונים התרחשו או עומדים להתרחש במערכת. זוהי אחת הדרכים היעילות ביותר לנו כמפתחים להתערב בפעולות מסויימות ולבצע את השינויים שאנו זקוקים להם.
אפשר, למשל, לדעת מתי לקוח התחבר, התנתק, כאשר מוצר נשמר או מתי רכישה הושלמה. בנוסף לאתרעה שנקבל, יועברו אלינו בדרך כלל גם האובייקטים עליהם תבוצע, או בוצעה הפעולה.
נתחיל ביצירת מודול פשוט עם observer ונראה את המנגנון בפעולה. בחלק ב' כבר נצלול אל תוך המימוש של ארכיטקטורה מוכוונת אירועים במג'נטו.
יצירת מודול בסיסי
עברו לתיקיה של מג'נטו והשתמשו בפקודה הבאה כדי ליצור מודול בסיסי עם n98-magerun:
n98-magerun dev:module:create --add-models Produckt ObserverTutorial local
טיפ: דאבל קליק לסימון של כל הקוד.
הפלט שיתקבל צריך להיות דומה לזה:
Created directory: /var/www/htdocs/app/code/local/Produckt/ObserverTutorial Created directory: /var/www/htdocs/app/code/local/Produckt/ObserverTutorial/etc Created directory: /var/www/htdocs/app/code/local/Produckt/ObserverTutorial/Model Created file: /var/www/htdocs/app/etc/modules/Produckt_ObserverTutorial.xml (248 bytes) Created file: /var/www/htdocs/app/code/local/Produckt/ObserverTutorial/etc/config.xml
רעננו את עמוד הבית שלכם כדי שמג'נטו תבצע רישום של המודול ולאחר מכן בדקו שהוא אכן פעיל על ידי שימוש בפקודה:
n98-magerun dev:module:list | grep Produckt_ObserverTutorial
התוצאה צריכה להיות:
| local | Produckt_ObserverTutorial | 1.0.0 | active |
מה שעשינו עד כה הוא ליצור מודול בסיסי, לגרום למג'נטו לזהות אותו, ולוודא שהוא אכן פעיל.
יצירת Observer
כעת, ליצירת ה-Observer, הוסיפו את השורות הבאות ל-app/code/local/Produckt/ObserverTutorial/etc/config.xml
<frontend><!-- אנחנו מוסיפים הגדרות שקשורות אך ורק לחזית האתר ולא לממשק הניהול -->
<events><!-- כאן אנחנו אומרים למג'נטו שאנחנו רוצים להוסיף הגדרות שקשורות לאירועים -->
<controller_action_predispatch><!-- ואנחנו רוצים להגדיר משהו שקשור לאירוע הספציפי הזה -->
<observers><!-- אנחנו מעוניינים להוסיף לאירוע אובזרבר -->
<controller_action_predispatch_observer><!-- וזה המזהה הייחודי שלנו בעזרתו מג'נטו תדע שהיא צריכה לקרוא לפונקציה שלנו -->
<class>produckt_observertutorial/observer</class><!-- המחלקה שלנו -->
<method>controllerActionPredispatch</method><!-- הפונקציה שלנו -->
</controller_action_predispatch_observer>
</observers>
</controller_action_predispatch>
</events>
</frontend>
ואז צרו תחת app/code/local/Produckt/ObserverTutorial/Model קובץ בשם Observer.php.
class Produckt_ObserverTutorial_Model_Observer
{
public function controllerActionPredispatch(Varien_Event_Observer $observer)
{
// אנחנו קוראים למערכת ההודעות של מג'נטו ומבקשים להוסיף הודעת הצלחה
Mage::getSingleton('core/session')->addSuccess('Hello, World!');
}
}
נקו cache, אם הוא דלוק, ורעננו את הדף. במידה והצלחתם תראו את הודעת ההצלחה של מג'נטו עם צמד המילים האלמותיות, Hello World!
אז מה עשינו פה בעצם?
התחלנו בהוספת הגדרות למערכת ב-XML. התגית הראשונה שלנו היא תגית ה-frontend. למי שלא מכיר את החלוקה של מג'נטו לאזורים שונים, מספיק לדעת כרגע שהקוד שלנו יעבוד רק בחזית החנות ולא בממשק הניהול למשל.
לאחר מכן אנחנו מגדירים באיזו מחלקה להשתמש ולאיזו פונקציה בה לקרוא כאשר מתרחש אירוע.
מה שעשינו עד עכשיו אולי נותן לכם כבר כמה רעיונות, אבל בואו נהפוך את זה ליותר מעניין.
הוסיפו ב-config.xml תחת events את השורות הבאות:
<customer_login>
<observers>
<customer_login_observer>
<class>produckt_observertutorial/observer</class>
<method>customerLogin</method>
</customer_login_observer>
</observers>
</customer_login>
וב-Observer.php הוסיפו את הפונקציה הבאה:
public function customerLogin(Varien_Event_Observer $observer)
{
$customer = $observer->getEvent()->getCustomer();
Mage::getSingleton('core/session')->addSuccess('Welcome ' . $customer->getName() . '!');
}
נקו cache והתחברו לחשבון שלכם.
אם הצלחתם, בשלב זה תראו את שתי ההודעות, Hello World!, והודעה נוספת שמברכת אתכם.
זה מתאפשר כיוון שכאשר הפונקציה שלכם נקראת על ידי מג'נטו, מועבר אליה אובייקט מסוג Varien_Event_Observer שבדרך כלל מכיל בתוכו את השחקנים המרכזיים באירוע. הגישה הזו לאובייקטים היא מה שהופך את השימוש באובזרברים לכל כך עוצמתי.
אז איך הקסם הזה קורה?
במחלקה Mage_Customer_Model_Session נמצא את הפונקציה הבאה:
public function setCustomerAsLoggedIn($customer)
{
$this->setCustomer($customer);
$this->renewSession();
Mage::getSingleton('core/session')->renewFormKey();
Mage::dispatchEvent('customer_login', array('customer'=>$customer));
return $this;
}
הפונקציה הזו מבצעת מספר פעולות ולאחר מכן קוראת ל-Mage::dispatchEvent עם 2 פרמטרים, הראשון הוא שם האירוע, והשני מערך אסוציאטיבי עם השחקנים המרכזיים באירוע.
כמובן שגם אתם יכולים להשתמש ב-Mage::dispatchEvent כדי להעניק למפתחים אחרים דרכים לעקוף את הקוד שלכם מבלי לגעת במודולים עצמם.
אז איך נשתמש ב-Mage::dispatchEvent בעצמנו, ומה בעצם קורה כשאנחנו קוראים ל-Mage::dispatchEvent? על זה נדבר בחלק ב'.

