Статьи

Основы Magento, поток запросов, стандарты и лучшие практики

В настоящее время компании все чаще переводят свой бизнес в онлайн. Они решили сосредоточить свое внимание на онлайн-общении, чтобы оставаться ближе к своим потенциальным покупателям, использовать социальные веб-сайты для информирования людей о своих продуктах / услугах и, наконец, найти обходной путь, который предоставляет людям процесс покупки. прямо из дома, с работы или из любого места, где есть интернет.

Magento — одно из решений для электронной коммерции, которое завоевало доверие многих компаний. Он поддерживает малый бизнес, но также масштабируется до больших размеров.

Наряду с расширением электронной коммерции возникла необходимость в специалистах для поддержания и настройки функций для их конкретной инфраструктуры магазина.

В этой статье мы обсудим начальный шаг, который должен выполнить разработчик, чтобы ознакомиться со структурой Magento и быть готовым начать добавлять пользовательские функции.

Основы Magento

Бесплатную версию Magento Community Edition можно скачать здесь , на официальном сайте Magento.

Предполагая, что мы уже настроили виртуальный хост в локальной среде и извлекли Magento в нужную папку, перед запуском установщика необходимо правильно установить права доступа к файлу. Вот шаги:

  • установить все каталоги и подкаталоги из приложения на 775

  • установить все файлы на 644

  • установите каталог app / etc / и все его файлы и подкаталоги в 777

  • установить каталог var / и все его файлы и подкаталоги в 777

  • установить каталог СМИ и все его файлы и подкаталоги на 777

В системе Linux вы можете добиться всего этого, введя следующие команды в вашей папке Magento:

