【问题标题】:How to migrate a cs-cart layout programmatically?如何以编程方式迁移 cs-cart 布局?
【发布时间】:2015-06-25 07:01:15
【问题描述】:

在一个 cs-cart 项目中,我正在寻找一种干净的方法来以全自动方式自动迁移当前主题。

迁移主题文件很容易,因为每个主题都位于一个专用目录中。 然而,有些页面是使用后端的 WYSIWIG 编辑器创建的。这个编辑器是一个很好的功能,它允许生成一个描述所有布局的 XML 文件,并且可以导入回另一个环境。这需要手动操作(登录后端,点击按钮...),我想完全自动化。

到目前为止,我能找到的唯一解决方案是直接从数据库迁移数据,方法是生成布局相关表的转储并将其导入目标环境。这个解决方案似乎可行,但在我看来有点冒险。

cs-cart 是否提供命令行界面来导出和导入当前布局?

【问题讨论】:

    标签: migration cs-cart


    【解决方案1】:

    我为这个任务写了一个小脚本:

    <?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 版本。但是我认为这段代码适用于 4.x 版本的任何类型的 CS-Cart

    【讨论】:

    • 好主意!这是导出部分。事实上,我现在正在寻找的是相反的;最终就是将 XML 放在某个地方,并在部署时自动触发导入目标环境。当您点击 PHP 调用时,是否有可能从 PHP CLI 脚本运行某些东西并且之前不需要经过任何身份验证?
    【解决方案2】:

    完整解决方案(带有 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();
    }
    

    之后,请清除您的缓存。如果你做的一切正确,你将能够在没有身份验证的情况下调用这两个控制器(但是我建议你在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2017-07-16
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多