From 0dceb6cb9aa48db1d1dd8619e1d2045fc89da2ea Mon Sep 17 00:00:00 2001 From: Sebastian Schendel Date: Mon, 2 Oct 2023 15:43:58 +0200 Subject: [PATCH] v1.0.5 Removed auto add functionality due to inconsistencies --- PageAccessReleasetime.module.php | 258 ++++++++++++++----------------- 1 file changed, 117 insertions(+), 141 deletions(-) diff --git a/PageAccessReleasetime.module.php b/PageAccessReleasetime.module.php index 297d40c..9fa4013 100755 --- a/PageAccessReleasetime.module.php +++ b/PageAccessReleasetime.module.php @@ -1,34 +1,36 @@ =now)"; - public static function getModuleInfo() { - return array( + public static function getModuleInfo() + { + return [ 'title' => __('Page Access Releasetime'), 'author' => 'Sebastian Schendel', - 'version' => '1.0.4', + 'version' => '1.0.5', 'summary' => __('Enables you to set a start- and end-time for the release of pages. Prevents unreleased pages from being displayed.'), 'singular' => true, 'autoload' => true, 'icon' => 'hourglass-half', - 'requires' => array('PHP>=5.5.0', 'ProcessWire>=3.0.0'), + 'requires' => ['PHP>=5.5.0', 'ProcessWire>=3.0.0'], 'href' => 'https://processwire.com/talk/topic/20852-module-page-access-releasetime/' - ); + ]; } - public function ___install(){ + public function ___install() + { $flags = Field::flagSystem + Field::flagAccessAPI + Field::flagAutojoin; $field = new Field(); - $field->type = $this->modules->get("FieldtypeCheckbox"); + $field->type = $this->modules->get('FieldtypeCheckbox'); $field->name = 'releasetime_start_activate'; $field->label = $this->_('Activate Releasetime from?'); $field->tags = self::module_tags; @@ -36,7 +38,7 @@ public function ___install(){ $field->save(); $field = new Field(); - $field->type = $this->modules->get("FieldtypeDatetime"); + $field->type = $this->modules->get('FieldtypeDatetime'); $field->name = 'releasetime_start'; $field->label = $this->_('Release from:'); $field->tags = self::module_tags; @@ -50,7 +52,7 @@ public function ___install(){ $field->save(); $field = new Field(); - $field->type = $this->modules->get("FieldtypeCheckbox"); + $field->type = $this->modules->get('FieldtypeCheckbox'); $field->name = 'releasetime_end_activate'; $field->label = $this->_('Activate Releasetime to?'); $field->tags = self::module_tags; @@ -58,7 +60,7 @@ public function ___install(){ $field->save(); $field = new Field(); - $field->type = $this->modules->get("FieldtypeDatetime"); + $field->type = $this->modules->get('FieldtypeDatetime'); $field->name = 'releasetime_end'; $field->label = $this->_('Release to:'); $field->tags = self::module_tags; @@ -75,18 +77,23 @@ public function ___install(){ $permission->save(); } - public function ___uninstall(){ + public function ___uninstall() + { // Remove releasetime-fields: - foreach(self::fieldnames as $fieldname){ + foreach (self::fieldnames as $fieldname) { $field = $this->wire('fields')->get($fieldname); - if(!($field instanceof Field) || $field->name != $fieldname) continue; + if (!($field instanceof Field) || $field->name != $fieldname) { + continue; + } $field->flags = Field::flagSystemOverride; $field->flags = 0; $field->save(); - foreach($this->wire('templates') as $template){ - if(!$template->hasField($fieldname)) continue; + foreach ($this->wire('templates') as $template) { + if (!$template->hasField($fieldname)) { + continue; + } $template->fieldgroup->remove($field); $template->fieldgroup->save(); } @@ -96,58 +103,48 @@ public function ___uninstall(){ // remove permission: $permission = wire('permissions')->get(self::permissionname); - if($permission instanceof Permission && $permission->id){ + if ($permission instanceof Permission && $permission->id) { $this->wire('permissions')->delete($permission); } - } - protected static $defaults = array( - 'autoAdd' => 0, + protected static $defaults = [ 'templates' => [] - ); + ]; - public static function getModuleConfigInputfields(array $data) { + public static function getModuleConfigInputfields(array $data) + { $form = new InputfieldWrapper(); $moduleconfig = wire('modules')->getModuleConfigData('PageAccessReleasetime'); $data = array_merge(self::$defaults, $data); - $f = new InputfieldCheckbox(); - $f->attr('id+name', 'autoAdd'); - $f->label = __('Mode'); - $f->label2 = __('Add to all templates automatically'); - $f->description = __('Enabling this feature will add the fields to every page automatically.'); - $f->value = $data['autoAdd']; - $checked = isset($data['autoAdd']) && $data['autoAdd'] == '' ? '' : 'checked'; - $f->attr('checked', $checked); - $form->add($f); - $f = new InputfieldAsmSelect(); $f->attr('id+name', 'templates'); $f->label = __('Templates'); - $f->description = __("Select all templates that should get the releasetime fields."); - $f->showIf = 'autoAdd=0'; + $f->description = __('Select all templates that should get the releasetime fields.'); // Dynamically check which templates have all releasetime-fields and check them afterwards: - $templatesWithFields = array(); + $templatesWithFields = []; - foreach(wire('templates') as $template) { + foreach (wire('templates') as $template) { // Exclude system templates: - if($template->flags & Template::flagSystem) continue; - $f->addOption($template->id, $template->getLabel() . ' (' . $template->name . ')'); - - // Check, if the template already has all releasetime-fields: - $allFieldsExistFlag = true; - foreach(self::fieldnames as $fieldname){ - if(!$template->hasField($fieldname)){ - $allFieldsExistFlag = false; - break; - } - } - - if($allFieldsExistFlag){ - $templatesWithFields[] = $template->id; - } + if ($template->flags & Template::flagSystem) { + continue; + } + $f->addOption($template->id, $template->getLabel() . ' (' . $template->name . ')'); + + // Check, if the template already has all releasetime-fields: + $allFieldsExistFlag = true; + foreach (self::fieldnames as $fieldname) { + if (!$template->hasField($fieldname)) { + $allFieldsExistFlag = false; + break; + } + } + + if ($allFieldsExistFlag) { + $templatesWithFields[] = $template->id; + } } $data['templates'] = $templatesWithFields; @@ -158,11 +155,12 @@ public static function getModuleConfigInputfields(array $data) { return $form; } - public function init() { - $this->addHookAfter("Modules::saveConfig", $this, "hookModulesSaveConfig"); + public function init() + { + $this->addHookAfter('Modules::saveConfig', $this, 'hookModulesSaveConfig'); // Move releasetime-fields to settings-tab - $this->addHookAfter("ProcessPageEdit::buildForm", $this, "moveFieldToSettings"); + $this->addHookAfter('ProcessPageEdit::buildForm', $this, 'moveFieldToSettings'); // Prevent unreleased pagse from being viewed $this->addHook('Page::viewable', $this, 'hookPageViewable'); @@ -189,22 +187,24 @@ public function init() { * @param HookEvent $event * */ - public function hookPageViewable(HookEvent $event) { + public function hookPageViewable(HookEvent $event) + { $page = $event->object; $viewable = $event->return; - if($viewable){ + if ($viewable) { // If the page would be viewable, additionally check Releasetime and User-Permission $viewable = $this->canUserSee($page); } $event->return = $viewable; } - public function hookPageListable(HookEvent $event) { + public function hookPageListable(HookEvent $event) + { $page = $event->object; $listable = $event->return; - if($listable){ + if ($listable) { // If the page would be listable, additionally check Releasetime and User-Permission $listable = $this->canUserSee($page); } @@ -217,9 +217,10 @@ public function hookPageListable(HookEvent $event) { * * @see https://processwire.com/talk/topic/15622-pagefilesecure-and-pageispublic-hook-not-working/ */ - public function hookPageIsPublic(HookEvent $event) { + public function hookPageIsPublic(HookEvent $event) + { $page = $event->object; - if($event->return && $this->isReleaseTimeSet($page)) { + if ($event->return && $this->isReleaseTimeSet($page)) { $event->return = false; } } @@ -231,9 +232,10 @@ public function hookPageIsPublic(HookEvent $event) { * * @see https://processwire.com/talk/topic/15622-pagefilesecure-and-pageispublic-hook-not-working/ */ - public function hookProcessPageViewSendFile(HookEvent $event) { + public function hookProcessPageViewSendFile(HookEvent $event) + { $page = $event->arguments[0]; - if(!$this->canUserSee($page)) { + if (!$this->canUserSee($page)) { throw new Wire404Exception($this->_('File not found')); } } @@ -244,11 +246,18 @@ public function hookProcessPageViewSendFile(HookEvent $event) { * @param User|boolean $user if no valid user is passed the current user will be used. * @return boolean */ - public function canUserSee(Page $page, $user = false){ - if(!$user instanceof User || !$user->id) $user = $this->wire('user'); - if($user->isSuperuser() || $user->hasPermission(self::permissionname)) return true; + public function canUserSee(Page $page, $user = false) + { + if (!$user instanceof User || !$user->id) { + $user = $this->wire('user'); + } + if ($user->isSuperuser() || $user->hasPermission(self::permissionname)) { + return true; + } - if(!$this->isReleased($page)) return false; + if (!$this->isReleased($page)) { + return false; + } return true; } @@ -258,12 +267,19 @@ public function canUserSee(Page $page, $user = false){ * @param Page $page * @return boolean */ - public function isReleased(Page $page){ - if(!$this->isReleasedSingle($page)) return false; + public function isReleased(Page $page) + { + if (!$this->isReleasedSingle($page)) { + return false; + } - foreach($page->parents as $parentPage){ - if(!($parentPage instanceof Page) || !$parentPage->id) continue; - if(!$this->isReleasedSingle($parentPage)) return false; + foreach ($page->parents as $parentPage) { + if (!($parentPage instanceof Page) || !$parentPage->id) { + continue; + } + if (!$this->isReleasedSingle($parentPage)) { + return false; + } } return true; @@ -274,10 +290,11 @@ public function isReleased(Page $page){ * @param Page $page * @return boolean */ - public function isReleasedSingle(Page $page){ - if($page->template->hasField('releasetime_start') && (!$page->template->hasField('releasetime_start_activate') || $page->releasetime_start_activate == true) && $page->releasetime_start > time()){ + public function isReleasedSingle(Page $page) + { + if ($page->template->hasField('releasetime_start') && (!$page->template->hasField('releasetime_start_activate') || $page->releasetime_start_activate == true) && $page->releasetime_start > time()) { return false; - }else if($page->template->hasField('releasetime_end') && (!$page->template->hasField('releasetime_end_activate') || $page->releasetime_end_activate == true) && $page->releasetime_end < time()){ + } else if ($page->template->hasField('releasetime_end') && (!$page->template->hasField('releasetime_end_activate') || $page->releasetime_end_activate == true) && $page->releasetime_end < time()) { return false; } @@ -289,12 +306,13 @@ public function isReleasedSingle(Page $page){ * @param Page $page * @return boolean */ - public function isReleaseTimeSet(Page $page){ - if($page->template->hasField('releasetime_start') && (!$page->template->hasField('releasetime_start_activate') || $page->releasetime_start_activate == true)){ + public function isReleaseTimeSet(Page $page) + { + if ($page->template->hasField('releasetime_start') && (!$page->template->hasField('releasetime_start_activate') || $page->releasetime_start_activate == true)) { return true; } - if($page->template->hasField('releasetime_end') && (!$page->template->hasField('releasetime_end_activate') || $page->releasetime_end_activate == true)){ + if ($page->template->hasField('releasetime_end') && (!$page->template->hasField('releasetime_end_activate') || $page->releasetime_end_activate == true)) { return true; } @@ -305,58 +323,24 @@ public function isReleaseTimeSet(Page $page){ * Adds releasetime-fields to the wanted templates after module's save * @param HookEvent $event */ - public function hookModulesSaveConfig(HookEvent $event){ + public function hookModulesSaveConfig(HookEvent $event) + { // Get the object the event occurred on, if needed $modules = $event->object; $data = $event->arguments(1); - // If auto-add is activated: Make fields global - if(isset($data['autoAdd']) && $data['autoAdd']){ - foreach(self::fieldnames as $fieldname){ - $field = $this->wire('fields')->get($fieldname); - if(!($field instanceof Field) || $field->name != $fieldname){ - continue; - } - - if($field->hasFlag(Field::flagGlobal)){ - // Field is already global - continue; - } - - $field->addFlag(Field::flagGlobal); - $field->save(); - } - return; - } - // auto-add is not activated. The fields should not be global an will be added manually. - foreach(self::fieldnames as $fieldname){ - $field = $this->wire('fields')->get($fieldname); - if(!($field instanceof Field) || $field->name != $fieldname){ - continue; - } - - if(!$field->hasFlag(Field::flagGlobal)){ - // Field is not global - continue; - } - - $field->removeFlag(Field::flagGlobal); - $field->save(); - } - - $savedTemplates = array(); - if(isset($data['templates']) && is_array($data['templates'])){ + $savedTemplates = []; + if (isset($data['templates']) && is_array($data['templates'])) { $savedTemplates = $data['templates']; } - foreach(wire('templates') as $template){ - if(array_search($template->id, $savedTemplates) !== false){ - + foreach (wire('templates') as $template) { + if (array_search($template->id, $savedTemplates) !== false) { // Fields should be added - foreach(self::fieldnames as $fieldname){ - if($template->hasField($fieldname)){ + foreach (self::fieldnames as $fieldname) { + if ($template->hasField($fieldname)) { // Field is already there continue; } @@ -364,18 +348,6 @@ public function hookModulesSaveConfig(HookEvent $event){ $template->fieldgroup->add($fieldname); $template->fieldgroup->save(); } - continue; - } - - // Fields should be removed - foreach(self::fieldnames as $fieldname){ - if(!$template->hasField($fieldname)){ - // Field was not added - continue; - } - - $template->fieldgroup->remove($fieldname); - $template->fieldgroup->save(); } } } @@ -384,19 +356,23 @@ public function hookModulesSaveConfig(HookEvent $event){ * Moves the releasetime-fields to the settings-tab * @param HookEvent $event */ - public function moveFieldToSettings(HookEvent $event) { + public function moveFieldToSettings(HookEvent $event) + { $form = $event->return; - $settings = $form->find("id=ProcessPageEditSettings")->first(); - if(!$settings) return; + $settings = $form->find('id=ProcessPageEditSettings')->first(); + if (!$settings) { + return; + } - foreach(self::fieldnames as $fieldname){ - $field = $form->find("name=".$fieldname)->first(); - if(!$field) continue; + foreach (self::fieldnames as $fieldname) { + $field = $form->find('name=' . $fieldname)->first(); + if (!$field) { + continue; + } $form->remove($field); $settings->append($field); } } - -} \ No newline at end of file +}