Finding Your Way: Understanding Magento Code

  • Published on

  • View

  • Download

Embed Size (px)


With millions of lines of code, an unconventional approach to MVC framework architecture, and unique concepts such as layout XML, Magento can be intimidating for the new developer and even difficult for experienced Magento developers. This talk aims to help developers find answers in the codebase by breaking down the technologies, design patterns, and module structure into intuitive chunks. Starting with a high level view of Magento's MVC implementation, a pre-developed module is dissected in order to demonstrate various areas of the framework as well as the application-level settings and features which can thwart (or aide!) developers. Topics covered include the following: * MVC theory as implemented by Magento, especially the thin-controller, fat-view concept * Overall module architecture * Finding method definitions when grep won't work, aka "when __call() strikes" * Identifying poor-performing code using native code profiling tools * An infallible (well, nearly-infallible) flowchart for finding problematic code * Essential developer preparations


  • 1.{Finding Your WayUnderstanding Magento Code // @benmarks

2. Ben Marks4.5 years doing Magento dev2 years as a Magento U instructorHappily employed at Blue Acorn inCharleston, SC (were hiring!)Big fan of questions (ask away)Who am I? 3. Who knows Magento?Who are you? 4. Who knows Magento?Who hates Magento?Who are you? 5. Who knows Magento?Who hates Magento?Who doesnt know Magento, but has beentold that they should hate it?Who are you? 6. Who knows Magento?Who hates Magento?Who doesnt know Magento, but has beentold that they should hate it?"Magento doesnt do anything very well" Harper Reed, php|tek, 2013Who are you? 7. ZF1-based MVC frameworkeCommerce ApplicationAnswer to osCommerceWhat is Magento? 8. LOTS of businessLOTS of developer community membersLOTS of room for innovationLOTS of flexibilityLayout XMLWhat makes Magento awesome? 9. LOTS of undocumented features &conventionsLOTS of bad information out thereLOTS of architecture to scaleLOTS of flexibilityLayout XMLWhat makes Magento difficult? 10. Supressed error output (index.php):Caching on by default (Admin Panel):Disabled output (admin), disabled local codepool (app/etc/local.xml)Getting Started: Dont Forget! 11. Declaration: app/etc/modules/Code pool*Type-specific foldersTheme assetsModules & Module Structure 12. Declaration: app/etc/modules/Points to app/code/core/Mage/Connect/etc/config.xmlAll modules have config, and all config is mergedModules & Module Structure 13. Typical classname-to-path mapping, e.g.: See app/Mage.php & lib/Varien/Autoload.php:app/code/local/, app/code/community/, app/code/core/, lib/ But... Magento is "all about options," so...Typical AutoloadingMage_Catalog_Model_Product_TypeMage/Catalog/Model/Product/Type.php 14. Reading class group notationMage::getModel(catalog/product_type)Mage_Catalog_ModelFactory Methods & Class Groups 15. Allows for rewrites:Mage::getModel(catalog/product_type)New_ClassFactory Methods & Class Groups 16. Mage::getModel() Mage::helper()* Mage::app()->getLayout()->createBlock()See Mage_Core_Model_Config::getGroupedClassName()Thats the M, V, and H... but C worksdifferentlyFactory Methods & Class Groups 17. Standard route matching: / controller / actionSEF rewrites: core_url_rewrite tableControllers 18. Similar cofiguration-based approach, e.g.:Mage/Catalog/etc/config.xmlMaps to Mage/Catalog/controllers/Note: not autoloadedControllers 19. Class rewrite/additional route configuration:Maps to Custom/Module/controllers/Controllers 20. Mage_Core_Model_LayoutFactory method for instantiating blocksGlobal block registryEffectively a singleton, accessed via: $controller->getLayout() Mage::app()->getLayout() $block->getLayout()The View: Layout Object 21. Blocks have two main workflows Instantiation: _construct() & _prepareLayout() Rendering:toHtml(), _beforeToHtml(), _afterToHtml()Blocks are generally responsible forinstantiating data models/collections important for view flexibilityThe View: Blocks 22. Rendering is a waterfall down parent-childrelationships:$parentBlock->getChildHtml(child);$child->getChildHtml(etc);//and so forth...The View: Blocks 23. How do blocks get called in to scope forrendering? In other words, how does stuff getrendered?The View: Blocks 24. Layout XML - up to the developer to use, notuse, mix as needed; keep controllers thin!The View: Layout XML 25. Layout XML - up to the developer to use, notuse, mix as needed; keep controllers thin!public function exampleAction(){$this->loadLayout()->renderLayout();//$this->getResponse()->setBody(Hi!);}The View: Layout XML 26. Declared in module config.xml; all modulelayout XML files are compiled alwaysLayout Update Handles are responsible forlimiting the directives for current scopeFull Action Name handle the missing linkThe View: Layout XML 27. - type, name, as, template - name - name - handle - methodaction allows to call block public methodsThe View: Layout XML 28. Layout update handles: applied via PHP;top-level nodes in layout XML filesBlock type is class group notation:example.jsMage_Page_Block_Html_Head->addJs(example.js);The View: Layout XML 29. Parent-child relationships are established viamarkup in layout XML...The View: Layout XML 30. ...and this relationship is seen in templates aswell:Required for rendering to workThe View: Layout XML 31. Parent-child block relationships can also beset/unset using :contentChild exists, but "outside" of rendering flowThe View: Layout XML 32. Most important thing to understand:Via layout XML any module can affect any viewthrough the full action name handle or otherapplied handle (customer_logged_in, etc.)Lets see some examples from catalog.xmlThe View: Layout XML 33. Config XML is composed of the following: app/etc/*.xml app/etc/modules/*.xml All active module config.xml app/etc/local.xml core_config_data tableConfiguration XML 34. Confusingly accessed/evaluated/built; betterto learn it by applicationImportant top level nodes: global frontend & adminhtml admin default, websites, & stores; often, user-configurable values hereConfiguration XML 35. Website and store scopes are admin-configurable, but affect config DOMstructure (System > Manage Stores)Possible to declare same xpaths in multiplefiles and in core_config_data table* (*fordefault, websites, and stores)Colliding xpath text values are overwrittenwhen mergedConfiguration XML 36. Convenience method for reading correctvalue for store scopesMage::getStoreConfig(foo/bar/baz);//same as...Mage::getConfig()->getNode(stores/[code]/foo/bar/baz);Configuration XML 37. Sometimes its the node name beingevaluated (e.g. module declaration); most ofthe time its the text nodeBottom line, its all about the xpath and thePHP which is evaluating itConfiguration XML 38. System XML is the quickest way to add user-configurable fields to the admin panelDefault values can be set in files or added tocore_config_data via setup scriptsLets look at Mage/Contacts/etc/system.xmlSystem XML 39. Magento CRUD: Create & Update: save() Read: load() Delete: delete()Data model CRUD works through resourcemodel (see Mage_Core_Model_Abstract)The Model Layer: CRUD 40. Hybrid resource / data model classesFiltering, sorting, etc. Lazy loaded.Implement Countable &IteratorAggregate, making it possible to dothis:The Model Layer: Collections 41. Generally the best way to customizeEvents are dispatched throughout core codeAllow to execute code uniformly (e.g. duringrequest dispatching) or during specific flowof execution (catalog_product_load_after)Observers 42. Varien_Object (lib/Varien/Object.php)Basis of blocks and models; formodels, methods map to table columns orattributesget*, set*, uns*, & has*$model->getFooBar()reads from$model->_data[foo_bar]Missing code: when __call strikes 43. Caveat: nothing stops classes from defininggetters, setters, etc.Dont var_dump() objects directly; useVarien_Object->debug() to seeproperties in _dataMissing code: when __callstrikes 44. The action and the template are the mostimportant aspects to deciphering layoutXML; not all blocks use template!Find the block class via typeCheck the definition to see if the method isdeclared or notA simple echo get_class($this) in thetemplate will sufficeMissing code: layout XML 45. Observer configuration can be found mainlyunder the xpathsglobal/events, frontend/events, andadminhtml/eventsMany events are dynamicMultiple observers can be configured for thesame eventMissing code: Observers 46. When an install is not behaving asexpected, check for Mage, Varien, and Zendnamespaces outside of core or libCheck for event observer configuration fortargeted CRUD and reques operationsMissing code: Miscellaneous 47. When content is being rendered with noapparent source in template or entitydata, suspect translations, which can residein translate.csv, app/locale/, or core_translatetable; translate="" & __("Some String")CMS pages, categories, and products allhave custom design settings (themes &layout XML) which are stored in thedatabaseMissing code: Miscellaneous 48. Module code not executing.Is config being merged? Enable developermode & clear cache. Error message indicateseverything is ok. 80% of all problems startwith config.*Troubleshooting Process 49. Unexpected or missing theme-related content.Reset the theme to default to rule out issuesfrom custom templates & layout XML; checkdatabase for layout XML, template, and themesettings. Check parent-child relationships.Troubleshooting Process 50. Class XYZ is not behaving correctly.Check for a config-based rewrite, an includepath override, or an event observer.Collection class/view seems to be slow.Ensure that the collection class is buildingcorrect data and that models are not beingloaded iteratively.Troubleshooting Process 51. Enable profiler in two places: System > Configuration > Developer index.php - uncomment Varien_Profiler::enable()Rudimentary output; read from outside-in tillyou get to the bottom-most entry with longestexecution timeEnable query profiler in config xml atglobal/resources/default_setup/connection/profilerProfiler 52. Enable TPH in admin: System > Configuraration > Developer Change scope from "Default" Pretty ugly, and missing key info (such asalias, name). Check out AOE_TemplateHintsv2.0 Path Hints 53. ben@blueacorn.com 54. 55. Magicento plugin for PhpStorm