Magento Developer Certification Preparation Study Group

Session Two

Andreas Mautz || @mautz_et_tong

webvisum GmbH

NACH RECHTS
Willkommen neue, Grillen? Blöcke, Laptop Notizen Strom -> Rest später

Was?

Basics, Request Flow

NACH RECHTS
Basics, Request Flow

Wer?

  • Andreas Mautz
  • programmiert seit 16 Jahren
  • macht magento seit 2008
  • beschäftigt sich mit Deployment-Prozessen, Entwicklungsinfrastrukturen und Wissensmanagement seit 2011
  • Vorbereitung Zertifizierung
  • Lehren und Lernen Stoff zusammenzufassen
NACH UNTEN

Locationcation

Gebäude Cerberus

Next: brandung, Hansaring 78

NACH RECHTS
Toiletten, Essen, Trinken, Rauchen, Umlage, Parken, Brandung, andere Hosts

Vorstellungsrunde :)

NACH UNTEN
Einmal kurz vorstellen wenn Neue, Alter, Ausbildung, Job, Magento

Ablauf

Was machen wir denn heute Schönes?

  • Basics
  • Request Flow
  • Besprechung der Aufgaben für die Woche
  • Sonstiges
  • Grillen?
NACH UNTEN
  • Basics
  • Request Flow
  • Besprechung der Aufgaben für die Woche
  • Sonstiges
  • Grillen

Basics | Architektur

Basics | Architektur

Codepool

NACH UNTEN

Basics | Architektur

Modulstruktur

NACH UNTEN

Basics | Architektur

Templates Struktur

NACH UNTEN

Basics | Architektur

Template Datein

NACH UNTEN
Frontend | Backend

Basics | Architektur

Layout Datein

NACH UNTEN

Basics | Architektur

Skin Struktur

NACH UNTEN

Basics | Architektur

JavaScript

NACH UNTEN

Basics | Architektur

Namenskonventionen für Klassen

  • Dateien sind vom magento root ausgehend gespeichert
  • alphanumerisch, keine Zahlen
  • Unterstriche im Dateinamen "ersetzen" Slashes im Pfad: Foo/Bar.php -> class Foo_Bar
  • Jedes Wort Wird Am Anfang Groß Geschrieben
NACH UNTEN

Basics | Architektur

Autoloader

Mage::register('original_include_path', get_include_path());

if (defined('COMPILER_INCLUDE_PATH')) {
    $appPath = COMPILER_INCLUDE_PATH;
    set_include_path($appPath . PS . Mage::registry('original_include_path'));
    include_once "Mage_Core_functions.php";
    include_once "Varien_Autoload.php";
} else {
    /**
     * Set include path
     */
    $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'local';
    $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'community';
    $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'core';
    $paths[] = BP . DS . 'lib';

    $appPath = implode(PS, $paths);
    set_include_path($appPath . PS . Mage::registry('original_include_path'));
    include_once "Mage/Core/functions.php";
    include_once "Varien/Autoload.php";
}

Varien_Autoload::register();
                        
NACH RECHTS

Basics | Konfiguration

Basics | Konfiguration

Laden und Manipulieren

  • #File: app/code/core/Mage/Core/Model/App.php
  • _initModules()
  • $this->_config->loadModules()
  • Mage_Core_Model_Resource_Setup::applyAllUpdates()
  • $this->_config->loadDb()
  • #File: app/code/core/Mage/Core/Model/Config.php
  • $dbConf->loadToXml($this);
NACH UNTEN

Basics | Konfiguration

Klassen-Gruppen und Factory Methods

  • #File: app/code/core/Mage/Core/Model/Config.php
  • Namespace_Modulename_Model|Helper|...
  • $product = Mage::getModel(‘catalog/product’);
  • getModel() --> getModelInstance() --> getModelClassName()
  • getGroupedClassName('group', $className);
