craftcms/digital-products

使用 Craft Commerce 销售数字产品许可证

安装次数: 12,676

依赖: 2

建议者: 0

安全: 0

星标: 18

关注者: 10

分支: 9

类型:craft-plugin

4.0.2 2024-09-10 20:33 UTC

README

Digital Products icon

数字产品

此插件使得您可以使用 Craft Commerce 销售数字产品许可证。

要求

数字产品需要 Craft 5.0.0 和 Craft Commerce 5.0.0 或更高版本。

安装

您可以从插件商店或使用 Composer 安装此插件。

从插件商店

转到项目控制面板中的插件商店,搜索“数字产品”。然后在模态窗口中点击“安装”按钮。

使用 Composer

打开终端并运行以下命令

# go to the project directory
cd /path/to/my-project.test

# tell Composer to load the plugin
composer require craftcms/digital-products

# tell Craft to install the plugin
./craft install/plugin digital-products

事件

beforeSaveProductTypeafterSaveProductType 事件

插件可以在产品类型保存前或后立即得到通知,以便您的插件在需要时采取行动

use craft\digitalproducts\events\ProductTypeEvent;
use craft\digitalproducts\services\ProductTypes;
use yii\base\Event;

// ...

Event::on(
    ProductTypes::class, 
    ProductTypes::EVENT_BEFORE_SAVE_PRODUCTTYPE, 
    function(ProductTypeEvent $e) {
        // Custom code to be executed when a product type is saved
    }
);

beforeGenerateLicenseKey 事件

插件有机会提供许可证密钥,而不是依赖数字产品生成一个。

use craft\digitalproducts\elements\License;
use craft\digitalproducts\events\GenerateKeyEvent;
use craft\digitalproducts\Plugin as DigitalProducts;
use yii\base\Event;

// ...

Event::on(
    License::class, 
    License::EVENT_GENERATE_LICENSE_KEY, 
    function(GenerateKeyEvent $e) {
        $licenseService = DigitalProducts::getInstance()->getLicenses();
        
        do {
            $licenseKey = // custom key generation logic...
        } while (!$licenseService->isLicenseKeyUnique($licenseKey));

        $e->licenseKey = $licenseKey;
    }
);

预加载

许可证和产品都有几个可预加载的属性。

许可证

  • product 允许您预加载与许可证关联的产品。
  • order 允许您预加载与许可证关联的订单(如果有的话)。
  • owner 允许您预加载拥有许可证的 Craft 用户(如果有的话)。

产品

  • existingLicenses 预加载当前登录的 Craft 用户的所有现有许可证。

示例

显示当前登录的 Craft 用户的许可证产品。

{% if currentUser %}
    {% set licenses = craft.digitalProducts
        .licenses
        .owner(currentUser)
        .with(['product', 'order'])
        .all()
    %}

    <div class="panel panel-default">
    <div class="panel-heading"><h3 class="panel-title">Licenses</h3></div>
    {% if licenses %}
        <table class="table">
            <thead>
                <tr>
                    <th>Licensed product</th>
                    <th>License date</th>
                    <th>Order</th>
                </tr>
            </thead>
            <tbody>
            {% for license in licenses %}
                <tr>
                    <td><a href="{{ license.product.getUrl() }}">
                        {{ license.product.title }}
                    </a></td>
                    <td>{{ license.dateCreated|date('Y-m-d H:i:s') }}</td>
                    <td>
                        {% if license.orderId %}
                            <a href="/store/order?number={{ license.order.number }}">
                                Order no. {{ license.orderId }}
                            </a>
                        {% endif %}
                    </td>
                </tr>
            {% endfor %}
            </tbody>
        </table>
    {% endif %}
{% else %}
    <p>Please log in first</p>
{% endif %}

检查当前登录的用户是否有权限访问产品。

{% set products = craft.digitalProducts
    .products
    .type('onlineCourses')
    .with(['existingLicenses'])
    .all()
%}

{% if products|length %}
    <table class="table">
        <thead>
            <tr>
                <th>Product</th>
                <th>License status</th>
            </tr>
        </thead>
        <tbody>
            {% for product in products %}
                <tr>
                    <td>{{ product.title }}</td>
                    <td>
                        {% if product.existingLicenses|length %}
                            You already own this product.
                        {% else %}
                            <a href="{{ product.getUrl() }}">Get it now!</a>
                        {% endif %}
                    </td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
{% endif %}

GraphQL

可以使用 GraphQL 查询数字产品。请阅读 入门文档 以了解 Craft CMS 如何处理 GraphQL 请求。

GraphQL 实现提供了两个查询选项:返回多个产品的 digitalProducts 和返回单个产品的 digitalProduct

一个示例查询和响应

查询负载

query {
    digitalProducts(type: "eBooks", limit: 2) {
        title,
        sku,
        price
    }
}

响应

{
    "data": {
        "digitalProducts": [
            {
                "title": "Breaking Bad: The Recipes",
                "sku": "BB-TR",
                "price": 14.99
            },
            {
                "title": "The Clone Wars: Color The Clones",
                "sku": "TCW-CTC",
                "price": 7.95
            }
        ]
    }
}

digitalProducts/digitalProduct 查询

这两个查询使用相同的参数集。