Добрый день, читатели.
Это моя первая статья, поэтому не судите строго. Несколько лет я занимаюсь разработкой интернет магазинов на базе Magento. За это время у меня накопилось много информации относительно работы данной платформы, которую невозможно вечно держать в голове, поэтому я решил структурировать ее в виде серии статей.
Кому интересно, добро пожаловать под кат.
Любое обращение к страницам в интернет магазине на базе Magento начинается с обработки index.php. В данном файле производится первичная проверка, в том числе версии PHP, объявляются константы и подключается файл Mage.php с базовым классом Mage. Данный класс реализует множество интересных методов, которые будут рассмотрены в дальнейших статья, а на данный момент нас интересует метод
run, отвечающий за запуск магазина. Чтобы понять, как происходит загрузка конфигурационных файлов, рассмотрим данный метод:
self::$_app = new Mage_Core_Model_App();
if (isset($options['request'])) {
self::$_app->setRequest($options['request']);
}
if (isset($options['response'])) {
self::$_app->setResponse($options['response']);
}
self::$_events = new Varien_Event_Collection();
self::_setIsInstalled($options);
self::_setConfigModel($options);
self::$_app->run(array(
'scope_code' => $code,
'scope_type' => $type,
'options' => $options,
));
Видно, что в методе создается новый класс Mage_Core_Model_App и для него вызывается метод run, где и происходит вызов методов первоначальной загрузки конфигурационных файлов.
Рассмотрим данный метод:
public function run($params)
{
$options = isset($params['options']) ? $params['options'] : array();
$this->baseInit($options);
Mage::register('application_params', $params);
if ($this->_cache->processRequest()) {
$this->getResponse()->sendResponse();
} else {
$this->_initModules();
$this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);
if ($this->_config->isLocalConfigLoaded()) {
$scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';
$scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';
$this->_initCurrentStore($scopeCode, $scopeType);
$this->_initRequest();
Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
}
$this->getFrontController()->dispatch();
}
return $this;
}
Метод baseInit отвечает за инициализацию свойства _config и загрузку базовых конфигураций. Базовая конфигурация загружается в методе _initBaseConfig, который в дальнейшем вызывает loadBase метод из класса Mage_Core_Model_Config.
Метод loadBase парсит и сохраняет в свойство _xml объекта Mage_Core_Model_Config данные из файлов app/etc/local.xml и app/etc/config.xml. В данных файлах содержатся доступы к БД и базовые настройки интернет магазина.
После чего происходит загрузка конфигурационных файлов модулей. За это отвечает метод _initModules, который, в свою очередь, вызывает метод loadModules из класса Mage_Core_Model_Config.
Для загрузки конфигурационных файлов модулей сначала загружается список всех файлов из папки app/etc/modules и производится разбор этих файлов. За это отвечает метод _loadDeclaredModules. В методе loadModules производится обработка только трех типов файлов из папки etc в директории модуля:
- 1. confix.xml
- 2. config.{resource_name}.xml (в нашем случае config.mysql4.xml)
- 3. local.xml
Для загрузки первых двух типов вызывается метод loadModulesConfiguration, которому в качестве $fileName передается массив с именами файлов (config.xml и config.mysql4.xml)
Далее производится парсинг и загрузка данных в свойство _xml для всех активных модулей:
$modules = $this->getNode('modules')->children();
foreach ($modules as $modName=>$module) {
if ($module->is('active')) {
if ($disableLocalModules && ('local' === (string)$module->codePool)) {
continue;
}
if (!is_array($fileName)) {
$fileName = array($fileName);
}
foreach ($fileName as $configFile) {
$configFile = $this->getModuleDir('etc', $modName).DS.$configFile;
if ($mergeModel->loadFile($configFile)) {
$mergeToObject->extend($mergeModel, true);
}
}
}
}
С помощью файла local.xml можно вносить свои изменения в базовую конфигурацию интернет магазина.
На этом загрузка конфигурации завершается, и запускаются соответствующие процессы, в зависимости от роутера страницы на которую вы перешли.
Спасибо за внимание, с удовольствием жду вашей критики.
Автор: Den4ik_k