From c84bf5bd4639617021d19d827d4ca3e487efd795 Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Tue, 23 Mar 2021 07:19:53 -0400 Subject: [PATCH] Fix issue processwire/processwire-issues#1325 --- wire/core/PagesType.php | 4 +++- wire/core/Users.php | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/wire/core/PagesType.php b/wire/core/PagesType.php index 3b7eaa87..a4d821e8 100644 --- a/wire/core/PagesType.php +++ b/wire/core/PagesType.php @@ -594,6 +594,8 @@ class PagesType extends Wire implements \IteratorAggregate, \Countable { /** * Get the PHP class name used by Page objects of this type * + * If returned class is not namespaced then `ProcessWire` namespace can be assumed. + * * #pw-group-family * * @return string @@ -604,7 +606,7 @@ class PagesType extends Wire implements \IteratorAggregate, \Countable { if($this->pageClass && !$this->template->pageClass) { $this->template->pageClass = $this->pageClass; } - return $this->template->getPageClass(false); + return $this->template->getPageClass(true); } if($this->pageClass) return $this->pageClass; return 'Page'; diff --git a/wire/core/Users.php b/wire/core/Users.php index 9889bd42..3561edd5 100644 --- a/wire/core/Users.php +++ b/wire/core/Users.php @@ -35,6 +35,14 @@ class Users extends PagesType { */ protected $guestUser = null; + /** + * Validated custom page class cache for getPageClass method + * + * @var string + * + */ + protected $validPageClass = ''; + /** * Construct * @@ -134,14 +142,32 @@ 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( + return $this->wire()->pages->newPage(array( 'template' => 'user', - 'pageClass' => $pageClass + 'pageClass' => $this->getPageClass() )); } + + /** + * Get the PHP class name used by Page objects of this type + * + * #pw-internal + * + * @return string + * + */ + public function getPageClass() { + $pageClass = parent::getPageClass(); + if($pageClass !== 'User' && $pageClass !== 'ProcessWire\User' && $pageClass !== $this->validPageClass) { + if(wireInstanceOf($pageClass, 'User')) { + $this->validPageClass = $pageClass; + } else { + $this->error("Class '$pageClass' disregarded because it does not extend 'User'"); + $pageClass = 'User'; + } + } + return $pageClass; + } /** * Hook called just before a user is saved