...

суббота, 30 ноября 2013 г.

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

Добрый день, хабрасообщество.

Это моя первая статья, поэтому не судите строго. Несколько лет я занимаюсь разработкой интернет магазинов на базе 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 можно вносить свои изменения в базовую конфигурацию интернет магазина.

На этом загрузка конфигурации завершается, и запускаются соответствующие процессы, в зависимости от роутера страницы на которую вы перешли.

Спасибо за внимание, с удовольствием жду вашей критики.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Комментариев нет:

Отправить комментарий