craftcms / digital-products
使用 Craft Commerce 销售数字产品许可证
4.0.2
2024-09-10 20:33 UTC
Requires
- php: ^8.2
- craftcms/cms: ^5.0.0-beta.7
- craftcms/commerce: ^5.0.0-beta.1
Requires (Dev)
- craftcms/ecs: dev-main
- craftcms/phpstan: dev-main
- craftcms/rector: dev-main
- 4.x-dev
- 4.0.2
- 4.0.1
- 4.0.0
- 3.2.3
- 3.2.2
- 3.2.1
- 3.2.0
- 3.1.0
- 3.0.x-dev
- 3.0.2
- 3.0.1
- 2.4.4.x-dev
- 2.4.3.2
- 2.4.3.1
- 2.4.3
- 2.4.2
- 2.4.1
- 2.4.0
- 2.3.1
- 2.3.0
- 2.2.4.1
- 2.2.4
- 2.2.3
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- dev-bugfix/graphql-support
- dev-dependabot/composer/craftcms/cms-4.4.12
- dev-dependabot/composer/guzzlehttp/psr7-2.5.0
- dev-bugfix/gc-deleted-product-with-license
- dev-testing-workflow
- dev-bugfix/price-type
This package is auto-updated.
Last update: 2024-09-10 20:34:39 UTC
README
数字产品
此插件使得您可以使用 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
事件
beforeSaveProductType
和 afterSaveProductType
事件
插件可以在产品类型保存前或后立即得到通知,以便您的插件在需要时采取行动
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
查询
这两个查询使用相同的参数集。