shopsys/plugin-interface

Shopsys平台插件通用接口

v14.0.1 2024-09-13 07:58 UTC

This package is auto-updated.

Last update: 2024-09-25 11:41:45 UTC


README

Downloads

提供Shopsys平台与插件之间兼容性的接口包。

此仓库由shopsys/shopsys monorepo维护,变更信息在monorepo CHANGELOG.md中。

功能

此包包含负责通用功能的接口,这些功能几乎可在任何插件中使用。对于特定功能,如生成产品数据包,有单独的仓库

示例

例如,在下面的CRUD扩展部分中查看AcmeProductCrudExtension的使用示例。

存储数据

存储插件数据最佳方式是使用Doctrine实体。在您的插件中创建一个文件夹(例如src/Entity),并将实体放在那里。然后您需要创建DoctrineOrmMappingPass并将其添加为CompilerPass到您的YourBundleNameBundle类中。这可以通过以下方式完成:

// vendor/your-bundle-name-bundle/src/YourBundleNameBundle.php

// ...

    /**
     * @inheritdoc
     */
    public function build(ContainerBuilder $container) {
        parent::build($container);

        $container->addCompilerPass(
            DoctrineOrmMappingsPass::createAnnotationMappingDriver(
                [$this->getNamespace() . '\Entity'],
                [$this->getPath() . '/Entity']
            )
        );
    }

// ...

这告诉Doctrine在哪里查找您的实体。现在您可以创建Repository并像往常一样管理您的数据。

CRUD扩展

有时您的插件需要一些额外信息来包含在实体中,例如,您需要跟踪产品的重量。这可以通过扩展实体CRUD模型与您的自定义子表单来解决。

为此,您应该实现PluginCrudExtensionInterface并在DI容器中使用带有shopsys.crud_extension标记的服务。标记应具有定义要扩展的CRUD模型的type属性(例如,"product")。

每个表单扩展都有自己的标签、表单类型和管理表单数据的方法。

示例

services:
    acme.acme_product_crud_extension:
        class: AcmePlugin\AcmeProductCrudExtension
        tags:
            - { name: shopsys.crud_extension, type: product }

    acme.acme_data_form_type:
        class: AcmePlugin\AcmeProductFormType
        tags:
            - { name: form.type }
// ...
class AcmeProductCrudExtension implements PluginCrudExtensionInterface
{
    private $acmeProductFacade;

    public function __construct(AcmeProductFacade $acmeProductFacade) {
        $this->acmeProductFacade = $acmeProductFacade;
    }

    public function getFormTypeClass()
    {
        return AcmeProductFormType::class;
    }

    public function getFormLabel()
    {
        return 'ACME data';
    }

    public function getData($productId)
    {
        $acmeProduct = $this->acmeProductFacade->findByProductId($productId);

        $pluginData = [
            'attribute' => $acmeProduct->getAttribute(),
        ];

        return $pluginData;
    }

    public function saveData($productId, $data)
    {
        $acmeProductData = new AcmeProductData();
        $acmeProductData->attribute = $data['attribute'];

        $this->acmeProductFacade->save($productId, $acmeProductData);
    }

    public function removeData($productId)
    {
        $this->acmeProductFacade->remove($productId);
    }
}

ACME CRUD extension example

演示数据

为了便于测试或演示您插件的用法,您可能希望提供演示数据。在这种情况下,您应该实现PluginDataFixtureInterface,它将负责将演示数据加载到核心中。

您需要做的只是实现PluginDataFixtureInterface::load()方法,并在DI容器中使用带有shopsys.data_fixture标记的服务。

示例

services:
    acme.acme_bundle.data_fixture:
        class: AcmePlugin\AcmeDataFixture
        tags:
            - { name: shopsys.data_fixture }
class AcmeDataFixture implements PluginDataFixtureInterface
{
    private $acmeProductFacade;

    public function __construct(AcmeProductFacade $acmeProductFacade) {
        $this->acmeProductFacade = $acmeProductFacade;
    }

    public function load() {
        $firstAcmeProductData = new AcmeProductData();
        $firstAcmeProductData->enableWeightCalculation = true;
        $firstAcmeProductData->weight = 42;
        $firstAcmeProductData->domainId = 1;

        $this->acmeProductFacade->save($firstAcmeProductData);

        $secondAcmeProductData = new AcmeProductData();
        $secondAcmeProductData->enableWeightCalculation = false;
        $secondAcmeProductData->weight = null;
        $secondAcmeProductData->domainId = 2;

        $this->acmeProductFacade->save($secondAcmeProductData);
    }

}

CRON模块

当您的插件需要定期执行某些任务时,例如每六小时下载货币汇率,您可以使用CRON模块。

有2种类型的CRON模块接口

您可以实现其中之一并使用带有shopsys.cron标记的服务在DI容器中进行标记。

每当当前系统时间与标记属性中的指定掩码匹配时,CRON模块将自动启动hoursminutes

示例

acme.data_download_cron_module:
    class: AcmePlugin\AcmeDataDownloadCronModule
    tags:
        - { name: shopsys.cron, hours: '*/6', minutes: '0' }
// ...
class AcmeDataDownloadCronModule implements SimpleCronModuleInterface
{
    /**
     * @var \Symfony\Bridge\Monolog\Logger
     */
    private $logger;

    public function setLogger(Logger $logger)
    {
        $this->logger = $logger;
    }

    public function run()
    {
        $data = $this->downloadData();
        $this->saveData($data);

        $this->logger->info(sprintf('Downloaded %d new records.', count($data)));
    }

    // ...
}

如何实现插件

插件以Symfony Bundle的形式实现。有关如何编写新Bundle的提示,请参阅可重用Bundle的最佳实践

贡献

感谢您对Shopsys插件接口包的贡献。我们一起使Shopsys平台变得更好。

此存储库为只读。如果您想报告问题和/或发送拉取请求,请使用主Shopsys存储库

在贡献之前,请检查我们的贡献指南

支持

当您遇到麻烦或需要帮助时,最好的方法是加入我们的Slack

如果您想报告问题,请使用主Shopsys存储库