Что config.xml настройки можно задать в базе данных?
Я хочу узнать больше о внутренностях Magento!
Недавно я использовал учебник Inchoo, чтобы позволить администраторам устанавливать расписание crontab в разделе Система > Конфигурация. Смотрите это здесь. В нем я заметил, что параметр, который обычно задается в config.xml
, вместо этого устанавливается в таблице базы данных core_config_data
.
Обычный config.xml
метод:
<crontab>
<jobs>
<my_custom_crontab>
<schedule><cron_expr>* * * * *</cron_expr></schedule>
<run><model>mymodule/observer::hookMethod</model></run>
</my_custom_crontab>
</jobs>
</crontab>
Альтернативная Запись Базы данных:
scope scope_id path value
default 0 crontab/jobs/my_custom_crontab/schedule/cron_expr * * * * *
Может ли кто-нибудь сказать я
- Какие параметры конфигурации могут быть расположены в базе данных, или все ли они могут быть.
- Где живет логика (код) Magento для извлечения этих значений из базы данных.
- Как выглядит иерархия / чему отдается приоритет.
Один побочный эффект, который я заметил при хранении этих настроек config.xml
в базе данных, заключается в том, что у них внезапно появляется область действия. (по умолчанию, веб-сайт, магазин, просмотр магазина.) Я не знаю о репликации такой области в файлах config.xml
, поэтому я также интересно, как это фигурирует.
Спасибо!
1 answers
Теоретически вы можете установить любое значение конфигурации в базе данных (таблица core_config_data
).
Но в большинстве случаев сохраненные там значения имеют столбец path
, подобный этому: section/group/field
. Итак, всего 3 части. Расписание cron является исключением.
Общая конфигурация Magento взята из разных источников. Все эти источники объединены в один большой xml. В случае, если есть 2 узла с одинаковым xpath, каждый источник перезапишет предыдущий источник.
Вот порядок загрузки конфигурация.
- Все XML-файлы, расположенные в
app/etc
(без вложенных папок). Это загружается вMage_Core_Model_App::_initBaseConfig()
. - Все модули. Файлы, расположенные в
app/etc/modules
. Это делается с помощьюMage_Core_Model_Config::_loadDeclaredModules()
-
config.xml
для всех активных модулей, загруженных ранее. Сделано вMage_Core_Model_Config::loadModules()
-
core_config_data
табличные значения. Сделано вMage_Core_Model_Config::loadDb
.
Из всего этого magento создает один большой конфигурационный xml и меньшие для каждого веб-сайта и представления магазина, вытекающие из основного.
И вот пример.
Допустим, у вас есть это внутри config.xml
модуля.
<default> <!-- config scope node -->
<some_section>
<some_group>
<some_field>2</some_field>
</some_group>
</some_section>
</default>
И у вас в бд есть строка с тем же путем some_section/some_group/some_field
и областью действия default
, но значение равно 1
.
В большой конфигурации конечным значением будет 1
, потому что конфигурация бд загружается последней.
Дополнительная заметка. При чтении значения из конфигурации вы не можете знать, взято ли значение из какого-либо xml-файла или из базы данных, и вам должно быть все равно.