| New file |
| | |
| | | <?php |
| | | namespace JVBase\base; |
| | | /** |
| | | * JVB_MEMBERSHIP defines the structure of the directory |
| | | * Options include: |
| | | * - membership_expires = useful if members pay a yearly membership fee |
| | | * - hide_expired = removes users once membership expired; only used if membership_expires is true |
| | | * - clip_expired = keeps users once membership expires, but limits the information shown; only used if membership_expires is true |
| | | * - membership_approval = verified users can approve other users |
| | | * - term_approval = (bool) verified users can create new terms, but needs approval |
| | | * - member_only = (array) if empty, open to any registered user. otherwise an array of registered user roles |
| | | * |
| | | * |
| | | * Example: |
| | | * [ |
| | | * 'member_content' => true, |
| | | * 'invitable' => true, |
| | | * 'can_invite' => ['artist' => ['artist']], |
| | | * 'member_verified' => true, |
| | | * 'notifications' => true, |
| | | * 'forum' => true, |
| | | * 'member_only' => [ 'artist' ], |
| | | * 'member_expires' => false, |
| | | * 'hide_expired' => false, |
| | | * 'clip_expired' => false, |
| | | * 'term_approval' => true, |
| | | * 'can_approve' => [ 'artist' ] |
| | | * ] |
| | | */ |
| | | |
| | | $membership = apply_filters('jvb_membership', [ |
| | | 'can_invite' => [], |
| | | ]); |
| | | define('JVB_MEMBERSHIP', $membership); |
| | | |
| | | |
| | | class Membership |
| | | { |
| | | protected bool $member_content = true; |
| | | protected bool $invitable = false; |
| | | protected array $can_invite = []; |
| | | protected bool $notifications = true; |
| | | protected bool $member_expires = false; |
| | | protected bool $hide_expired = false; |
| | | protected bool $clip_expired = false; |
| | | protected bool $term_approval = false; |
| | | protected array $can_approve = []; |
| | | protected bool $forum = true; |
| | | protected array $member_only = []; |
| | | |
| | | public function __construct() { |
| | | |
| | | } |
| | | public function set(string $property, null|bool|array $value = null):void |
| | | { |
| | | if (is_null($value)) { |
| | | $value = true; |
| | | } |
| | | if (property_exists(self::class, $property)) { |
| | | $this->$property = $value; |
| | | } else { |
| | | error_log('[Membership]::set Could not set property '.$property.', it does not exist.'); |
| | | } |
| | | } |
| | | |
| | | public function setAll(array $properties):void |
| | | { |
| | | foreach ($properties as $property) { |
| | | if (is_array($property)) { |
| | | $this->set($property[0], $property[1]); |
| | | } else { |
| | | $this->set($property); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public function has(string $property):bool |
| | | { |
| | | return property_exists($this, $property) && $this->$property === true; |
| | | } |
| | | |
| | | public function hasAny(array $properties):bool |
| | | { |
| | | foreach ($properties as $property) { |
| | | if ($this->has($property)) { |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | public function getInviters():array |
| | | { |
| | | return $this->can_invite; |
| | | } |
| | | public function canInvite(string $role):bool |
| | | { |
| | | return ($this->invitable) && array_key_exists($role, $this->can_invite); |
| | | } |
| | | public function getInvitableFor(string $role):array |
| | | { |
| | | return array_key_exists($role, $this->can_invite) ? $this->can_invite[$role] : []; |
| | | } |
| | | |
| | | public function getApprovers():array |
| | | { |
| | | return $this->can_approve; |
| | | } |
| | | |
| | | public function canApprove(string $role):bool |
| | | { |
| | | return ($this->term_approval) && in_array($role, $this->can_approve); |
| | | } |
| | | |
| | | |
| | | public function canSeeForum(string $role):bool |
| | | { |
| | | return $this->forum && (empty($this->member_only) || in_array($role, $this->member_only)); |
| | | } |
| | | |
| | | } |