diff --git a/wire/config.php b/wire/config.php index 05da4841..01cb5ef5 100644 --- a/wire/config.php +++ b/wire/config.php @@ -142,6 +142,25 @@ $config->useFunctionsAPI = false; */ $config->useMarkupRegions = false; +/** + * Use custom page classes? Specify boolean true to enable. + * + * When enabled, if a class with name "[TemplateName]Page" (in ProcessWire namespace) exists + * in /site/classes/[TemplateName]Page.php, and it extends ProcessWire’s Page class, then the + * Page will be created with that class rather than the default Page class. For instance, + * template “home” would look for a class named “HomePage” and template "blog-post" (or + * "blog_post") would look for a class named “BlogPostPage” (file: BlogPostPage.php). + * + * If you create a file named /site/classes/DefaultPage.php with a DefaultPage class within + * it (that extends Page), then it will be used for all pages that would otherwise use the + * `Page` class. + * + * @var bool|string + * @since 3.0.152 + * + */ +$config->usePageClasses = false; + /** * Disable all HTTPS requirements? * diff --git a/wire/core/Config.php b/wire/core/Config.php index a4a4e191..f81dc572 100644 --- a/wire/core/Config.php +++ b/wire/core/Config.php @@ -143,6 +143,7 @@ * @property bool $usePoweredBy Use the x-powered-by header? Set to false to disable. #pw-group-system * @property bool $useFunctionsAPI Allow most API variables to be accessed as functions? (see /wire/core/FunctionsAPI.php) #pw-group-system * @property bool $useMarkupRegions Enable support for front-end markup regions? #pw-group-system + * @property bool $usePageClasses Use custom Page classes in `/site/classes/[TemplateName]Page.php`? #pw-group-system #since 3.0.152 * @property int $lazyPageChunkSize Chunk size for for $pages->findMany() calls. #pw-group-system * * @property string $userAuthSalt Salt generated at install time to be used as a secondary/non-database salt for the password system. #pw-group-session diff --git a/wire/core/Pages.php b/wire/core/Pages.php index 4cb32618..4d119533 100644 --- a/wire/core/Pages.php +++ b/wire/core/Pages.php @@ -1239,30 +1239,43 @@ class Pages extends Wire { * * #pw-internal * - * @param array $options Optionally specify array of any of the following: - * - `pageClass` (string): Class to use for Page object (default='Page'). - * - `template` (Template|id|string): Template to use. - * - Plus any other Page properties or fields you want to set at this time + * @param array|string|Template $options Optionally specify array of any of the following: + * - `template` (Template|id|string): Template to use via object, ID or name. + * - `pageClass` (string): Class to use for Page. If not specified, default is from template setting, or 'Page' if no template. + * - Any other Page properties or fields you want to set (parent, name, title, etc.). Note that most page fields will need to + * have a `template` set first, so make sure to include it in your options array when providing other fields. + * - In PW 3.0.152+ you may specify the Template object, name or ID instead of an $options array. * @return Page * */ - public function newPage(array $options = array()) { - $class = 'Page'; - if(!empty($options['pageClass'])) $class = $options['pageClass']; - if(isset($options['template'])) { + public function newPage($options = array()) { + if(!is_array($options)) { + if(is_object($options) && $options instanceof Template) { + $options = array('template' => $options); + } else if($options && (is_string($options) || is_int($options))) { + $options = array('template' => $options); + } else { + $options = array(); + } + } + if(!empty($options['pageClass'])) { + $class = $options['pageClass']; + } else { + $class = 'Page'; + } + if(!empty($options['template'])) { $template = $options['template']; if(!is_object($template)) { $template = empty($template) ? null : $this->wire('templates')->get($template); } - if($template && empty($options['pageClass']) && $template->pageClass) { - $class = $template->pageClass; - if(!wireClassExists($class)) $class = 'Page'; - } + if($template && empty($options['pageClass'])) { + $class = $template->getPageClass(); + } } else { $template = null; } - $class = wireClassName($class, true); + if(strpos($class, "\\") === false) $class = wireClassName($class, true); $page = $this->wire(new $class($template)); if(!$page instanceof Page) $page = $this->wire(new Page($template)); diff --git a/wire/core/PagesEditor.php b/wire/core/PagesEditor.php index 4c401a35..7c1cbc2e 100644 --- a/wire/core/PagesEditor.php +++ b/wire/core/PagesEditor.php @@ -75,12 +75,7 @@ class PagesEditor extends Wire { if(!$template) throw new WireException("Unknown template"); } - $pageClass = wireClassName($template->pageClass ? $template->pageClass : 'Page', true); - - $page = $this->pages->newPage(array( - 'template' => $template, - 'pageClass' => $pageClass - )); + $page = $this->pages->newPage($template); $page->parent = $parent; $exceptionMessage = "Unable to add new page using template '$template' and parent '{$page->parent->path}'."; diff --git a/wire/core/PagesLoader.php b/wire/core/PagesLoader.php index 79503006..97e55dad 100644 --- a/wire/core/PagesLoader.php +++ b/wire/core/PagesLoader.php @@ -267,10 +267,15 @@ class PagesLoader extends Wire { $profilerEvent = $profiler ? $profiler->start("$caller($selectorString)", "Pages") : null; if(($lazy || $findIDs) && strpos($selectorString, 'limit=') === false) $options['getTotal'] = false; - - if($lazy || $findIDs === 1) { - $pagesIDs = $pageFinder->findIDs($selectors, $options); + + if($lazy) { + // [ pageID => templateID ] + $pagesIDs = $pageFinder->findTemplateIDs($selectors, $options); + } else if($findIDs === 1) { + // [ pageID ] + $pagesIDs = $pageFinder->findIDs($selectors, $options); } else { + // [ [ 'id' => 3, 'templates_id' => 2, 'parent_id' => 1 ] $pagesInfo = $pageFinder->find($selectors, $options); } @@ -292,9 +297,16 @@ class PagesLoader extends Wire { $loadPages = false; $cachePages = false; $template = null; + $templatesByID = array(); - foreach($pagesIDs as $id) { - $page = $this->pages->newPage(); + foreach($pagesIDs as $id => $templateID) { + if(isset($templatesByID[$templateID])) { + $template = $templatesByID[$templateID]; + } else { + $template = $this->wire('templates')->get($templateID); + $templatesByID[$templateID] = $template; + } + $page = $this->pages->newPage($template); $page->_lazy($id); $page->loaderCache = false; $pages->add($page); @@ -302,6 +314,7 @@ class PagesLoader extends Wire { $pages->setDuplicateChecking(true); if(count($pagesIDs)) $pages->_lazy(true); + unset($template, $templatesByID); } else if($findIDs) { @@ -553,6 +566,9 @@ class PagesLoader extends Wire { 'pageArrayClass' => 'PageArray', 'caller' => '', ); + + /** @var Templates $templates */ + $templates = $this->wire('templates'); if(is_array($template)) { // $template property specifies an array of options @@ -570,7 +586,7 @@ class PagesLoader extends Wire { if(!is_null($template) && !is_object($template)) { // convert template string or id to Template object - $template = $this->wire('templates')->get($template); + $template = $templates->get($template); } if(is_string($_ids)) { @@ -696,7 +712,7 @@ class PagesLoader extends Wire { foreach($idsByTemplate as $templates_id => $ids) { if($templates_id && (!$template || $template->id != $templates_id)) { - $template = $this->wire('templates')->get($templates_id); + $template = $templates->get($templates_id); } if($template) { @@ -748,25 +764,8 @@ class PagesLoader extends Wire { $database->execute($stmt); $class = $options['pageClass']; - if(empty($class)) { - if($template) { - $class = ($template->pageClass && wireClassExists($template->pageClass)) ? $template->pageClass : 'Page'; - } else { - $class = 'Page'; - } - } + if(empty($class)) $class = $template ? $template->getPageClass() : __NAMESPACE__ . "\\Page"; - $_class = wireClassName($class, true); - if($class != 'Page' && !wireClassExists($_class)) { - if(class_exists("\\$class")) { - $_class = "\\$class"; - } else { - $this->error("Class '$class' for Pages::getById() does not exist", Notice::log); - $class = 'Page'; - $_class = wireClassName($class, true); - } - } - // page to populate, if provided in 'getOne' mode /** @var Page|null $_page */ $_page = $options['getOne'] && $options['page'] && $options['page'] instanceof Page ? $options['page'] : null; @@ -781,9 +780,11 @@ class PagesLoader extends Wire { $page->set('template', $template ? $template : $row['templates_id']); } else { // create new Page object + $pageTemplate = $template ? $template : $templates->get((int) $row['templates_id']); + $pageClass = empty($options['pageClass']) && $pageTemplate ? $pageTemplate->getPageClass() : $class; $page = $this->pages->newPage(array( - 'pageClass' => $_class, - 'template' => $template ? $template : $row['templates_id'], + 'pageClass' => $pageClass, + 'template' => $pageTemplate ? $pageTemplate : $row['templates_id'], )); } unset($row['templates_id']); @@ -902,7 +903,7 @@ class PagesLoader extends Wire { if($languageID) $languages->unsetLanguage(); return $path; - } else if($id == $homepageID && $languages && !$languageID) { + } else if($id === $homepageID && $languages && !$languageID) { // default language in multi-language environment, let $page handle it since there is additional // hooked logic there provided by LanguageSupportPageNames $page = $this->pages->get($homepageID); diff --git a/wire/core/PagesType.php b/wire/core/PagesType.php index 1724677b..3b7eaa87 100644 --- a/wire/core/PagesType.php +++ b/wire/core/PagesType.php @@ -274,17 +274,29 @@ class PagesType extends Wire implements \IteratorAggregate, \Countable { $pageClass = $page->className(); if($this->pageClass && $pageClass === $this->pageClass) return true; $valid = false; + foreach($this->templates as $template) { /** @var Template $template */ if($template->pageClass) { // template specifies a class - if($template->pageClass === $pageClass) $valid = true; - } else { + if($template->pageClass === $pageClass) { + $valid = true; + } else if(wireInstanceOf($page, $template->pageClass)) { + $valid = true; + } + } else if($pageClass === 'Page') { // template specifies NO Page class, which implies "Page" as a class name is valid - if($pageClass === 'Page') $valid = true; + $valid = true; + } else { + // page has some other class name + $className = $template->getPageClass(); + if(wireClassName($className) === $pageClass || wireInstanceOf($page, $className)) { + $valid = true; + } } if($valid) break; } + return $valid; } @@ -588,8 +600,13 @@ class PagesType extends Wire implements \IteratorAggregate, \Countable { * */ public function getPageClass() { + if($this->template) { + if($this->pageClass && !$this->template->pageClass) { + $this->template->pageClass = $this->pageClass; + } + return $this->template->getPageClass(false); + } if($this->pageClass) return $this->pageClass; - if($this->template && $this->template->pageClass) return $this->template->pageClass; return 'Page'; } diff --git a/wire/core/Paths.php b/wire/core/Paths.php index f6f4f60b..6a4056d6 100644 --- a/wire/core/Paths.php +++ b/wire/core/Paths.php @@ -48,7 +48,7 @@ * * #pw-body * - * ProcessWire 3.x, Copyright 2019 by Ryan Cramer + * ProcessWire 3.x, Copyright 2020 by Ryan Cramer * https://processwire.com * * This file is licensed under the MIT license @@ -68,6 +68,7 @@ * @property string $files Site-specific files: /site/assets/files/ * @property string $tmp Temporary files: /site/assets/tmp/ #pw-group-paths-only * @property string $sessions Session files: /site/assets/sessions/ #pw-group-paths-only + * @property string $classes Site-specific class files: /site/classes/ #pw-group-paths-only * * The following properties are only in $config->urls * ================================================== diff --git a/wire/core/Process.php b/wire/core/Process.php index 997be55a..0a479679 100644 --- a/wire/core/Process.php +++ b/wire/core/Process.php @@ -13,7 +13,7 @@ * Please be sure to see the `Module` interface for full details on methods you can specify in a Process module. * #pw-body * - * ProcessWire 3.x, Copyright 2016 by Ryan Cramer + * ProcessWire 3.x, Copyright 2020 by Ryan Cramer * https://processwire.com * * This file is licensed under the MIT license @@ -371,8 +371,7 @@ abstract class Process extends WireData implements Module { if(!$parent || !$parent->id) $parent = $adminPage; // default $page = $parent->child("include=all, name=$name"); // does it already exist? if($page->id && "$page->process" == "$this") return $page; // return existing copy - $page = $this->wire('pages')->newPage(); - $page->template = $template ? $template : 'admin'; + $page = $this->wire('pages')->newPage($template ? $template : 'admin'); $page->name = $name; $page->parent = $parent; $page->process = $this; diff --git a/wire/core/ProcessWire.php b/wire/core/ProcessWire.php index f14e03e5..d2ba8365 100644 --- a/wire/core/ProcessWire.php +++ b/wire/core/ProcessWire.php @@ -258,9 +258,14 @@ class ProcessWire extends Wire { $this->fuel = new Fuel(); $this->fuel->set('wire', $this, true); + /** @var WireClassLoader $classLoader */ $classLoader = $this->wire('classLoader', new WireClassLoader($this), true); $classLoader->addNamespace((strlen(__NAMESPACE__) ? __NAMESPACE__ : "\\"), PROCESSWIRE_CORE_PATH); + if($config->usePageClasses) { + $classLoader->addSuffix('Page', $config->paths->classes); + } + $this->wire('hooks', new WireHooks($this, $config), true); $this->setConfig($config); @@ -1101,6 +1106,7 @@ class ProcessWire extends Wire { $cfg['paths'] = clone $cfg['urls']; $cfg['paths']->set('root', $rootPath . '/'); $cfg['paths']->data('sessions', $cfg['paths']->assets . "sessions/"); + $cfg['paths']->data('classes', $cfg['paths']->site . "classes/"); // Styles and scripts are CSS and JS files, as used by the admin application. // But reserved here if needed by other apps and templates. diff --git a/wire/core/Template.php b/wire/core/Template.php index b863523f..614a0997 100644 --- a/wire/core/Template.php +++ b/wire/core/Template.php @@ -1177,6 +1177,23 @@ class Template extends WireData implements Saveable, Exportable { $langs->add($languages->getDefault()); return $langs; } + + /** + * Get class name to use for Page objects using this template + * + * Note that value can be different from the `$template->pageClass` property, since it is determined at runtime. + * If it is different, then it is at least a class that extends the one defined by the pageClass property. + * + * #pw-group-identification + * + * @param bool $withNamespace Returned class includes namespace? (default=true) + * @return string Returned page class includes namespace + * @since 3.0.152 + * + */ + public function getPageClass($withNamespace = true) { + return $this->wire('templates')->getPageClass($this, $withNamespace); + } /** * Set the icon to use with this template diff --git a/wire/core/Templates.php b/wire/core/Templates.php index 6b5d9e05..edd7dc50 100644 --- a/wire/core/Templates.php +++ b/wire/core/Templates.php @@ -41,6 +41,14 @@ class Templates extends WireSaveableItems { */ protected $fileModTemplates = array(); + /** + * Cached template ID to page class names (for getPageClass method) + * + * @var array + * + */ + protected $pageClassNames = array(); + /** * Construct the Templates * @@ -532,7 +540,7 @@ class Templates extends WireSaveableItems { if($checkAccess) { if($parentPage->id) { // single defined parent - $p = $this->wire('pages')->newPage(array('template' => $template)); + $p = $this->wire('pages')->newPage($template); if(!$parentPage->addable($p)) continue; } else { // multiple possible parents @@ -546,7 +554,7 @@ class Templates extends WireSaveableItems { } if($checkAccess && $getAll && $foundParents && $foundParents->count()) { - $p = $this->wire('pages')->newPage(array('template' => $template)); + $p = $this->wire('pages')->newPage($template); foreach($foundParents as $parentPage) { if(!$parentPage->addable($p)) $foundParents->remove($parentPage); } @@ -572,6 +580,87 @@ class Templates extends WireSaveableItems { return $this->getParentPage($template, $checkAccess, $getAll); } + /** + * Get class name to use for pages using given Template + * + * Note that value can be different from the `$template->pageClass` property, since it is determined at runtime. + * If it is different, then it is at least a class that extends the one defined by pageClass. + * + * @param Template $template + * @param bool $withNamespace Include namespace? (default=true) + * @return string Returned class name includes namespace + * @since 3.0.152 + * + */ + public function getPageClass(Template $template, $withNamespace = true) { + + if(isset($this->pageClassNames[$template->id])) { + // use cached value when present + $pageClass = $this->pageClassNames[$template->id]; + if(!$withNamespace) $pageClass = wireClassName($pageClass, false); + return $pageClass; + } + + $corePageClass = __NAMESPACE__ . "\\Page"; + + // first check for class defined with Template 'pageClass' setting + $pageClass = $template->pageClass; + + if($pageClass && $pageClass !== 'Page') { + // page has custom class assignment in its template + $nsPageClass = wireClassName($pageClass, true); + // is this custom class available for instantiation? + if(class_exists($nsPageClass)) { + // class is available for use and has a namespace + $pageClass = $nsPageClass; + } else if(class_exists("\\$pageClass") && wireInstanceOf("\\$pageClass", $corePageClass)) { + // class appears to be available in root namespace and it extends PW’s Page class (legacy) + $pageClass = "\\$pageClass"; + } else { + // class is not available for instantiation + $pageClass = ''; + } + } + + $config = $this->wire('config'); + $usePageClasses = $config->usePageClasses; + + if(empty($pageClass) || $pageClass === 'Page') { + // if no custom Page class available, use default Page class with namespace + if($usePageClasses) { + // custom classes enabled + if(!isset($this->pageClassNames[0])) { + // index 0 holds cached default page class + $defaultPageClass = __NAMESPACE__ . "\\DefaultPage"; + if(!class_exists($defaultPageClass) || !wireInstanceOf($defaultPageClass, $corePageClass)) { + $defaultPageClass = $corePageClass; + } + $this->pageClassNames[0] = $defaultPageClass; + } + $pageClass = $this->pageClassNames[0]; + } else { + $pageClass = $corePageClass; + } + } + + // determine if custom class available (3.0.152+) + if($usePageClasses) { + // generate a CamelCase name + 'Page' from template name, i.e. 'blog-post' => 'BlogPostPage' + $className = ucwords(str_replace(array('-', '_', '.'), ' ', $template->name)); + $className = __NAMESPACE__ . "\\" . str_replace(' ', '', $className) . 'Page'; + if(class_exists($className) && wireInstanceOf($className, $corePageClass)) { + $pageClass = $className; + } + } + + if($template->id) $this->pageClassNames[$template->id] = $pageClass; + + if(!$withNamespace) $pageClass = wireClassName($pageClass, false); + + return $pageClass; + } + + /** * Set a Permission for a Template for and specific Role * diff --git a/wire/core/Users.php b/wire/core/Users.php index 5d41cc33..9889bd42 100644 --- a/wire/core/Users.php +++ b/wire/core/Users.php @@ -134,9 +134,12 @@ class Users extends PagesType { * */ public function newUser() { + $template = $this->wire('templates')->get('user'); + $pageClass = $template ? $template->getPageClass(false) : 'User'; + if($pageClass !== 'User' && strpos($pageClass, 'User') === false) $pageClass = 'User'; return $this->wire('pages')->newPage(array( 'template' => 'user', - 'pageClass' => 'User' + 'pageClass' => $pageClass )); } diff --git a/wire/modules/Fieldtype/FieldtypeFile.module b/wire/modules/Fieldtype/FieldtypeFile.module index cd6b6adc..4db9c050 100644 --- a/wire/modules/Fieldtype/FieldtypeFile.module +++ b/wire/modules/Fieldtype/FieldtypeFile.module @@ -1064,8 +1064,7 @@ class FieldtypeFile extends FieldtypeMulti implements ConfigurableModule { * */ public function getFieldsPage(Field $field) { - $page = new Page(); - $page->template = $this->getFieldsTemplate($field); + $page = $this->wire('pages')->newPage($this->getFieldsTemplate($field)); $page->status = Page::statusOn | Page::statusCorrupted; // corrupted status prevents saving return $page; } diff --git a/wire/modules/Fieldtype/FieldtypePage.module b/wire/modules/Fieldtype/FieldtypePage.module index a17ed2b4..d27ddc94 100644 --- a/wire/modules/Fieldtype/FieldtypePage.module +++ b/wire/modules/Fieldtype/FieldtypePage.module @@ -519,7 +519,7 @@ class FieldtypePage extends FieldtypeMulti implements Module, ConfigurableModule $template = $this->wire('templates')->get((int) $field->get('template_id')); $parent = $this->wire('pages')->get((int) $parent_id); if($template && $parent->id) { - $result = $this->wire('pages')->newPage(array('template' => $template)); + $result = $this->wire('pages')->newPage($template); $result->parent = $parent; $result->title = $value; $result->name = $this->wire('sanitizer')->pageNameUTF8($value); diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module b/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module index a82ba806..0811ed99 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module +++ b/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module @@ -1068,7 +1068,7 @@ class FieldtypeRepeater extends Fieldtype implements ConfigurableModule { $parent = $repeaterParent->child('name=' . self::repeaterPageNamePrefix . $page->id . ', include=all'); if($parent->id) return $parent; - $parent = $this->wire('pages')->newPage(array('template' => $repeaterParent->template)); + $parent = $this->wire('pages')->newPage($repeaterParent->template); $parent->parent = $repeaterParent; $parent->name = self::repeaterPageNamePrefix . $page->id; $parent->title = $page->name; @@ -1112,7 +1112,7 @@ class FieldtypeRepeater extends Fieldtype implements ConfigurableModule { $parent = $repeatersRootPage->child("name=$parentName, include=all"); if(!$parent->id) { - $parent = $this->wire('pages')->newPage(array('template' => $repeatersRootPage->template)); + $parent = $this->wire('pages')->newPage($repeatersRootPage->template); $parent->parent = $repeatersRootPage; $parent->name = $parentName; $parent->title = $field->name; @@ -1935,7 +1935,7 @@ class FieldtypeRepeater extends Fieldtype implements ConfigurableModule { $page = $adminRoot->child("name=repeaters, template=admin, include=all"); if(!$page->id) { - $page = $pages->newPage(array('template' => 'admin')); + $page = $pages->newPage('admin'); $page->parent = $adminRoot; $page->status = Page::statusHidden | Page::statusLocked | Page::statusSystemID; $page->name = 'repeaters'; diff --git a/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module b/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module index 8aca8578..b4def739 100644 --- a/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module +++ b/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module @@ -691,9 +691,7 @@ class InputfieldPage extends Inputfield implements ConfigurableModule { $parent = $this->wire('pages')->get($parent_id); - $test = $this->wire('pages')->newPage(array( - 'template' => $this->wire('templates')->get($template_id) - )); + $test = $this->wire('pages')->newPage($template_id); $test->parent = $parent; $test->id = -1; // prevents permissions check from failing @@ -877,12 +875,13 @@ class InputfieldPage extends Inputfield implements ConfigurableModule { } // create a new page - $page = $this->wire('pages')->newPage(); - $page->template = $template_id; - $page->parent = $parent; - $page->title = trim($title); - $page->sort = $sort++; - $page->id = -1; // prevents the permissions check from failing + $page = $this->wire('pages')->newPage(array( + 'template' => $template_id, + 'parent' => $parent, + 'title' => trim($title), + 'sort' => $sort++, + 'id' => -1, // prevents the permissions check from failing + )); // on first iteration perform a page-context access check if(!$n && (!$parent->addable($page) || !$page->publishable())) { diff --git a/wire/modules/LanguageSupport/LanguageSupportInstall.php b/wire/modules/LanguageSupport/LanguageSupportInstall.php index a230e510..61ca61cd 100644 --- a/wire/modules/LanguageSupport/LanguageSupportInstall.php +++ b/wire/modules/LanguageSupport/LanguageSupportInstall.php @@ -36,9 +36,8 @@ class LanguageSupportInstall extends Wire { if(!$setupPage->id) throw new WireException("Unable to locate {$adminPage->path}setup/"); // create the languages parent page - $languagesPage = $this->wire(new Page()); + $languagesPage = $this->wire('pages')->newPage('admin'); $languagesPage->parent = $setupPage; - $languagesPage->template = $this->templates->get('admin'); $languagesPage->process = $this->modules->get('ProcessLanguage'); // INSTALL ProcessLanguage module $this->message("Installed ProcessLanguage"); $languagesPage->name = 'languages'; @@ -50,6 +49,7 @@ class LanguageSupportInstall extends Wire { // create the fieldgroup to be used by the language template + /** @var Fieldgroup $fieldgroup */ $fieldgroup = $this->wire(new Fieldgroup()); $fieldgroup->name = LanguageSupport::languageTemplateName; $fieldgroup->add($this->fields->get('title')); @@ -59,6 +59,7 @@ class LanguageSupportInstall extends Wire { $this->addFilesFields($fieldgroup); // create the template used by Language pages + /** @var Template $template */ $template = $this->wire(new Template()); $template->name = LanguageSupport::languageTemplateName; $template->fieldgroup = $fieldgroup; @@ -89,9 +90,8 @@ class LanguageSupportInstall extends Wire { $this->message("Created Default Language Page: {$default->path}"); // create the translator page and process - $translatorPage = $this->wire(new Page()); + $translatorPage = $this->wire('pages')->newPage('admin'); $translatorPage->parent = $setupPage; - $translatorPage->template = $this->templates->get('admin'); $translatorPage->status = Page::statusHidden | Page::statusSystem; $translatorPage->process = $this->modules->get('ProcessLanguageTranslator'); // INSTALL ProcessLanguageTranslator $this->message("Installed ProcessLanguageTranslator"); @@ -142,10 +142,15 @@ class LanguageSupportInstall extends Wire { $this->message("Language Support Installed! Click to the 'Setup' menu to begin defining languages."); } - + + /** + * @param Fieldgroup $fieldgroup + * + */ public function addFilesFields($fieldgroup) { // create the 'language_files_site' field used by the 'language' fieldgroup + /** @var FieldtypeFile $field */ $field = $this->wire('fields')->get('language_files_site'); if(!$field) { $field = $this->wire(new Field()); diff --git a/wire/modules/Process/ProcessPageAdd/ProcessPageAdd.module b/wire/modules/Process/ProcessPageAdd/ProcessPageAdd.module index c25d25a6..bc92fe16 100644 --- a/wire/modules/Process/ProcessPageAdd/ProcessPageAdd.module +++ b/wire/modules/Process/ProcessPageAdd/ProcessPageAdd.module @@ -832,9 +832,10 @@ class ProcessPageAdd extends Process implements ConfigurableModule, WirePageEdit } if($this->template) { // dummy edit page for examination by InputfieldPageName - $editPage = $this->wire('pages')->newPage(); - $editPage->parent = $this->parent; - $editPage->template = $this->template; + $editPage = $this->wire('pages')->newPage(array( + 'template' => $this->template, + 'parent' => $this->parent, + )); $field->editPage = $editPage; } } @@ -1043,12 +1044,10 @@ class ProcessPageAdd extends Process implements ConfigurableModule, WirePageEdit // if not specified in get variable, next check parent template for setting $nameFormat = $nameFormatTemplate; } - $class = $template->pageClass ? $template->pageClass : 'Page'; $page = $this->wire('pages')->newPage(array( - 'pageClass' => $class, - 'template' => $template + 'template' => $template, + 'parent' => $parent, )); - $page->parent = $parent; $this->wire('pages')->setupNew($page); if(!strlen($page->name)) return false; if(!$this->isAllowedTemplate($template)) return false; @@ -1127,7 +1126,8 @@ class ProcessPageAdd extends Process implements ConfigurableModule, WirePageEdit */ protected function ___processInput(InputfieldForm $form) { - $this->page = $this->wire('pages')->newPage(); // must exist before processInput for language hooks + $template = $this->template; + $this->page = $this->wire('pages')->newPage($template ? $template : array()); // must exist before processInput for language hooks $form->processInput($this->input->post); /** @var InputfieldPageName $nameField */ @@ -1139,7 +1139,6 @@ class ProcessPageAdd extends Process implements ConfigurableModule, WirePageEdit return false; } - $template = $this->template; if(is_null($template)) { /** @var InputfieldSelect $templateField */ $templateField = $form->getChildByName('template'); diff --git a/wire/modules/Process/ProcessPageLister/ProcessPageLister.module b/wire/modules/Process/ProcessPageLister/ProcessPageLister.module index be18f51c..db52ed19 100644 --- a/wire/modules/Process/ProcessPageLister/ProcessPageLister.module +++ b/wire/modules/Process/ProcessPageLister/ProcessPageLister.module @@ -1127,11 +1127,10 @@ class ProcessPageLister extends Process implements ConfigurableModule { // user specified 1 or more templates $numEditable = 0; // determine how many templates are editable - $test = $pages->newPage(); - $test->id = 999; // required (any ID number works) if(count($parents)) { foreach($templates as $template) { - $test->template = $template; + $test = $pages->newPage($template); + $test->id = 999; // required (any ID number works) foreach($parents as $parent) { $test->parent = $parent; if($test->editable()) { @@ -1142,7 +1141,8 @@ class ProcessPageLister extends Process implements ConfigurableModule { } } else { foreach($templates as $template) { - $test->template = $template; + $test = $pages->newPage($template); + $test->id = 999; // required (any ID number works) if($test->editable()) $numEditable++; } }