Magento. Процесс загрузки конфигурационных файлов

в 23:52, , рубрики: Magento, php, XML, метки: , ,

Добрый день, читатели.
Это моя первая статья, поэтому не судите строго. Несколько лет я занимаюсь разработкой интернет магазинов на базе 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)
image
Далее производится парсинг и загрузка данных в свойство _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

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js