INTROVitaly KorotunAssociate Director, Professional Services, Kievvitaly@magento.comТема:Применение Компонентно-Ориентированой Архитектуры для написания  расширений
КРАТКИЙ ОБЗОР Компонентно-Ориентированной Архитектуры
Базовая модель компонентного фреймворка
Преимущества Компонентно-Ориентированной АрхитектурыНезависимость расширенийКомпоненты являются неделимыми единицами системы, компонентная модель предписывает, как именно они должны взаимодействовать, фреймворк регламентирует их архитектуру и предоставляет весь обслуживающий вспомогательный функционал. Улучшение предсказуемости системыКомпонентная модель регламентирует правила проектирования, которые насильственного навязываются всем компонентам. Это означает, что единообразие различных глобальных свойств способствуют увеличению таких качественных показателей, как масштабируемость, безопасность, конфигурируемость и т.д.
Компонент
Компонентная модельКомпонентная модель предписывает то, как компоненты взаимодействуют друг с другом
Задачи, которые решает компонентая модельОднородность композиции
Задачи, которые решает компонентая модельОднородность композиции
Задачи, которые решает компонентая модельОднородность композиции
Компонентный фреймворкМини-операционные системы
Задачи, которые решает компонентный фреймворкСОГЛАСОВАНИЕ и обслуживание РАБОТЫ СИСТЕМЫ
Задачи, которые решает компонентный фреймворкСОГЛАСОВАНИЕ и обслуживание РАБОТЫ СИСТЕМЫ
Задачи, которые решает компонентный фреймворкСОГЛАСОВАНИЕ и обслуживание РАБОТЫ СИСТЕМЫ
ИнтерфейсыИнтерфейсы обеспечивают механизм для контроля зависимостей, которые возникают между модулями системы
КонтрактыКонтракт компонента указывает шаблон (модель) взаимодействия по отношению к этому компоненту
Способы Ожидания светлого будущегоПервый способВторой способВитаем в облакахДействуем
Компонент-ориентированная разработка Magento Extension
Краткий Обзор архитектуры Magento
Определение архитектурыРазличные алгоритмы дают различные значения производительности, различный уровень сложности и приводят к различным уровням головная боли
Определение архитектурыПосылать уведомления удаленному сервису, всякий раз при сохранении продукта?
АнтипаттерныSpy Games
АнтипаттерныКонцепция В систему установлено множество пользовательских модулей и, в основном, все их изменения осуществляются с помощью шаблона “Event-Observer".
 Когда все пользовательские модули делают то, что они должны непосредственно внутри блоков или даже внутри шаблонов.
 Конечно, отсутствие документации.Spy Games
Spy GamesАнтипаттерныДисфункция Приложение сложно отлаживать и трудно тестировать.
 Трудно предсказать сценарий на каждой странице.АнтипаттерныРефакторинг Если вы собираетесь изменять процесс, используйте дополнительный фильтр в контроллере процесса.
 Если вы собираетесь изменить поведение во время какого-то пользовательского действия, лучше всего внедрить логику в контроллере.
 Если вы собираетесь изменять данные, используйте перекрытия моделей или их вспомогательных спутников.Spy Games
АнтипаттерныBuddy Guy
АнтипаттерныКонцепция Экземпляр класса, который делает прямые вызовы в любые объекты, с которыми он "хочет" иметь дело (модели, ресурс модели, блоки) из любого места (блок, контроллер, шаблоны).Buddy Guy
АнтипаттерныДисфункция Устанавливает "скрытые" отношения между модулями, увеличивает сцепление и приводит к проблеме со следующими обновлениями.
 Часто приводит к проблемам с производительностью.Buddy Guy
