среда, 3 июля 2013 г.

XCN: Динамическое изменение конфига

В X-Cart Next основные настройки приложения хранятся в специализированном древообразном хранилище на базе класса \XLite\Core\ConfigCell. Кроме того, само хранилище кэшируется и отдается в результате методом \XLite\Model\Repo\Config::getAllOptions(). Соответственно - если что-то надо динамически в этом хранилище изменить - есть два основных пути.

1. Можно на ходу отдавать свои данные вместо закэшированных. Для этого надо перекрыть класс \XLite\Core\ConfigCell и его метод __get(). Но - хранилище древообразное и у ветки нет ссылки на старшую ветку. В результате - вполне может быть, что в разных разделах хранилища будут ячейки с одинаковыми именами. Поэтому - либо надо задавать для ячейки хранение длинное уникальное имя, либо надо как-то решать проблему не на уровне объекта хранения, а на уровне его отдачи. А это уже второй способ :)

2. Можно перекрыть класс \XLite\Model\Repo\Config, метод getAllOptions() и в нем менять хранилище. Причем - этот метод за весь запуск приложения вызывается только один раз. А значит его перекрытие оптимально по производительности.
В ходе же изменения хранилища есть две подхода:

a. изменение непосредственно нужной ячейки в хранилище. Например, так:

...
$data = parent::getAllOptions($force);
$data->General->minimal_order_amount = 10;
return $data;
...

b. замена всей ветки на другой объект-хранилище. Например, так:

...
$data = parent::getAllOptions($force);
$data->General = new \XLite\Module\Author\Name\Core\MyConfigCell(
    $data->General->getData()
);
return $data;
...

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

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

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