Как программно перенести макет 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

Другие вопросы по тегам