Antipatterns  by  M.P.S.T. Buddy Guy likes The Anarchy
АнтипаттерныРефакторинг Только помощники и модели могут быть созданы за пределами «родного» модуляBuddy Guy
Компонент-ориентированная разработка Magento ExtensionПерегрузка классов$product = Mage::getModel('catalog/product');<config>    /****/    <global>        <models>            <catalog>                <!-- catalog models class group declaration-->                <class>Mage_Catalog_Model</class>                <!-- catalog resource models class group declaration-->                <resourceModel>catalog_resource_eav_mysql4</resourceModel>            </catalog>        </models>    </global>    /****/</config>
Компонент-ориентированная разработка Magento ExtensionДекларация новой группы  классовclass My_Module_Factory{    public static function getPlugin($pluginClass = '', $arguments = array())    {        $pluginClass = trim($pluginClass);        if (strpos($pluginClass , '/')===false) {            $className = $modelClass;        }        $className = Mage::getConfig()->getGroupedClassName('plugin', $pluginClass);         if (class_exists($className)) {             return new $className($arguments);        } else {            #throw Mage::exception('My_Module', ‘***’);            return false;        }    }}$plugin = My_Module_Factory ::getPlugin(‘my_module/some_class');
Компонент-ориентированная разработка Magento ExtensionПерехват/Переадресация вызовов   <frontend>        <routers>            <checkout>                <args>                    <modules>                        <custom_checkout before="Mage_Checkout">Custom_Checkout</custom_checkout>                    </modules>                </args>            </checkout>        </routers>        <layout>            <updates>                <custom_checkout module="Custom_Checkout">                    <file>custom/checkout.xml</file>                </custom_checkout>            </updates>        </layout>    </frontend>app/code/local/Custom/Checkout/./controllers/OnepageController.phphttp://your-domain.com/checkout/onepage/billinghttp://your-domain.com/checkout/onepage/shippinghttp://your-domain.com/checkout/onepage/customstep
Компонент-ориентированная разработка Magento ExtensionИнтернационализация  (i18n)echo Mage::helper('catalog')->__('Text Message');<frontend>...    <translate>        <modules>            <Mage_Catalog>                <files>                    <default>Mage_Catalog.csv</default>                </files>            </Mage_Catalog>        </modules>    </translate>...</frontend>design/[AREA]/[PACKAGE]/[THEME]/locale/[LOCALE_CODE]./translate.csv
Компонент-ориентированная разработка Magento ExtensionLayout XML<layout>    <default translate="label" module="page">        <block type="page/html" name="root" output="toHtml" template="page/3columns.phtml">            <block type="page/html_head" name="head" as="head">        ...            </block>            <block type="core/text_list" name="content" as="content" translate="label">        ...            </block>            <block type="page/html_footer" name="footer" as="footer" template="page/html/footer.phtml">            ...            </block>        </block>    </default>    ...</layout><layout>    ...   <PRODUCT_TYPE_simple translate="label" module="catalog">        <label>Catalog Product View (Simple)</label>        <reference name="product.info">            <block type="catalog/product_view_type_simple" name="product.info.simple" as="product_type_data" template="catalog/product/view/type/default.phtml">                <block type="core/text_list" name="product.info.simple.extra" as="product_type_data_extra" translate="label">                    <label>Product Extra Info</label>                </block>            </block>        </reference>    </PRODUCT_TYPE_simple>    ...</layout><layout>    ...    <catalog_product_view translate="label">        <reference name="root">            <action method="setTemplate"><template>page/2columns-right.phtml</template></action>        </reference>        <reference name="head">            <action method="addJs"><script>varien/product.js</script></action>        </reference>        <reference name="content">            <block type="catalog/product_view" name="product.info" template="catalog/product/view.phtml">        </reference>    </catalog_product_view>    ...</layout>

Применение компонент-ориентированной архитектуры для написания Magento Extensions

  • 2.
    INTROVitaly KorotunAssociate Director,Professional Services, Kievvitaly@magento.comТема:Применение Компонентно-Ориентированой Архитектуры для написания расширений
  • 3.
  • 4.
  • 5.
    Преимущества Компонентно-Ориентированной АрхитектурыНезависимостьрасширенийКомпоненты являются неделимыми единицами системы, компонентная модель предписывает, как именно они должны взаимодействовать, фреймворк регламентирует их архитектуру и предоставляет весь обслуживающий вспомогательный функционал. Улучшение предсказуемости системыКомпонентная модель регламентирует правила проектирования, которые насильственного навязываются всем компонентам. Это означает, что единообразие различных глобальных свойств способствуют увеличению таких качественных показателей, как масштабируемость, безопасность, конфигурируемость и т.д.
  • 6.
  • 7.
    Компонентная модельКомпонентная модельпредписывает то, как компоненты взаимодействуют друг с другом
  • 8.
    Задачи, которые решаеткомпонентая модельОднородность композиции
  • 9.
    Задачи, которые решаеткомпонентая модельОднородность композиции
  • 10.
    Задачи, которые решаеткомпонентая модельОднородность композиции
  • 11.
  • 12.
    Задачи, которые решаеткомпонентный фреймворкСОГЛАСОВАНИЕ и обслуживание РАБОТЫ СИСТЕМЫ
  • 13.
    Задачи, которые решаеткомпонентный фреймворкСОГЛАСОВАНИЕ и обслуживание РАБОТЫ СИСТЕМЫ
  • 14.
    Задачи, которые решаеткомпонентный фреймворкСОГЛАСОВАНИЕ и обслуживание РАБОТЫ СИСТЕМЫ
  • 15.
    ИнтерфейсыИнтерфейсы обеспечивают механизмдля контроля зависимостей, которые возникают между модулями системы
  • 16.
    КонтрактыКонтракт компонента указываетшаблон (модель) взаимодействия по отношению к этому компоненту
  • 17.
    Способы Ожидания светлогобудущегоПервый способВторой способВитаем в облакахДействуем
  • 18.
  • 19.
  • 20.
    Определение архитектурыРазличные алгоритмыдают различные значения производительности, различный уровень сложности и приводят к различным уровням головная боли
  • 21.
    Определение архитектурыПосылать уведомленияудаленному сервису, всякий раз при сохранении продукта?
  • 22.
  • 23.
    АнтипаттерныКонцепция В системуустановлено множество пользовательских модулей и, в основном, все их изменения осуществляются с помощью шаблона “Event-Observer".
  • 24.
    Когда всепользовательские модули делают то, что они должны непосредственно внутри блоков или даже внутри шаблонов.
  • 25.
    Конечно, отсутствиедокументации.Spy Games
  • 26.
    Spy GamesАнтипаттерныДисфункция Приложениесложно отлаживать и трудно тестировать.
  • 27.
    Трудно предсказатьсценарий на каждой странице.АнтипаттерныРефакторинг Если вы собираетесь изменять процесс, используйте дополнительный фильтр в контроллере процесса.
  • 28.
    Если высобираетесь изменить поведение во время какого-то пользовательского действия, лучше всего внедрить логику в контроллере.
  • 29.
    Если высобираетесь изменять данные, используйте перекрытия моделей или их вспомогательных спутников.Spy Games
  • 30.
  • 31.
    АнтипаттерныКонцепция Экземпляр класса,который делает прямые вызовы в любые объекты, с которыми он "хочет" иметь дело (модели, ресурс модели, блоки) из любого места (блок, контроллер, шаблоны).Buddy Guy
  • 32.
    АнтипаттерныДисфункция Устанавливает "скрытые"отношения между модулями, увеличивает сцепление и приводит к проблеме со следующими обновлениями.
  • 33.
    Часто приводитк проблемам с производительностью.Buddy Guy
  • 34.
    Antipatterns by M.P.S.T. Buddy Guy likes The Anarchy
  • 35.
    АнтипаттерныРефакторинг Только помощникии модели могут быть созданы за пределами «родного» модуляBuddy Guy
  • 36.
    Компонент-ориентированная разработка MagentoExtensionПерегрузка классов$product = Mage::getModel('catalog/product');<config>    /****/    <global>        <models>            <catalog>                <!-- catalog models class group declaration-->                <class>Mage_Catalog_Model</class>                <!-- catalog resource models class group declaration-->                <resourceModel>catalog_resource_eav_mysql4</resourceModel>            </catalog>        </models>    </global>    /****/</config>
  • 37.
    Компонент-ориентированная разработка MagentoExtensionДекларация новой группы классовclass My_Module_Factory{    public static function getPlugin($pluginClass = '', $arguments = array())    {        $pluginClass = trim($pluginClass);        if (strpos($pluginClass , '/')===false) {            $className = $modelClass;        }        $className = Mage::getConfig()->getGroupedClassName('plugin', $pluginClass);         if (class_exists($className)) {             return new $className($arguments);        } else {            #throw Mage::exception('My_Module', ‘***’);            return false;        }    }}$plugin = My_Module_Factory ::getPlugin(‘my_module/some_class');
  • 38.
    Компонент-ориентированная разработка MagentoExtensionПерехват/Переадресация вызовов <frontend>        <routers>            <checkout>                <args>                    <modules>                        <custom_checkout before="Mage_Checkout">Custom_Checkout</custom_checkout>                    </modules>                </args>            </checkout>        </routers>        <layout>            <updates>                <custom_checkout module="Custom_Checkout">                    <file>custom/checkout.xml</file>                </custom_checkout>            </updates>        </layout>    </frontend>app/code/local/Custom/Checkout/./controllers/OnepageController.phphttp://your-domain.com/checkout/onepage/billinghttp://your-domain.com/checkout/onepage/shippinghttp://your-domain.com/checkout/onepage/customstep
  • 39.
    Компонент-ориентированная разработка MagentoExtensionИнтернационализация (i18n)echo Mage::helper('catalog')->__('Text Message');<frontend>...    <translate>        <modules>            <Mage_Catalog>                <files>                    <default>Mage_Catalog.csv</default>                </files>            </Mage_Catalog>        </modules>    </translate>...</frontend>design/[AREA]/[PACKAGE]/[THEME]/locale/[LOCALE_CODE]./translate.csv
  • 40.
    Компонент-ориентированная разработка MagentoExtensionLayout XML<layout>    <default translate="label" module="page">        <block type="page/html" name="root" output="toHtml" template="page/3columns.phtml">            <block type="page/html_head" name="head" as="head">        ...            </block>            <block type="core/text_list" name="content" as="content" translate="label">        ...            </block>            <block type="page/html_footer" name="footer" as="footer" template="page/html/footer.phtml">            ...            </block>        </block>    </default>    ...</layout><layout>    ...   <PRODUCT_TYPE_simple translate="label" module="catalog">        <label>Catalog Product View (Simple)</label>        <reference name="product.info">            <block type="catalog/product_view_type_simple" name="product.info.simple" as="product_type_data" template="catalog/product/view/type/default.phtml">                <block type="core/text_list" name="product.info.simple.extra" as="product_type_data_extra" translate="label">                    <label>Product Extra Info</label>                </block>            </block>        </reference>    </PRODUCT_TYPE_simple> ...</layout><layout>    ...    <catalog_product_view translate="label">        <reference name="root">            <action method="setTemplate"><template>page/2columns-right.phtml</template></action>        </reference>        <reference name="head">            <action method="addJs"><script>varien/product.js</script></action>        </reference>        <reference name="content">            <block type="catalog/product_view" name="product.info" template="catalog/product/view.phtml">        </reference>    </catalog_product_view>    ...</layout>