Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Finding Your Way: Understanding Magento Code


Published on

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

  • Be the first to comment

Finding Your Way: Understanding Magento Code

  1. 1. {Finding Your WayUnderstanding Magento Code // @benmarks
  2. 2. Ben Marks4.5 years doing Magento dev2 years as a Magento U instructorHappily employed at Blue Acorn inCharleston, SC (were hiring!)Big fan of questions (ask away)Who am I?
  3. 3. Who knows Magento?Who are you?
  4. 4. Who knows Magento?Who hates Magento?Who are you?
  5. 5. Who knows Magento?Who hates Magento?Who doesnt know Magento, but has beentold that they should hate it?Who are you?
  6. 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. 7. ZF1-based MVC frameworkeCommerce ApplicationAnswer to osCommerceWhat is Magento?
  8. 8. LOTS of businessLOTS of developer community membersLOTS of room for innovationLOTS of flexibilityLayout XMLWhat makes Magento awesome?
  9. 9. LOTS of undocumented features &conventionsLOTS of bad information out thereLOTS of architecture to scaleLOTS of flexibilityLayout XMLWhat makes Magento difficult?
  10. 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. 11. Declaration: app/etc/modules/Code pool*Type-specific foldersTheme assetsModules & Module Structure
  12. 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. 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. 14.  Reading class group notationMage::getModel(catalog/product_type)<config><global><models><catalog><class>Mage_Catalog_ModelFactory Methods & Class Groups
  15. 15.  Allows for rewrites:Mage::getModel(catalog/product_type)<config><global><models><catalog><rewrite><product_type>New_ClassFactory Methods & Class Groups
  16. 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. 17. Standard route matching: / controller / actionSEF rewrites: core_url_rewrite tableControllers
  18. 18. Similar cofiguration-based approach, e.g.:Mage/Catalog/etc/config.xmlMaps to Mage/Catalog/controllers/Note: not autoloadedControllers
  19. 19. Class rewrite/additional route configuration:Maps to Custom/Module/controllers/Controllers
  20. 20. Mage_Core_Model_LayoutFactory method for instantiating blocksGlobal block registryEffectively a singleton, accessed via: $controller->getLayout() Mage::app()->getLayout() $block->getLayout()The View: Layout Object
  21. 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. 22. Rendering is a waterfall down parent-childrelationships:$parentBlock->getChildHtml(child);$child->getChildHtml(etc);//and so forth...The View: Blocks
  23. 23. How do blocks get called in to scope forrendering? In other words, how does stuff getrendered?The View: Blocks
  24. 24. Layout XML - up to the developer to use, notuse, mix as needed; keep controllers thin!The View: Layout XML
  25. 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. 26. Declared in module config.xml; all modulelayout XML files are compiled alwaysLayout Update Handles are responsible forlimiting the directives for current scopeFull Action Name handle – the missing linkThe View: Layout XML
  27. 27. <contacts_index_index /><block /> - type, name, as, template<reference /> - name<remove /> - name<update /> - handle<action /> - methodaction allows to call block public methodsThe View: Layout XML
  28. 28. Layout update handles: applied via PHP;top-level nodes in layout XML filesBlock type is class group notation:<block type="page/html_head"><action method="addJs"><file>example.js</file>Mage_Page_Block_Html_Head->addJs(example.js);The View: Layout XML
  29. 29. Parent-child relationships are established viamarkup in layout XML...The View: Layout XML
  30. 30. ...and this relationship is seen in templates aswell:Required for rendering to workThe View: Layout XML
  31. 31. Parent-child block relationships can also beset/unset using <action />:<reference name="root"><action method="unsetChild"><child>content</child></action></reference>Child exists, but "outside" of rendering flowThe View: Layout XML
  32. 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. 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. 34. Confusingly accessed/evaluated/built; betterto learn it by applicationImportant top level nodes: global frontend & adminhtml admin default, websites, & stores; often, user-configurable values hereConfiguration XML
  35. 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. 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. 37. Sometimes its the node name beingevaluated (e.g. module declaration); most ofthe time its the text nodeBottom line, its all about the xpath and thePHP which is evaluating itConfiguration XML
  38. 38. System XML is the quickest way to add user-configurable fields to the admin panelDefault values can be set in files or added tocore_config_data via setup scriptsLets look at Mage/Contacts/etc/system.xmlSystem XML
  39. 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. 40. Hybrid resource / data model classesFiltering, sorting, etc. Lazy loaded.Implement Countable &IteratorAggregate, making it possible to dothis:The Model Layer: Collections
  41. 41. Generally the best way to customizeEvents are dispatched throughout core codeAllow to execute code uniformly (e.g. duringrequest dispatching) or during specific flowof execution (catalog_product_load_after)Observers
  42. 42. Varien_Object (lib/Varien/Object.php)Basis of blocks and models; formodels, methods map to table columns orattributesget*, set*, uns*, & has*$model->getFooBar()reads from$model->_data[foo_bar]Missing code: when __call strikes
  43. 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. 44. The action and the template are the mostimportant aspects to deciphering layoutXML; not all blocks use template!Find the block class via typeCheck the definition to see if the method isdeclared or notA simple echo get_class($this) in thetemplate will sufficeMissing code: layout XML
  45. 45. Observer configuration can be found mainlyunder the xpathsglobal/events, frontend/events, andadminhtml/eventsMany events are dynamicMultiple observers can be configured for thesame eventMissing code: Observers
  46. 46. When an install is not behaving asexpected, check for Mage, Varien, and Zendnamespaces outside of core or libCheck for event observer configuration fortargeted CRUD and reques operationsMissing code: Miscellaneous
  47. 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. 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. 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. 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. 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 timeEnable query profiler in config xml atglobal/resources/default_setup/connection/profilerProfiler
  52. 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. 53. 
  54. 54. 
  55. 55. Magicento plugin for PhpStormn98-magerun:Feedback: