From 86c6cd3cc099d2480932ede03c12cea01e625c94 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 26 Apr 2026 21:56:28 +0000
Subject: [PATCH] =Requiring files based on Site class settings
---
base/Membership.php | 121 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 121 insertions(+), 0 deletions(-)
diff --git a/base/Membership.php b/base/Membership.php
new file mode 100644
index 0000000..9032758
--- /dev/null
+++ b/base/Membership.php
@@ -0,0 +1,121 @@
+<?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));
+ }
+
+}
--
Gitblit v1.10.0