find . -type d -exec chmod 775 {} \; find . -type f – exec chmod 644 {} \; chmod 777 -R app/etc/ chmod 777 -R var/ chmod 777 -R media/` 

После того, как установщик заработает, права доступа к файлам из app/etc должны быть изменены обратно — каталоги на 775 и файлы на 644, из соображений безопасности.

Кодовые пулы

Модули находятся в app/code/ в существующих пулах кода: ядро, сообщество (не рекомендуется) и локально.

Каждый модуль имеет соответствующую конфигурацию в .xml файле в app/etc/modules/ и определил синтаксис, такой как <codePool>local</codePool> из которого Mage_Core_Model_ConfiggetModuleDir() будет указывать путь к модулю.

Модульная структура

блок

Файлы в этой папке наследуют или загружают данные и передают их в шаблоны из вашей темы (файлы .phtml).

контроллеры

Контроллеры представляют бизнес-логику, содержащую конкретные действия, которые соответствуют данному запросу (методы dispatch (), preDispatch (), postDispatch ()) и делегируют команды другим частям системы.

помощник

В каталоге Helper вы можете создавать файлы классов с помощью служебных методов, методов синтаксического анализа и других обычно полезных методов для вашего магазина, которые обычно используются всей системой. Методы, объявленные в помощниках, могут быть вызваны из любого файла шаблона или блока, модели или контроллера. Magento возвращает единичный экземпляр для вспомогательных классов.

контроллер

В этом каталоге могут быть определены маршруты, используемые для сопоставления действия контроллера-модуля на основе запроса, уровней шаблонов для классов контроллеров и т. Д. Например, см. Модуль «Paypal».

модель

Обычно содержит классы, которые соответствуют таблицам базы данных. Модели могут использоваться как обычные модели, которые используют два класса ресурсов (один для чтения и один для записи) для связи с базой данных, модели ресурсов, используемые для подготовки данных запроса для связи с базой данных, модели услуг, используемые в качестве автономных классов, которые определяют поток процесса, вспомогательные модели используются в качестве отдельных классов с отдельными методами для вычисления более сложных алгоритмов, чем обычные помощники, и так далее.

и т.д

Содержит конфигурации поведения модуля. Каждый модуль должен иметь как минимум файл config.xml и объявлять пути для моделей, блоков, помощников, маршрутизаторов и т. Д.

SQL

Каждый модуль может идти вместе с установщиками sql для подготовки объектов базы данных. Установщики имеют имя группы, определенное в каждом module/etc/config.xml и каждый установщик sql имеет версию для целей итерации заказа.

данные

Практически такой же функциональный оператор, как у установщиков sql, но с другой областью применения: не будет создавать / обновлять схемы и атрибуты таблиц, вместо этого он будет обновлять существующие записи или заполнять таблицы базы данных записями по умолчанию.

доктор

Папка, посвященная документации и объяснениям модуля.

Шаблоны и макет

Макет в Magento хранится в app/design/ и имеет четко определенную структуру для стандартных и пользовательских тем. Загрузка иерархии в пределах ее приоритета и существования файла начинается с пользовательской темы. Если файл не найден, он будет искать файл .phtml в теме по умолчанию, а если он все еще не найден, последним путем поиска будет базовая тема.

Magento устанавливает структуру тем в высокоуровневых областях, таких как adminhtml (шаблоны системного администрирования), frontend (видимый шаблон для конечного пользователя), установщик (шаблоны для вспомогательной системы, которая будет автоматически настраивать магазин).

Каждая тема имеет папку «layout» с файлами .xml (обычно каждый модуль имеет свой собственный указанный файл конфигурации макета), который определяет блок содержимого для действия контроллера.

Настраиваемая тема также может содержать папку под названием «locales», в которой будет храниться файл «translate.csv», в котором хранятся все пользовательские переводы, или даже заменяются существующие, уже определенные в стандартном Magento.

Скин и Javascript

CSS-файлы, изображения и пользовательский JS находятся в каталоге skin/ и реализуют ту же структуру тем и приоритет загрузки, что и для Templates and Layout ( skin/area_name/package_name — пользовательское пространство имен может быть определено или является base или по default/theme_name ) ,

Соглашения об именах классов

Magento применяет базовое, хотя и устаревшее соглашение об именах классов Zend, и использует Varien_Autoload::register() для автозагрузки классов, заменяя ‘_’ в имени разделителем каталогов, чтобы найти путь включения в файл. Это очень примитивно, но из-за обратной совместимости не может быть решено раньше — Magento 2 будет использовать ZF2, современный PHP и пространства имен.

Поток запросов

Давайте посмотрим, как приложение Magento обрабатывает запрос, начиная с основного файла index.php .

Инициализация приложения

1) Если вы используете Nginx, вы должны следовать руководству по настройке . Если вы используете Apache, это правила перезаписи для .htaccess из основного каталога приложения, которые не должны быть пропущены.

Перепишите правила для скинов, носителей, каталогов JS, чтобы разрешить загрузку файлов и, если не найдено, вернуть 404. Все остальное переписывается в index.php:

 <IfModule mod_rewrite.c> ############################################ ## enable rewrites Options +FollowSymLinks RewriteEngine on ############################################ ## always send 404 on missing files in these folders RewriteCond %{REQUEST_URI} !^/(media|skin|js)/ ############################################ ## never rewrite for existing files, directories and links RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l ############################################ ## rewrite everything else to index.php RewriteRule .* index.php [L] </IfModule> 

2) Это шаги, которые следует приложению при инициализации:

  • запустить файл index.php app/Mage.php входит app/Mage.php

  • вызовите Mage::run($mageRunCode, $mageRunType)

  • в ‘run’ мы загружаем Varien Events Collection, класс Mage_Core_Model_Config и класс Mage_Core_Model_App

  • Mage_Core_Model_App::run() запущен

  • загрузить файлы конфигурации из app/etc/modules

  • загрузить конфигурационные xml-файлы внутри модулей app/code/{code pool}/{module name}/etc/config.xml

  • инициализировать текущий магазин

  • инициализировать объект запроса

  • запустить sql и установщики данных

  • обновить / создать версии модулей в core_resource

  • Mage_Core_Controller_Varien_Front::dispatch(); фронт-контроллера — Mage_Core_Controller_Varien_Front::dispatch();

  • собирать маршрутизаторы из конфигурации по области и коду маршрута

  • использовать маршруты в соответствии с контроллером

  • если контроллер и действие будут сопоставлены, файл контроллера будет включен, создан и будет вызван метод действия

  • Метод действия будет создавать экземпляры и вызывать методы на моделях в зависимости от запроса

  • контроллер действий Varien будет вызывать объект макета

  • этот объект макета создаст список объектов блока, которые действительны для этого запроса, на основе некоторых переменных запроса и системных свойств (также известных как «дескрипторы»)

  • Файлы шаблонов (.phtml) назначаются в файле макета XML для каждого блока.

  • _prepareLayout() метод _prepareLayout() где на основе структуры XML макета действия создаются конкретные блоки в связанных файлах .phtml.

  • _toHtml() метод запускается для генерации HTML

  • выходной HTML

Фронт контроллер

1) свойства и роль Front Controller:

  • путь к каталогу: app/code/core/Mage/Core/Controller/Varien/Front.php

  • базовая роль: получать все запросы из браузера и возвращать HTML-код

  • Фронт-контроллер использует маршруты системы для соответствия классу контроллера и его методу действия

  • Маршрутизаторы Magento по умолчанию: Стандартный (класс Mage_Core_Controller_Varien_Router_Standard ), Администратор (класс Mage_Core_Controller_Varien_Router_Admin ), По умолчанию (класс Mage_Core_Controller_Varien_Router_Default )

Вот пример определенного маршрута в /etc/config.xml модуля Customer:

 <routers> <customer> <use>standard</use> <args> <module>Mage_Customer</module> <frontName>Customer</frontName> </args> </customer> </routers> 

2) события, которые запускает Front Controller:

  • controller_front_init_before

  • controller_front_init_routers

  • controller_front_send_response_before

  • controller_front_send_response_after

URL переписывает

Структура URL / обработка в Magento.

Ссылка в Magento имеет следующую структуру:

https://user:password@host:443/{base_path}/{base_script}/{storeview_path}/{module_front_name}/{controller_name}/{action_name}/{param1}/{value1}?{ query_param=query_value#fragment}

  • user:password@host:443/{base_path}/{base_script} : путь к файлу Script, который запускает Magento. Обычно это файл index.php или путь, который использует правила перезаписи доступа к index.php

  • {storeview_path} : код представления магазина будет использоваться, если веб-сайт имеет модель просмотра нескольких магазинов (например, поддержка нескольких языков, отмеченная в URL)

  • {module_front_name}/{controller_name}/{action_name} : путь к контроллеру модуля и метод действия

  • {param1}/{value1} : имя и значение параметра, отправленного URL

  • ?query_param=query_value#fragment : запрос параметров, отправленный через стандартный запрос GET

Приведенная выше ссылка будет проходить через следующие файлы, каждый из которых будет соответствовать схеме для URL-адреса, и вызовет правильное действие module-controller-action для вывода содержимого:

  • app/Mage.php (Mage::app()->run())

  • app/code/core/Mage/Core/Model/App.php

  • Контроллер $this->getFrontController()->dispatch(); и диспетчеризации $this->getFrontController()->dispatch();

  • app/code/core/Mage/Core/Controller/Varien/Front.php

  • выберите определенный маршрутизатор из config.xml чтобы он соответствовал действию модуля-контроллера $router->match($this->getRequest())

    • app/code/core/Mage/Core/Controller/Varien/Router/Admin.php
    • app/code/core/Mage/Core/Controller/Varien/Router/Standard.php
    • app/code/core/Mage/Core/Controller/Varien/Router/Default.php
  • app/code/core/Mage/Core/Controller/Varien/Action.php

  • вызвать метод Action (пример: indexAction() )

Процесс перезаписи URL

URL переписывается в следующих случаях:

  • перезапись основного ядра: имея приоритет над маршрутизаторами, попытается преобразовать пользовательский путь запроса в стандартный путь module/controller/action на основе определенных строк в базе данных (таблица core_url_rewrite )

  • перезапись имени модуля: переднее имя будет определено в Mage_Customer config.xml модуля для перезаписи фактического пути и имени (пример: Mage_Customer будет сопоставляться по URL-адресу через его определенное переднее имя «клиент»)

  • Пользовательские маршрутизаторы будут переписывать URL-адрес (в основном используется для целей SEO): примером Magento по умолчанию будет модуль CMS, который будет сопоставлять URL-идентификатор, такой как homepage.html с модулем ‘Mage_Cms’, контроллером ‘Page’, действием ‘View ‘и идентификатор параметра, который будет соответствовать строке сущности cms в базе данных.

Стандарты и лучшие практики

Пример конфигурации xml

Это пример модуля config.xml (путь: {base_app_folder}/app/local/{module_name}/etc/config.xml ), который включает в себя основную конфигурацию:

 <?xml version="1.0"?> <config> <modules> <{{localnamespaceC}}_{{modulenameC}}> <version>0.1.0</version> </{{localnamespaceC}}_{{modulenameC}}> </modules> <global> <models> <{{localnamespaceL}}_{{modulenameL}}> <class>{{localnamespaceC}}_{{modulenameC}}_Model</class> </{{localnamespaceL}}_{{modulenameL}}> </models> <resources> <{{localnamespaceL}}_{{modulenameL}}_setup> <setup> <module>{{localnamespaceC}}_{{modulenameC}}</module> </setup> <connection> <use>core_setup</use> </connection> </{{localnamespaceL}}_{{modulenameL}}_setup> </resources> <blocks> <{{localnamespaceL}}_{{modulenameL}}> <class>{{localnamespaceC}}_{{modulenameC}}_Block</class> </{{localnamespaceL}}_{{modulenameL}}> </blocks> <helpers> <{{localnamespaceL}}_{{modulenameL}}> <class>{{localnamespaceC}}_{{modulenameC}}_Helper</class> </{{localnamespaceL}}_{{modulenameL}}> </helpers> </global> <frontend> <routers> <{{localnamespaceL}}_{{modulenameL}}> <use>standard</use> <args> <module>{{localnamespaceC}}_{{modulenameC}}</module> <frontName>{{modulenameL}}</frontName> </args> </{{localnamespaceL}}_{{modulenameL}}> </routers> <layout> <updates> <{{localnamespaceL}}_{{modulenameL}} module="{{localnamespaceC}}_{{modulenameC}}"> <file>{{modulenameL}}.xml</file> </{{localnamespaceL}}_{{modulenameL}}> </updates> </layout> </frontend> </config> 

Условные обозначения:

  • localnamespaceC и localnamespaceL — это имя выбранной вами директории пространства имен в app / local / {namespace} (C для первой буквы слова в верхнем регистре и L для нижнего регистра)

  • modulenameC и modulenameL — это имя вашего модуля в приложении / local / {namespace} / {modulename}

Фабричные методы Magento

Magento использует фабричные методы для создания экземпляров моделей, помощников и блоков. Методы:

  • Mage::getModel('{module}/{path to file in model directory}') — возвращает экземпляр класса в каталоге Model

  • Mage::helper('{module}/{path to file in helper directory}') — возвращает одноэлементный экземпляр класса в каталоге Helper

  • Mage::getSingleton('{module}/path to file in model directory') — возвращает одноэлементный экземпляр класса в каталоге Model

  • Mage::getResourceModel('{module}/{path to file in model/resource directory}') — возвращает экземпляр класса в каталоге Model / Resource.

  • Mage::getBlockSingleton('{module}/{path to file in block directory}') — возвращает одноэлементный экземпляр класса в каталоге Block после инициализации макета для действия контроллера.

Переписывая ядро

Архитектура Magento предлагает несколько способов переписать основные файлы. Давайте посмотрим, что они есть, и перечислим некоторые плюсы и минусы:

а) переписать файл, создав аналогичный путь к каталогу и имя файла в «локальном» пуле кода

  • вам нужно скопировать весь класс со всеми его свойствами, даже если нужно изменить одну строку кода (недостаток)

  • если файл также переопределен в пользовательском модуле, отслеживание внесенных изменений ранее может быть потеряно из-за того, что оно не соответствует стандартным разработчикам.

б) переписать файл в пользовательском модуле ( local/MyNamespace/MyCustomModule/ ) и создать подкаталог с именем основного модуля и добавить исходное дерево подкаталогов (например, local / MyNamespace / MyCustomModule / Model / Core / Rewrite.php).

  • переопределение файла в пользовательском имени модуля и отсутствие использования имени модуля Magento для этой цели также может сбить с толку разработчиков, и отслеживание этих изменений может быть потеряно при добавлении еще одной перезаписи в другом месте. Однако, добавив конфигурацию модуля (в app/etc/modules/MyCustomModule.xml ), чтобы пометить зависимость от модуля Mage_Core вы можете Mage_Core разработчиков о том, что файл был переписан.

c) переписать файл в пользовательском модуле с именем модуля Magento и сохранить путь (например, local/MyNamespace/Core/Model/Rewrite.php )

  • этот метод перезаписи наиболее понятен, так как разработчики могут отслеживать изменения в соответствии с соглашением об именах.

  • будет поощрять других разработчиков, работающих на той же стороне, расширять уже измененную функциональность и не отменять ее

  • Небольшой недостаток этого метода перезаписи состоит в том, что количество модулей в выбранном пространстве имен будет расти вместе с каждым файлом, который переопределяется из разных модулей Magento.

Зависимость между модулями

а) при расширении модуля ядра Magento необходимо настроить зависимость между модулями

например, app/etc/modules/MyNamespace_Customer.xml :

 <MyNamespace_Customer> <active>true</active> <codePool>local</codePool> <priority>1</priority> <depends> <Mage_Customer/> </depends> </MyNamespace_Customer> 

b) при создании установщика sql или установщика данных в пользовательском модуле, который обновляет сущность основного модуля Magento, необходимо создать зависимость

Например, установщик в MyCustomModule:

 $installer = $this; $installer->startSetup(); $sqlQuote = 'ALTER TABLE ' . $this->getTable('sales_flat_quote') . ' ADD `is_urgent` TINYINT UNSIGNED NOT NULL DEFAULT 0'; $installer->run($sqlOrder); $installer->run($sqlQuote); $installer->endSetup(); 

Например, конфигурация зависимостей (сущность коммерческого предложения изменена, необходимо добавить зависимость с помощью модуля «Продажи»):

 <MyNamespace_MyCustomModule> <active>true</active> <codePool>local</codePool> <priority>1</priority> <depends> <Mage_Sales/> </depends> </MyNamespace_MyCustomModule> 

c) Расширение / перезапись файла (модель, помощник, блок, контроллер) из основного модуля Magento требует зависимости между модулями, в противном случае последняя измененная версия будет произвольной, и вы потеряете контроль над перезаписью.

Зависимости модуля важны для определения порядка очередности операторов SQL, и при новой установке они будут избегать конфликтов, сбоев или неправильных конечных данных.

Вывод

В этой статье я рассмотрел некоторые из основных принципов Magento, которые помогут разработчикам понять базовую архитектуру и иметь отправную точку в создании их пользовательских функций. Если вы хотите увидеть конкретные обновления для Magento или у вас есть интересующие вас случаи использования, сообщите нам об этом. Оставайтесь с нами для некоторых учебников и объяснений Magento 2!