Как программно перенести макет cs-cart?
В проекте cs-cart я ищу чистый способ автоматизации миграции текущей темы в полностью автоматическом режиме.
Миграция файлов темы проста, поскольку каждая тема находится в отдельном каталоге. Тем не менее, некоторые страницы создаются с помощью WYSIWIG-редактора макетов из серверной части. Этот редактор как приятная функция, которая позволяет генерировать XML-файл, который описывает все макеты и может быть импортирован обратно в другую среду. Это требует ручного управления (вход в бэкэнд, нажатие кнопки...), и я хотел бы полностью автоматизировать это.
Пока что единственное решение, которое мне удалось найти, - это перенести данные непосредственно из базы данных, сгенерировав дамп связанных таблиц макета и импортировав его в целевую среду. Это решение, кажется, работает, но немного рискованно, на мой взгляд.
Предоставляет ли cs-cart интерфейс командной строки для экспорта и импорта текущих макетов?
2 ответа
Я написал небольшой скрипт для этой задачи:
<?php
use Tygh\BlockManager\Layout;
use Tygh\BlockManager\Exim;
if ($mode == "do") {
$location_ids = array();
$default_layout_data = Layout::instance()->getDefault();
$layout_id = $default_layout_data['layout_id'];
$content = Exim::instance()->export($layout_id, $location_ids);
header("Content-Type: text/xml");
header("Content-Length: " . strlen($content));
header('Content-Disposition: attachment; filename=layouts.xml');
header('Expires: 0');
print $content;
exit();
}
если вы поместите этот код в файл контроллера (например, в ваш /app/addons/my_changes/controllers/backend/layout_export.php
) и вызовите его через URL (в моем случае: /youradmin.php?dispatch=layout_export.do
), он загрузит основную структуру макета темы по умолчанию.
Обратите внимание, что я работаю с версией 4.3.3. Однако я думаю, что этот код будет работать с любым типом CS-Cart с версии 4.x
Полное решение (с дополнением my_changes)
/app/addons/my_changes/schemas/permissions/trusted_controllers.post.php
<?php
$schema['layout_exim']['allow']['export'] = true;
$schema['layout_exim']['allow']['import'] = true;
return $schema;
/app/addons/my_changes/controllers/backend/layout_exim.php
<?php
use Tygh\BlockManager\Layout;
use Tygh\BlockManager\Exim;
if ($mode == "export") {
$location_ids = array();
$default_layout_data = Layout::instance()->getDefault();
$layout_id = $default_layout_data['layout_id'];
$content = Exim::instance()->export($layout_id, $location_ids);
header("Content-Type: text/xml");
header("Content-Length: " . strlen($content));
header('Content-Disposition: attachment; filename=layouts.xml');
header('Expires: 0');
print $content;
exit();
} elseif ($mode == "import") {
$result = Exim::instance()->importFromFile($_REQUEST['filepath']);
if ($result) {
print "true";
} else {
print "false";
}
exit();
}
После этого, пожалуйста, очистите свой кеш. Если вы все сделаете правильно, вы сможете вызывать эти 2 контроллера без аутентификации (однако я предлагаю вам установить пароли в параметрах get, потому что сейчас это очень небезопасно!)
Для вызова контроллеров через URL:
http://path-to-your-admin.com/admin.php?dispatch=layout_exim.import&filepath=path/to/file
http://path-to-your-admin.com/admin.php?dispatch=layout_exim.export