From a2da7f1a2281e8c0dc245130ccb10f4073cfa8b7 Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Fri, 2 Sep 2022 13:13:08 -0400 Subject: [PATCH] Various minor updates --- wire/core/Inputfield.php | 3 +- wire/core/Interfaces.php | 15 +++++ wire/core/Modules.php | 7 +- wire/core/PageArray.php | 65 +++++++++++-------- wire/core/PageProperties.php | 2 +- wire/core/Pagefile.php | 15 ++++- wire/core/WireData.php | 2 +- .../ProcessModule/ProcessModule.module | 28 +++++--- 8 files changed, 93 insertions(+), 44 deletions(-) diff --git a/wire/core/Inputfield.php b/wire/core/Inputfield.php index 9b396f32..8f8384e3 100644 --- a/wire/core/Inputfield.php +++ b/wire/core/Inputfield.php @@ -1242,7 +1242,8 @@ abstract class Inputfield extends WireData implements Module { */ public function getClassArray($property = 'class', $assoc = false) { $property = $this->getClassProperty($property); - $value = trim($property === 'class' ? $this->attr('class') : $this->getSetting($property)); + $value = ($property === 'class' ? $this->attr('class') : $this->getSetting($property)); + $value = trim("$value"); while(strpos($value, ' ') !== false) $value = str_replace(' ', ' ', $value); $classes = strlen($value) ? explode(' ', $value) : array(); if($assoc) { diff --git a/wire/core/Interfaces.php b/wire/core/Interfaces.php index 862e3f74..3a76aebd 100644 --- a/wire/core/Interfaces.php +++ b/wire/core/Interfaces.php @@ -392,10 +392,25 @@ interface WireDatabase { interface WirePageEditor { /** * @return Page The current page being edited + * */ public function getPage(); } +/** + * Interface indicates item stores in a WireArray or type descending from it + * + * @since 3.0.205 + * + */ +interface WireArrayItem { + /** + * @return WireArray + * + */ + public function getWireArray(); +} + /** * Interface shared by all ProcessWire Null objects * diff --git a/wire/core/Modules.php b/wire/core/Modules.php index 5d5c955e..6ad8b21a 100644 --- a/wire/core/Modules.php +++ b/wire/core/Modules.php @@ -1423,8 +1423,11 @@ class Modules extends WireArray { if(empty($options['noPermissionCheck'])) { // check that user has permission required to use module - if(!$this->hasPermission($module, $this->wire('user'), $this->wire('page'))) { - $error = $this->_('You do not have permission to execute this module') . ' - ' . wireClassName($module); + $page = $this->wire()->page; + $user = $this->wire()->user; + if(!$this->hasPermission($module, $user, $page)) { + $error = $this->_('You do not have permission to execute this module') . ' - ' . + wireClassName($module) . " (page=$page)"; if(empty($options['noThrow'])) throw new WirePermissionException($error); return empty($options['returnError']) ? null : $error; } diff --git a/wire/core/PageArray.php b/wire/core/PageArray.php index 08cc8240..3c165a50 100644 --- a/wire/core/PageArray.php +++ b/wire/core/PageArray.php @@ -84,7 +84,7 @@ class PageArray extends PaginatedArray implements WirePaginatable { * */ public function isValidItem($item) { - return is_object($item) && $item instanceof Page; + return $item instanceof Page; } /** @@ -123,7 +123,7 @@ class PageArray extends PaginatedArray implements WirePaginatable { // given item exists in this PageArray (or at least has) $key = $this->keyIndex[$id]; if(isset($this->data[$key])) { - $page = $this->data[$key]; /** @var Page $page */ + $page = $this->data[$key]; if($page->id === $id) { // found it return $key; @@ -188,17 +188,17 @@ class PageArray extends PaginatedArray implements WirePaginatable { * * #pw-internal * - * @param array|PageArray|Page $pages Pages to import. + * @param array|PageArray|Page $items Pages to import. * @return PageArray reference to current instance. * */ - public function import($pages) { - if(is_object($pages) && $pages instanceof Page) $pages = array($pages); - if(!self::iterable($pages)) return $this; - foreach($pages as $page) $this->add($page); - if($pages instanceof PageArray) { - if(count($pages) < $pages->getTotal()) { - $this->setTotal($this->getTotal() + ($pages->getTotal() - count($pages))); + public function import($items) { + if($items instanceof Page) $items = array($items); + if(!self::iterable($items)) return $this; + foreach($items as $page) $this->add($page); + if($items instanceof PageArray) { + if(count($items) < $items->getTotal()) { + $this->setTotal($this->getTotal() + ($items->getTotal() - count($items))); } } return $this; @@ -213,7 +213,7 @@ class PageArray extends PaginatedArray implements WirePaginatable { * @return bool True if the index or Page exists here, false if not. */ public function has($key) { - if(is_object($key) && $key instanceof Page) { + if($key instanceof Page) { return $this->getItemKey($key) !== null; } return parent::has($key); @@ -236,24 +236,25 @@ class PageArray extends PaginatedArray implements WirePaginatable { * $pageArray->add(1005); * ~~~~~ * - * @param Page|PageArray|int $page Page object, PageArray object, or Page ID. + * @param Page|PageArray|int $item Page object, PageArray object, or Page ID. * - If given a `Page`, the Page will be added. * - If given a `PageArray`, it will do the same thing as the `WireArray::import()` method and append all the pages. * - If Page `ID`, the Page identified by that ID will be loaded and added to the PageArray. * @return $this */ - public function add($page) { + public function add($item) { - if($this->isValidItem($page)) { - parent::add($page); + if($this->isValidItem($item)) { + parent::add($item); - } else if($page instanceof PageArray || is_array($page)) { - return $this->import($page); + } else if($item instanceof PageArray || is_array($item)) { + return $this->import($item); - } else if(ctype_digit("$page")) { - $page = $this->wire()->pages->get("id=$page"); - if($page->id) parent::add($page); + } else if(ctype_digit("$item")) { + $item = $this->wire()->pages->get("id=$item"); + if($item->id) parent::add($item); } + return $this; } @@ -285,7 +286,9 @@ class PageArray extends PaginatedArray implements WirePaginatable { * */ public function findRandom($num) { - return parent::findRandom($num); + /** @var PageArray $value */ + $value = parent::findRandom($num); + return $value; } /** @@ -302,7 +305,9 @@ class PageArray extends PaginatedArray implements WirePaginatable { * */ public function slice($start, $limit = 0) { - return parent::slice($start, $limit); + /** @var PageArray $value */ + $value = parent::slice($start, $limit); + return $value; } /** @@ -317,7 +322,9 @@ class PageArray extends PaginatedArray implements WirePaginatable { * */ public function eq($num) { - return parent::eq($num); + /** @var Page $value */ + $value = parent::eq($num); + return $value; } /** @@ -453,7 +460,9 @@ class PageArray extends PaginatedArray implements WirePaginatable { * */ public function find($selector) { - return parent::find($selector); + /** @var PageArray $value */ + $value = parent::find($selector); + return $value; } /** @@ -467,7 +476,9 @@ class PageArray extends PaginatedArray implements WirePaginatable { * */ public function findOne($selector) { - return parent::findOne($selector); + /** @var Page|bool $value */ + $value = parent::findOne($selector); + return $value; } /** @@ -611,7 +622,7 @@ class PageArray extends PaginatedArray implements WirePaginatable { */ public function __toString() { $s = ''; - foreach($this as $key => $page) $s .= "$page|"; + foreach($this as $page) $s .= "$page|"; $s = rtrim($s, "|"); return $s; } @@ -698,7 +709,6 @@ class PageArray extends PaginatedArray implements WirePaginatable { protected function trackAdd($item, $key) { parent::trackAdd($item, $key); if(!$item instanceof Page) return; - /** @var Page $item */ if(!isset($this->keyIndex[$item->id])) $this->numTotal++; $this->keyIndex[$item->id] = $key; } @@ -713,7 +723,6 @@ class PageArray extends PaginatedArray implements WirePaginatable { protected function trackRemove($item, $key) { parent::trackRemove($item, $key); if(!$item instanceof Page) return; - /** @var Page $item */ if(isset($this->keyIndex[$item->id])) { if($this->numTotal) $this->numTotal--; unset($this->keyIndex[$item->id]); diff --git a/wire/core/PageProperties.php b/wire/core/PageProperties.php index b8aef473..216c8d20 100644 --- a/wire/core/PageProperties.php +++ b/wire/core/PageProperties.php @@ -248,4 +248,4 @@ abstract class PageProperties { if($remainder > 1) $names[$remainder] = "unknown-$remainder"; return $names; } -} \ No newline at end of file +} diff --git a/wire/core/Pagefile.php b/wire/core/Pagefile.php index 34aba5e3..bb51cd48 100644 --- a/wire/core/Pagefile.php +++ b/wire/core/Pagefile.php @@ -52,7 +52,7 @@ * */ -class Pagefile extends WireData { +class Pagefile extends WireData implements WireArrayItem { /** * Timestamp 'created' used by pagefiles that are temporary, not yet published @@ -1450,6 +1450,19 @@ class Pagefile extends WireData { return $this->get($key) !== null; } + /** + * For WireArrayItem interface + * + * #pw-internal + * + * @return Pagefiles + * @since 3.0.205 + * + */ + public function getWireArray() { + return $this->pagefiles; + } + /** * Debug info * diff --git a/wire/core/WireData.php b/wire/core/WireData.php index c7de54eb..2d4cde36 100644 --- a/wire/core/WireData.php +++ b/wire/core/WireData.php @@ -87,7 +87,7 @@ class WireData extends Wire implements \IteratorAggregate, \ArrayAccess { */ public function setQuietly($key, $value) { $track = $this->trackChanges(); - $this->setTrackChanges(false); + if($track) $this->setTrackChanges(false); $this->set($key, $value); if($track) $this->setTrackChanges(true); return $this; diff --git a/wire/modules/Process/ProcessModule/ProcessModule.module b/wire/modules/Process/ProcessModule/ProcessModule.module index 9e0d53a1..3207adbc 100644 --- a/wire/modules/Process/ProcessModule/ProcessModule.module +++ b/wire/modules/Process/ProcessModule/ProcessModule.module @@ -132,6 +132,7 @@ class ProcessModule extends Process { * */ public function __construct() { + parent::__construct(); $this->labels['download'] = $this->_('Download'); $this->labels['download_install'] = $this->_('Download and Install'); $this->labels['get_module_info'] = $this->_('Get Module Info'); @@ -155,7 +156,7 @@ class ProcessModule extends Process { $this->labels['install'] = $this->_('Install'); // Label for Install tab $this->labels['cancel'] = $this->_('Cancel'); // Label for Cancel button - require(dirname(__FILE__) . '/ProcessModuleInstall.php'); + require_once(dirname(__FILE__) . '/ProcessModuleInstall.php'); } /** @@ -292,6 +293,7 @@ class ProcessModule extends Process { $session = $this->wire()->session; $sanitizer = $this->wire()->sanitizer; $input = $this->wire()->input; + $config = $this->wire()->config; foreach($modules as $module) { $this->modulesArray[$module->className()] = 1; @@ -353,7 +355,7 @@ class ProcessModule extends Process { if($input->post('clear_file_compiler')) { $session->CSRF->validate(); /** @var FileCompiler $compiler */ - $compiler = $this->wire(new FileCompiler($this->wire('config')->paths->siteModules)); + $compiler = $this->wire(new FileCompiler($config->paths->siteModules)); $compiler->clearCache(true); $session->message($this->_('Cleared file compiler cache')); $session->redirect('./'); @@ -430,7 +432,7 @@ class ProcessModule extends Process { $info = $modules->getModuleInfoVerbose($name); - $isNew = !$info['core'] || ($info['core'] && in_array($name, $this->newCoreModules)); + $isNew = !$info['core'] || in_array($name, $this->newCoreModules); if($isNew) $isNew = $info['created'] > 0 && $info['created'] > (time()-$newSeconds); if($isNew) $newModulesArray[$name] = $installed; @@ -509,7 +511,8 @@ class ProcessModule extends Process { $form->add($tab); // configurable - + + /** @var InputfieldWrapper $tab */ $tab = $this->wire(new InputfieldWrapper()); $tab->attr('id', 'tab_configurable_modules'); $tab->attr('title', $this->labels['configure']); @@ -528,6 +531,7 @@ class ProcessModule extends Process { // installable + /** @var InputfieldWrapper $tab */ $tab = $this->wire(new InputfieldWrapper()); $tab->attr('id', 'tab_install_modules'); $tabLabel = $this->labels['install']; @@ -558,6 +562,7 @@ class ProcessModule extends Process { dirname(str_replace($rootPath, '/', $item['file'])) . '/' ); } + /** @var InputfieldWrapper $tab */ $tab = $this->wire(new InputfieldWrapper()); $tab->attr('id', 'tab_missing_modules'); $tabLabel = $this->_('Missing'); @@ -675,7 +680,7 @@ class ProcessModule extends Process { $f->label = $this->_('Module ZIP file URL'); $f->description = $this->_('Download a ZIP file containing a module. If you download a module that is already installed, the installed version will be overwritten with the newly downloaded version.'); $f->notes = $trustNote; - $f->attr('placeholder', $this->_('http://domain.com/ModuleName.zip')); // placeholder + $f->attr('placeholder', $this->_('https://domain.com/ModuleName.zip')); // placeholder $f->required = false; $fieldset->add($f); @@ -837,6 +842,7 @@ class ProcessModule extends Process { $section = $matches[1]; $sections[] = $section; if($table) $out .= $table->render() . ""; + /** @var MarkupAdminDataTable $table */ $table = $modules->get("MarkupAdminDataTable"); $table->setEncodeEntities(false); $table->headerRow($tableHeader); @@ -847,7 +853,7 @@ class ProcessModule extends Process { $info = $modules->getModuleInfoVerbose($name); $configurable = $info['configurable']; $title = !empty($info['title']) ? $sanitizer->entities1($info['title']) : substr($name, strlen($section)); - $title = "$title"; + $title = "$title"; if($options['allowClasses']) $title .= "
$name"; if($info['icon']) $title = wireIconMarkup($info['icon'], 'fw') . " $title"; $class = $configurable ? 'ConfigurableModule' : ''; @@ -1030,7 +1036,7 @@ class ProcessModule extends Process { $info = self::getModuleInfo(); $this->headline($this->labels['download_install']); $this->breadcrumb('./', $info['title']); - if($update) $this->breadcrumb("./?edit=$name", $name); + if($update) $this->breadcrumb("./?edit=$name", $name); $redirectURL = $update ? "./edit?name=$name" : "./"; $className = $name; @@ -1057,7 +1063,7 @@ class ProcessModule extends Process { $installable = true; foreach($data['categories'] as $category) { if(!in_array($category['name'], $this->uninstallableCategories)) continue; - $this->error(sprintf($this->_('Sorry modules of type "%s" are not installable from the admin.'), $category['title'])); + $this->error(sprintf($this->_('Sorry, modules of type "%s" are not installable from the admin.'), $category['title'])); $installable = false; } if(!$installable) $session->redirect($redirectURL); @@ -1424,7 +1430,6 @@ class ProcessModule extends Process { foreach($moduleInfo as $key => $value) { if(isset($moduleInfoVerbose[$key]) && $moduleInfoVerbose[$key] !== $value) { unset($moduleInfo[$key]); - continue; } else if(empty($value)) { if($value === "0" || $value === 0 || $value === false) continue; unset($moduleInfo[$key]); @@ -1752,6 +1757,7 @@ class ProcessModule extends Process { foreach($fields->getAll() as $field) { if(!$field->getSetting('useLanguages')) continue; foreach($languages as $language) { + /** @var Language $language */ if($language->isDefault()) continue; $name = $field->name . '__' . $language->id; if(!isset($data[$name])) continue; @@ -1781,6 +1787,7 @@ class ProcessModule extends Process { if($languages && $field->getSetting('useLanguages')) { $_name = $name; foreach($languages as $language) { + /** @var Language $language */ if($language->isDefault()) continue; $name = $_name . "__" . $language->id; $value = $field->get("value$language->id"); @@ -2046,6 +2053,7 @@ class ProcessModule extends Process { $form->description = sprintf($this->_('Import translations for module %s'), $moduleName); foreach($languages as $language) { + /** @var Language $language */ /** @var InputfieldSelect $lang */ $langLabel = $language->get('title'); $langLabel .= $langLabel ? " ($language->name)" : $language->name; @@ -2096,7 +2104,7 @@ class ProcessModule extends Process { * method can return false. * * @param Page $page - * @return bool|string + * @return string * @sine 3.0.167 * */