From 8cb944cf52c073c82bf08fba0ff49050e36dea4a Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Fri, 30 Dec 2016 07:22:51 -0500 Subject: [PATCH] Some updates to the template_ids support for FieldtypePage/InputfieldPage --- wire/modules/Fieldtype/FieldtypePage.module | 82 +++++++++++++------ .../InputfieldPage/InputfieldPage.module | 24 ++---- 2 files changed, 60 insertions(+), 46 deletions(-) diff --git a/wire/modules/Fieldtype/FieldtypePage.module b/wire/modules/Fieldtype/FieldtypePage.module index 1f16cc81..c6bcd4d2 100644 --- a/wire/modules/Fieldtype/FieldtypePage.module +++ b/wire/modules/Fieldtype/FieldtypePage.module @@ -132,14 +132,13 @@ class FieldtypePage extends FieldtypeMulti implements Module, ConfigurableModule public function ___wakeupValue(Page $page, Field $field, $value) { $template = null; - $template_id = $field->get('template_id'); - $template_ids = $field->get('template_ids'); + $template_ids = self::getTemplateIDs($field); $derefAsPage = $field->get('derefAsPage'); $allowUnpub = $field->get('allowUnpub'); - if(empty($template_ids) || count($template_ids) <= 1) { + if(count($template_ids) == 1) { // we only use $template optimization if only one template selected - if($template_id) $template = $this->wire('templates')->get($template_id); + $template = $this->wire('templates')->get(reset($template_ids)); } // handle $value if it's blank, Page, or PageArray @@ -402,8 +401,6 @@ class FieldtypePage extends FieldtypeMulti implements Module, ConfigurableModule $result = false; $parent_id = $field->get('parent_id'); - $template_id = $field->get('template_ids'); - if(empty($template_id)) $template_id = $field->get('template_id'); if(Selectors::stringHasOperator($value)) { // selector string @@ -452,13 +449,15 @@ class FieldtypePage extends FieldtypeMulti implements Module, ConfigurableModule if(!$result->id) $result = $this->wire('pages')->get("parent_id=$parentIDs, name=" . $this->wire('sanitizer')->selectorValue($this->wire('sanitizer')->pageNameUTF8($value))); - } else if(!empty($template_id)) { - // set by title - $templateIDs = is_array($template_id) ? implode('|', $template_id) : $template_id; - $result = $this->wire('pages')->get("templates_id=$templateIDs, title=" . $this->wire('sanitizer')->selectorValue($value)); - // set by name - if(!$result->id) $result = $this->wire('pages')->get("templates_id=$templateIDs, name=" . - $this->wire('sanitizer')->selectorValue($this->wire('sanitizer')->pageNameUTF8($value))); + } else { + $template_ids = self::getTemplateIDs($field, true); + if(!empty($template_ids)) { + // set by title + $result = $this->wire('pages')->get("templates_id=$template_ids, title=" . $this->wire('sanitizer')->selectorValue($value)); + // set by name + if(!$result->id) $result = $this->wire('pages')->get("templates_id=$template_ids, name=" . + $this->wire('sanitizer')->selectorValue($this->wire('sanitizer')->pageNameUTF8($value))); + } } if(!$result && $this->wire('config')->debug) { @@ -824,8 +823,7 @@ class FieldtypePage extends FieldtypeMulti implements Module, ConfigurableModule $findPagesSelector = $field->get('findPagesSelector'); if(empty($findPagesSelector)) $findPagesSelector = $field->get('findPagesSelect'); $parent_id = $field->get('parent_id'); - $template_id = $field->get('template_ids'); - if(empty($template_id)) $template_id = $field->get('template_id'); + $template_ids = self::getTemplateIDs($field, true); if(in_array($subfield, $this->nativeNames)) { // fine then, we can handle that here when needed (like !=) @@ -847,12 +845,7 @@ class FieldtypePage extends FieldtypeMulti implements Module, ConfigurableModule } if($parent_id) $selector .= "parent_id=$parent_id, "; - - if(is_array($template_id)) { - if(count($template_id)) $selector .= "templates_id=" . implode('|', $template_id) . ", "; - } else if($template_id) { - $selector .= "templates_id=$template_id, "; - } + if($template_ids) $selector .= "templates_id=$template_ids, "; if(!is_null($group)) { // combine with other selectors sharing the same group so that both must match in our subquery below @@ -940,15 +933,13 @@ class FieldtypePage extends FieldtypeMulti implements Module, ConfigurableModule $subfields = array(); $fieldgroups = array(); - $template_id = $field->get('template_ids'); - if(empty($template_id)) $template_id = $field->get('template_id'); + $template_ids = self::getTemplateIDs($field); $parent_id = $field->get('parent_id'); - if($template_id) { + if($template_ids) { // determine fieldgroup(s) from template setting // template_id can be int or array of ints - if(!is_array($template_id)) $template_id = array($template_id); - foreach($template_id as $tid) { + foreach($template_ids as $tid) { $template = $this->wire('templates')->get((int) $tid); if($template) $fieldgroups[] = $template->fieldgroup; } @@ -1295,9 +1286,10 @@ class FieldtypePage extends FieldtypeMulti implements Module, ConfigurableModule * Or specify boolean TRUE to get a count. * @param bool|Field|null $field Optionally specify Field to limit results to (default includes all fields of this type), * Or boolean TRUE to return array indexed by field name. - * @return PageArray|array Returns one of the following, according to the provided arguments: + * @return PageArray|array|int Returns one of the following, according to the provided arguments: * - returns PageArray as default behavior, including when given a $selector string and/or Field object. * - returns array of PageArray objects if $field argument is TRUE ($selector may be populated string or blank string). + * - returns int if the count option (boolean true) specified for $selector. * */ private function findReferences(Page $page, $selector = '', $field = false) { @@ -1372,6 +1364,42 @@ class FieldtypePage extends FieldtypeMulti implements Module, ConfigurableModule return $result; } + /** + * Return array or string of configured template IDs + * + * Accounts for both template_id and template_ids settings, making sure both are included. + * + * #pw-internal + * + * @param Field|array $field Field object or array with all possible template IDs + * @param bool $getString Specify true to return a 1|2|3 style string rather than an array + * @return array|string + * @throws WireException + * + */ + static public function getTemplateIDs($field, $getString = false) { + + $ids = array(); + $values = array(); + + if($field instanceof Field) { + $values = array($field->get('template_id'), $field->get('template_ids')); + } else if(is_array($field)) { + $values = $field; + } + + foreach($values as $value) { + if(empty($value)) continue; + if(!is_array($value)) $value = array($value); + foreach($value as $id) { + $id = (int) $id; + if($id) $ids[$id] = $id; + } + } + + return $getString ? implode('|', $ids) : array_values($ids); + } + /** * Module configuration screen * diff --git a/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module b/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module index cb5f4499..6ba68413 100644 --- a/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module +++ b/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module @@ -231,10 +231,6 @@ class InputfieldPage extends Inputfield implements ConfigurableModule { $valid = true; $findPagesSelector = $field->get('findPagesSelector'); if(empty($findPagesSelector)) $findPagesSelector = $field->get('findPagesSelect'); - $parent_id = $field->get('parent_id'); - $template_id = $field->get('template_id'); - $template_ids = $field->get('template_ids'); - if(!is_array($template_ids)) $template_ids = array(); if($findPagesSelector) { $selector = $findPagesSelector; @@ -254,6 +250,7 @@ class InputfieldPage extends Inputfield implements ConfigurableModule { // if($field->findPagesCode) { } // we don't currently validate these + $parent_id = $field->get('parent_id'); if($parent_id && $parent_id != $page->parent_id) { $inputfieldClass = ltrim($field->get('inputfield'), '_'); if(empty($inputfieldClass)) $inputfieldClass = 'InputfieldSelect'; @@ -279,19 +276,14 @@ class InputfieldPage extends Inputfield implements ConfigurableModule { } $hasRequiredTemplate = true; + $template_ids = FieldtypePage::getTemplateIDs($field); if(!empty($template_ids)) { - if($template_id && !in_array($template_id, $template_ids)) { - array_unshift($template_ids, $template_id); - } $hasRequiredTemplate = in_array($page->template->id, $template_ids); - } else if($template_id) { - $hasRequiredTemplate = $page->template->id == $template_id; } if(!$hasRequiredTemplate) { $valid = false; - $requiredTemplate = empty($template_ids) ? $template_id : implode(',', $template_ids); if($editPage) { - $editPage->set('_isValidPage', "Page $page does not have required template(s): $requiredTemplate"); + $editPage->set('_isValidPage', "Page $page does not have required template(s): " . implode(',', $template_ids)); } } @@ -401,13 +393,7 @@ class InputfieldPage extends Inputfield implements ConfigurableModule { public function getTemplateIDs($getString = false) { $templateIDs = parent::getSetting('template_ids'); $templateID = parent::getSetting('template_id'); - if(empty($templateID)) return $getString ? '' : array(); - if(empty($templateIDs)) { - $templateIDs = array($templateID); - } else if($templateID && !in_array($templateID, $templateIDs)) { - array_unshift($templateIDs, $templateID); - } - return $getString ? implode('|', $templateIDs) : $templateIDs; + return FieldtypePage::getTemplateIDs(array($templateIDs, $templateID), $getString); } /** @@ -990,7 +976,7 @@ class InputfieldPage extends Inputfield implements ConfigurableModule { foreach($this->templates as $template) { $field->addOption($template->id, $template->name); } - $template_id = parent::getSetting('template_id'); + $template_id = $this->getSetting('template_id'); $field->attr('value', $template_id); $field->collapsed = Inputfield::collapsedBlank; $field->icon = 'cube';