oofbar / membership
根据用户的商务订阅提供特殊访问权限。
Requires
- craftcms/cms: ^4.0.0
- craftcms/commerce: ^4.0.0
README
根据用户的 商务订阅 提供特殊访问权限。
该会员插件通过监听 Craft Commerce 中的关键 订阅事件 来工作,并根据控制面板中配置的规则或“授权”将订阅者移动到(或从)组中。
其中很大一部分可以在针对您应用程序的特定模块中实现——此插件主要面向需要基于活跃订阅简单授予访问权限的系统,并且不希望自行维护该逻辑的用户。
该插件处理订阅的创建、取消和到期,以及计划的切换。目前,它不支持基于“试用期”的特殊访问或限制。
要求
此插件需要 Craft CMS 4 和 Commerce 4。 版本 1.x 与 Craft 3 和 Commerce 3 兼容。
警告 要使订阅正常工作,您必须配置 Stripe webhooks!Stripe 提供了一个出色的 CLI,可以帮助 在开发环境中转发 webhooks。
从 Membership 1.x 升级
2.x 升级应无需手动干预,但始终重要的是要测试您的应用程序以确保一致性。
如果您使用过任何内部功能,请注意以下一些重要更改
oofbar\membership\controllers\BaseController
已被删除。它实现的便利功能已集成到 Craft 4 中。oofbar\membership\controllers\BaseCpController
和oofbar\membership\controllers\BaseAdminController
已被删除。权限检查现在在各个控制器中执行。oofbar\membership\controllers\LogsController
已被删除,因为它从未使用过。- 自定义权限(
membership-manageGrants
和membership-viewLogs
)已被删除,因为它们从未被检查。访问权限已合并到admin
用户。
安装
要安装插件,请按照以下说明操作(或只需在 Craft 插件商店 中搜索“Membership”)
-
打开您的终端并转到您的 Craft 项目
cd /path/to/project
-
然后告诉 Composer 加载插件
composer require oof-bar/membership -w
-
在控制面板中,转到设置→插件,点击 Membership 的“安装”按钮,或运行
php craft plugin/install membership
详细信息
每个 授权 都是一种政策或规则,用于指定哪些计划映射到哪些 用户组。默认情况下,插件不执行任何操作——如果没有配置授权,它不会对用户权限做出任何更改。
由于会员功能是针对用户组(而不是权限,直接)操作的,因此最好首先设计一个合理的基于组的权限结构——例如,如果您的组织有 青铜、银 和 金 支持等级,您可能会创建三个用户组,并将相关权限分配给每个组。
您可以为每个计划创建多个授权——例如,如果您想以累加的方式组织权限,您可以授予 金 支持者访问所有三个组的权限。这样,您可以确保授予较低支持等级的好处总是会向上冒泡到较高的等级。
插件永远不会从由其他活跃订阅授权的组中删除用户:如果 计划 A
和 计划 B
都将用户移入 组 1
,但 计划 B
还会将用户添加到 组 2
,如果用户的 计划 A
订阅仍然有效,则取消 计划 B
的订阅不会从 组 1
中删除用户。
注意更改授权的配置将 不会 更新现有用户的组。
用法
所有配置都通过控制面板进行。转到 设置 部分,然后点击 会员 图块来管理 授权。
注意授权不存储在项目配置中,因此必须在每个环境中进行配置。这是 Commerce 的当前一个 限制。您可能需要直接导航到生产环境中的设置页面——路径始终是
settings/membership/grants
。
前端
在您的模板中,您可以使用正常的 Craft 用户方法来检查某人是否具有特定的访问级别
{% if currentUser.isInGroup('membersBronze') %} <p>Thank you for your support! You have access to our entire lesson catalog.</p> {% endif %}
除了检查组之外,您还可以直接检查权限:例如,如果用户拥有的订阅不如他们是否具有某种能力重要,您可以使用 .can()
方法
{% set section = craft.app.sections.getSectionByHandle('classifieds') %} {% if currentUser.can("createEntries:#{section.uid}") %} You’re ready to <a href="{{ url('account/classifieds/new') }}">create a listing</a>! {% endif %}
警告通过组自动管理用户权限可能会很危险。请考虑为审查和部署项目权限方案的变化定义一个 流程或策略。
审计
会员内置了一个轻量级日志系统,以便商店管理员可以了解插件正在做什么。{{%membership_logs}}
表跟踪插件采取的任何操作(成功和失败),相关日志将在订阅的编辑页面上输出(自 Commerce 3.0.11 以来)。
可扩展性
Craft 和 Yii 提供了一个丰富的 事件 系统,以帮助开发人员更改内置和“可插拔”功能的行为。
Membership 发射两个事件:一个是在权限即将被授权之前,另一个是在权限即将被撤销时。
Permissions::EVENT_BEFORE_GRANT_PERMISSION
在将用户授予用户组之前触发。这不是在由于用户已在给定组中而未授予权限时发出的。
use yii\base\Event; use oofbar\membership\services\Permissions; use oofbar\membership\events\GrantPermission as GrantPermissionEvent; Event::on( Permissions::class, Permissions::EVENT_BEFORE_GRANT_PERMISSION, function (GrantPermissionsEvent $e) { // Optionally: prevent the grant from occurring, based on some criteria! $e->isValid = false; });
Permissions::EVENT_BEFORE_REVOKE_PERMISSION
在用户即将从用户组中移除之前触发。这不是在授权会从用户不在的组中移除用户时发出的。相反,会员创建一个反映此状态的日志消息。
use yii\base\Event; use oofbar\membership\services\Permissions; use oofbar\membership\events\RevokePermission as RevokePermissionEvent; Event::on( Permissions::class, Permissions::EVENT_BEFORE_REVOKE_PERMISSION, function (RevokePermissionsEvent $e) { // Optionally: prevent the revocation from occurring, based on some criteria! $e->isValid = false; });
🌳