mirror of
https://github.com/processwire/processwire.git
synced 2025-08-09 08:17:12 +02:00
Add support for custom Page classes
This commit is contained in:
@@ -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?
|
||||
*
|
||||
|
@@ -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
|
||||
|
@@ -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));
|
||||
|
||||
|
@@ -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}'.";
|
||||
|
@@ -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);
|
||||
|
@@ -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';
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
* ==================================================
|
||||
|
@@ -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;
|
||||
|
@@ -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.
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
*
|
||||
|
@@ -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
|
||||
));
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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';
|
||||
|
@@ -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())) {
|
||||
|
@@ -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());
|
||||
|
@@ -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');
|
||||
|
@@ -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++;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user