Реализация шаблонов корпоративных приложений в Magento

3,067 views
2,944 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,067
On SlideShare
0
From Embeds
0
Number of Embeds
1,704
Actions
Shares
0
Downloads
17
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Реализация шаблонов корпоративных приложений в Magento

  1. 1. ТуликаЕвгений<br />Magento Developer<br />Professional Services Team<br />evgeniy.tulika@magento.com<br />Шаблоныкорпоративных приложений в Magento<br />
  2. 2. Шаблоны. Почему о них говорят?<br />B<br />C<br />Craig <br />Larman<br />Шаблоны не содержат новых идей<br />Шаблоны имеют имена<br />D<br />Шаблоны облегчают общение<br />
  3. 3. Domain Logic<br />Object-Relational<br /> Behavior<br />Data Source<br />Architecture<br />Transaction Script<br />Domain Model<br /><ul><li>Identity Map
  4. 4. Lazy Load
  5. 5. Data Mapper
  6. 6. Table Data Gateway
  7. 7. Active Record</li></li></ul><li>Представлениебизнес-логики<br />Простой путь: декомпозиция по действиям<br />AccountActions<br />+ Login<br />+ Register<br />+ Logout<br />+ ShowAccount<br />CheckoutActions<br />+ addToCart<br />+ showCheckout<br />+ submitCheckout<br />
  8. 8. Transaction Script<br />Каждая операция реализована своим методом<br />public function addToCart()<br />{<br /> //retrieve user data from session<br /> //retrieve product from database<br /> //add product information to quote<br /> //…<br /> //…<br /> //save quote data to database <br />} <br />
  9. 9. Объектами представлены реальные сущности<br />Domain Model<br />Business Logic Layer<br />Order<br />Category<br />Product<br />Quote<br />Payment<br />Cart<br />Customer_Address<br />Customer<br />
  10. 10. Расслоение. А как в Magento?<br />Service Layer<br />Domain Models<br />Sales<br />|--Block<br />|--controllers<br />|--etc<br />|--Helper<br />|--Model<br />| |--Mysql4<br />| |-- Billing<br />| |-- Entity<br />| |-- Payment<br />| |-- Order.php<br />| |-- Quote.php<br />Data Mappers<br />Data Access Objects<br />
  11. 11. Mapping Objects to Data Source<br />
  12. 12. Data Mapper<br />/*Осуществляет передачу данных между объектами и базой <br />данных, сохраняя их независимыми друг от друга и от самого <br />маппера*/<br />Data<br />Models<br />
  13. 13. Zend Way<br />Matthew<br />Weier<br />O’Phinney<br /><?php<br />class App_Model_UserDataMapper<br />{<br />public function save(App_Model_User$user)<br /> {<br />$dao= $this->getDao();<br />$id = $user->getId();<br /> if (!$id) {<br />$id = $dao->insert($user->toArray()); <br /> } else {<br />$dao->update($user->toArray(),<br /> array(‘id=?’, $id)); <br /> }<br />$record = $dao->find($id)->current();<br />$user->setOptions($record->toArray());<br /> return $user;<br />} <br />
  14. 14. Вернемся к Magento<br />Ресурс-модели<br /><global><br />    <models><br /> <sales><br /> <class>Mage_Sales_Model</class><br /> <resourceModel>sales_mysql4</resourceModel> <br /> </sales> <br /> <sales_mysql4><br /> <class>Mage_Sales_Model_Mysql4</class><br /> <sales_mysql4><br /> <sales><br /> <models><br />    <!-- ... --><br /></global><br />Sales<br />|--Block<br />|--controllers<br />|--etc<br />|--Helper<br />|--Model<br />| |--Mysql4<br />| | |--Order.php<br />| | |--Quote.php<br />| |-- Billing<br />| |-- Entity<br />| |-- Payment<br />| |-- Order.php<br />| |-- Quote.php<br />Mage::getResourceModel('sales/order');<br /> ->load($order, $id, $field);<br />
  15. 15. Mage_Core_Model_Mysql4_Abstract<br />public function load(Mage_Core_Model_Abstract $object, $value, $field=null)<br />{<br />    if (is_null($field)) {<br />        $field = $this->getIdFieldName();<br />    }<br />    $read = $this->_getReadAdapter();<br />    if ($read && !is_null($value)) {<br />        $select = $this->_getLoadSelect($field, $value, $object);<br />        $data = $read->fetchRow($select);<br />         if ($data) {<br />            $object->setData($data);<br />        }<br />    }<br />    $this->_afterLoad($object);<br /> <br />    return $this;<br />}<br />
  16. 16. Структура ресурс-модели<br />Mage_Core_Model_Resource_Abstract<br />#_getWriteAdapter()<br />#_getReadAdapter()<br />+ beginTrasnsaction()<br />Mage_Core_Model_Mysql4_Abstract<br />+ getMainTable()<br />+ load()<br />+ save()<br />+ delete()<br />#_prepareDataForTable()<br />
  17. 17. Отличия от классики<br />Доменные модели знают о своих ресурс-моделях<br />Mage_Sales_Model_Order<br />public function getProductIds() <br />{ <br /> $ids = $this->getData('product_ids'); <br /> if (is_null($ids)) { <br />$ids = $this->_getResource()->getProductIds($this); <br />$this->setProductIds($ids); <br /> } <br /> return $ids; <br />}<br />
  18. 18. Lazy and Eager Loading<br /><ul><li>Все данные есть под рукой
  19. 19. Может потребоваться слишком много обращений к базе
  20. 20. Может загрузить излишне много данных
  21. 21. Все данные есть под рукой</li></li></ul><li>Lazy Loading in Magento<br />Mage_Sales_Model_Order<br />public function getAddressesCollection() <br />{ <br />if (is_null($this->_addresses)) { <br />$this->_addresses = Mage::getResourceModel('sales/order_address_collection') <br />->setOrderFilter($this); <br />if ($this->getId()) { <br />foreach ($this->_addresses as $address) { <br />$address->setOrder($this); <br />} <br />} <br />} <br />return $this->_addresses; <br />}<br />
  22. 22. Альтернативы. Table Data Gateway<br />Model_DbTable<br />_Person<br />+find()<br />+findWithName()<br />+update()<br />+insert()<br />+delete()<br />Model_Person<br />+getName()<br />+getAddress()<br />+sendEmail()<br />+addFriend()<br />+getFRiendSuggestions()<br />
  23. 23. Альтернативы. Active Record<br />Model_Person<br />+getName()<br />+getAddress()<br />+sendEmail()<br />+addFriend()<br />+getFriendSuggestions()<br />+find()<br />+findWithName()<br />+update()<br />+insert()<br />+delete()<br />
  24. 24. Коллекции. Identity Map<br />Identity Map<br />empty<br />getElement(green)<br />find()<br />Identity Map<br />load()<br />return( )<br />
  25. 25. Magento Collections<br />Ресурс-коллекции<br />Sales<br />|--Model<br />| |--Mysql4<br />| | |-- Collection<br />| | | | -- Abstract.php<br />| | | -- Report<br />| | | | -- Collection.php<br />| | |--Order.php<br />| | |--Quote.php<br />| |-- Billing<br />| |-- Entity<br />| |-- Payment<br />| |-- Order.php<br />| |-- Quote.php<br />Mage::getResourceModel('sales/order_collection')<br /> ->addFieldToSelect(‘*‘)<br /> ->setOrder(‘created_at‘, ‘desc');<br />$children = $this->getResourceCollection()<br /> ->setOrderFilter($orderFilter)<br /> ->addPaymentIdFilter($paymentId)<br /> ->addParentIdFilter($this->getId());<br />
  26. 26. Структура коллекции<br />Countable<br />Varien_Data_Collection<br />+getItemsByColumnValue()<br />+addItem()<br />+walk()<br />IteratorAggregate<br />Mage_Core_Model_Mysql4<br />_Collection_Abstract<br />+addFiedToSelect()<br />+setModel()<br />+setResourceModel()<br />+save()<br />Varien_Data_Collection_Db<br />+isLoaded()<br />+load()<br />#_loadCache()<br />#_saveCache()<br />
  27. 27. Thank You.<br />evgeniy.tulika@magento.com<br />

×