NACH UNTEN
http://blog.belvg.com/magento-certified-developer-exam-describing-class-group-configuration-an-use-in-factory-methods.html https://de.wikipedia.org/wiki/Fabrikmethode

Das Muster ist eines der sogenannten GoF-Entwurfsmuster (Gang of Four, siehe Viererbande). Es bezeichnet ein Muster, bei dem die Schnittstelle zur Erstellung eines Objektes eine (abstrakte) Methode einer Oberklasse ist. Die konkrete Implementierung der Erzeugung neuer Objekte findet jedoch nicht in der Oberklasse statt, sondern in von ihr abgeleiteten Unterklassen, die die besagte abstrakte Methode implementieren. Das Muster beschreibt somit die Erzeugung von Produktobjekten, deren konkreter Typ von Unterklassen einer Erzeugerklasse bestimmt wird und der ein Untertyp einer abstrakten Produktklasse ist. Es wird manchmal auch als „virtueller Konstruktor“ (virtual constructor) bezeichnet.

Basics | Konfiguration

Klassen überschreiben

  • define, init, autoload -> path -> pool
  • First in -> first load
  • möglich aber "unsauber" cp core -> local
  • sauber:
    
        
             Namespace_Modulename_Model_Foo_Bar
        
    
  • Modulkonflikte aufspürbar, getGroupedClassName findet rewrites
NACH UNTEN
http://blog.belvg.com/the-process-configuration-of-class-overrides-in-magento-register-an-observer.html

Basics | Konfiguration

Observer

NACH UNTEN

Basics | Konfiguration

Events

NACH UNTEN
Firegento -> developer Modul

Basics | Konfiguration

Cron Setup

NACH RECHTS
Aoe_Scheduler

Basics | Internationalisierung

Basics | Internationalisierung

Planen

NACH UNTEN
http://blog.belvg.com/magento-certified-developer-exam-internationalization.html

Basics | Internationalisierung

Übersetzung - Klassen und Tabellen

  • System->Config->Locale
  • #File app/code/core/Mage/Core/Helper/Abstract.php
  • public function __(){
        $args = func_get_args();
        $expr = new Mage_Core_Model_Translate_Expr(array_shift($args), $this->_getModuleName());
        array_unshift($args, $expr);
        return Mage::app()->getTranslator()->translate($args);
    }
  • Fallback
  • translate.csv
NACH UNTEN

Basics | Internationalisierung

Subdomains und Subdirectories

Basics | Internationalisierung

Subdirectories foo.com/bar

Vorteile

  • Targeting möglich
  • Verlinkung ist einfach
  • SEO geht auf die Domain
  • Einfach zu verwalten

Nachteile

  • SERP Limitierung
  • Kann schnell unordentlich und unüberschaubar werden
  • Keine Boni bei verteiltem Hosting
NACH RECHTS
http://blog.belvg.com/magento-certified-developer-exam-internationalization.html Search Engine Result Pages

Basics | Internationalisierung

Subdomains bar.foo.com

Vorteile

  • Kosten -> eine Domain
  • Subdomains können in verschiedenen Ländern gehostet werden. (SEO foo)
  • Usibility: Ländererkennung in der domain (de.amd.com)

Nachteile

  • Link Builiding erforderlich
  • Subdomins sind schwieriger in der Wartung
NACH RECHTS
http://blog.belvg.com/magento-certified-developer-exam-internationalization.html
Request Flow>

Request Flow

Request Flow>

Request Flow | Initialisierung

  1. index.php
  2. app/Mage.php (autoloader)
  3. Mage.php run($code = '', $type = 'store', $options = array())
  4. app/code/core/Mage/Core/Model/App.php run($params)
  5. Config.php loadBase() (xml-Files)
  6. $this->_initCurrentStore($scopeCode, $scopeType)
  7. $this->getFrontController()->dispatch()
NACH UNTEN
http://blog.belvg.com/magento-certified-developer-exam-application-initialization.html http://blog.belvg.com/wp-content/files/magento_request_flow.jpg
Request Flow>

Request Flow | Front Controller

Sorgt dafür, das die richtige Datei mit der richtigen Funktion erwischt wird

  1. admin (Mage_Core_Controller_Varien_Router_Admin)
  2. standard (Mage_Core_Controller_Varien_Router_Standard)
  3. cms (Mage_Cms_Controller_Router)
  4. default (Mage_Core_Controller_Varien_Router_Default)
  5. dispatch -> rewrite -> sendResponse
NACH UNTEN
Request Flow>

Request Flow | URL Rewrites

URL Struktur

  • catalog/category/view/id/10
  • url.com/foo/bar.html
NACH UNTEN
Request Flow>

Request Flow | URL Rewrites

URL Rewriting

Mage_Core_Model_Resource_Url_Rewrite

  1. Database
  2. Configuration

302 - P oder 301 - RP

NACH UNTEN
http://blog.belvg.com/magento-certified-developer-exam-url-rewrites-part-i.html
Request Flow>

Request Flow | Request Routing

Request Flow

Wir erinnern uns:

  1. admin (Mage_Core_Controller_Varien_Router_Admin)
  2. standard (Mage_Core_Controller_Varien_Router_Standard)
  3. cms (Mage_Cms_Controller_Router)
  4. default (Mage_Core_Controller_Varien_Router_Default)
  5. dispatch -> rewrite -> sendResponse


In dieser Reihenfolge wird versucht, den Request zu übergeben

NACH UNTEN
http://blog.belvg.com/magento-certified-developer-exam-request-routing.html
Request Flow>

Request Flow | Routing

Registrieren eines Routers

benötigt Controller

NACH UNTEN
Request Flow>

Request Flow | Module

Registrieren eines Moduls

  • Modul Deklaration: Foo_Bar.xml
  • Block
  • Controller
  • controllers
  • etc
  • Helper
  • Model
  • sql
  • Test
NACH UNTEN
Request Flow>

Request Flow | Module

Abhängigkeiten

  • config.xml
NACH UNTEN
Request Flow>

Request Flow | Module

Konfiguration

  • Bekanntmachen der Grouppen-Klassen
  • Setup-Skripte
  • ACL
  • Layout-Updates
  • Events
  • Router
  • Default-Werte
  • ...
NACH UNTEN
config German Setup
Request Flow>

Request Flow | Design und Layout

Flow

  • parsen
  • kompilieren
  • rendern
NACH UNTEN
Request Flow>

Request Flow | Design und Layout

Output

  • Rendering
  • Front Controller
NACH RECHTS

Hausaufgaben!

Session 3:

===========================================

Erstelle ein Rewrite für das sales/order Model, so dass die Kundengruppe als Email-variablein der sendNewOrderEmail() Methode mittels {{var customer_group.getCode()}} verfügbar ist.

Erstelle einen Observer, der den Besucher auf die Startseite umleitet, falls ein URL key benutzt wird (zB /home -> /).

Erstelle ein dynamisches Rewrite für das Modul payment/data für den helper. Dieser darf nur aktiv werden, wenn die magento Version älter als 1.4 ist und die Bezahlart ccsave für den derzeitgen Store aktiviert ist.

NACH UNTEN
Diskutieren, Mailingliste, usw. Lernen!!!

Fragen?

  • Sorgen
  • Nöte
  • Beschimpfungen
NACH UNTEN

Das meiste kommt mit der Zeit

Sonstiges

NACH UNTEN
Das wird geil, ich freu mich, verzeiht mir Fehler :)

Quellen && nützliche Links

Magento

  • Magento Design Patterns
  • Magento U
  • Magento Wiki mit How Tos


Infrastruktur

  • No Frills - Alan Storm
  • Magento PHP Developers Guide
NACH RECHTS

Danke!

ENDE
Andreas Mautz || andreas.mautz@webvisum.de || webvisum.de