prestashop/module-lib-mbo-installer

辅助工具,简化从插件市场下载PS MBO

v2.0.0 2023-12-05 14:14 UTC

README

prestashopexamplemodule.zip

编辑 2023年9月1日

PrestaShop模块依赖库

本包的目标是帮助管理模块依赖。

让我们通过一个实际案例来解释

假设我们的模块需要模块A和B才能正常工作。

我们将需要安装此module-lib-mbo-installer,并在模块根目录下创建一个名为module_dependencies.json的文件,其中包含

{
    "dependencies": [
      {
        "name" : "A"
      },
      {
        "name" : "B"
      }
    ]
}

库将首先检查PS MBO (后台市场)是否已安装并启用。

MBO需要首先安装,因为我们从市场上下载其他模块。

然后它将检查模块A和B

安装

composer require prestashop/module-lib-mbo-installer

版本指导

用法

您有2种可用方法

  • DependenciesBuilder::handleDependencies():此方法将以数组的形式返回所有依赖项的状态,包括MBO
[
    'module_display_name' => string // your displayed module name 
    'module_name' => string // your module tech name
    'module_version' => string
    'ps_version' => string
    'php_version' => string
    'locale' => string // the shop locale
    'dependencies' => [ // an array of all the dependencies defined + MBO
        [
            'name' => 'ps_mbo'
            'installed' => bool
            'enabled' => bool
            'current_version' => string
            'install' => string // route to install the module, if relevant
            'enable' => string  // route to enable the module, if relevant
            'upgrade' => string  // route to upgrade the module, if relevant
        ],
        [
            'name' => string // a dependent module
            'installed' => bool
            'enabled' => bool
            'current_version' => string
            'install' => string // route to install the module, if relevant
            'enable' => string  // route to enable the module, if relevant
            'upgrade' => string  // route to upgrade the module, if relevant
        ],
        ...
    ]
];
  • DependenciesBuilder::areDependenciesMet():此方法将返回是否所有依赖项(包括MBO)都已安装并启用

这两个方法将帮助您收集有关依赖项的信息,并允许您执行操作以解决它们。

实现示例

在大多数情况下,您可能希望在配置页面上显示模块的依赖项,以允许“用户”修复它们

您可以在模块的主要文件的getContent方法中使用上述示例之一

使用提供的公共CDC

在您的模块中

$mboInstaller = new Prestashop\ModuleLibMboInstaller\DependencyBuilder($this);
$dependencies = $mboInstaller->handleDependencies();

$this->smarty->assign('dependencies', $dependencies);

return $this->display(__FILE__, 'views/templates/admin/dependency_builder.tpl');

在模板中

<!-- Load cdc library -->
<script src="https://assets.prestashop3.com/dst/mbo/v1/mbo-cdc-dependencies-resolver.umd.js"></script>

<!-- cdc container -->
<div id="cdc-container"></div>

<script defer>
  const renderMboCdcDependencyResolver = window.mboCdcDependencyResolver.render
  const context = {
    ...{$dependencies|json_encode},
    onDependenciesResolved: () => console.log('Everything works!'),
    onDependencyResolved: (dependencyData) => console.log('Dependency installed', dependencyData), // name, displayName, version
    onDependencyFailed: (dependencyData) => console.log('Failed to install dependency', dependencyData),
    onDependenciesFailed: () => console.log('There are some errors'),
  }
  renderMboCdcDependencyResolver(context, '#cdc-container')
</script>

此示例使用我们的公共CDC,将显示一个包含依赖项状态和解决所有依赖项的动作按钮的页面

Dependencies lib CDC

自己动手做

在您的模块中

$mboInstaller = new Prestashop\ModuleLibMboInstaller\DependencyBuilder($this);
$dependencies = $mboInstaller->handleDependencies();

return $this->render(
    '@Modules/examplemodule/views/templates/admin/dependency_builder.html.twig',
    [
        'dependencies' => $dependencies,
    ]
);

在模板中

<script>
    $(document).on('click', '.module_action', function(event) {
        event.preventDefault();
        const moduleName = window.$(this).attr('data-module')
        window.$.ajax({
            method: 'POST',
            url: window.$(this).attr('data-url'),
        }).done((response) => {
            console.log(response[moduleName])
            if (response[moduleName].status === true) {
                window.$.growl.notice({message: response[moduleName].msg});
                window.location.reload();
            } else {
                window.$.growl.error({message: response[moduleName].msg});
            }
        });
    })
</script>
{% for dependency in dependencies.dependencies %}
    <div>
        {{ dependency.name }} : 
        {% if dependency.installed is same as(true) and dependency.enabled is same as(true) %}
            OK
        {% elseif dependency.installed is same as(false) and dependency.install is defined %}
            <a class="btn btn-primary module_action" href="#" data-module="{{ dependency.name }}" data-url="{{ dependency.install }}">
              Install
            </a>
        {% elseif dependency.enable is defined %}
            <a class="btn btn-primary module_action" href="#" data-module="{{ dependency.name }}" data-url="{{ dependency.enable }}">
              Enable
            </a>
        {% else %}
            NOK
        {% endif %}
    </div>
{% endfor%}