diff --git a/wire/core/Process.php b/wire/core/Process.php index 34ea0680..115d81b6 100644 --- a/wire/core/Process.php +++ b/wire/core/Process.php @@ -251,6 +251,8 @@ abstract class Process extends WireData implements Module { * */ public function ___breadcrumb($href, $label) { + if(is_array($label)) return $this; + $label = (string) $label; $pos = strpos($label, '/'); if($pos !== false && strpos($href, '/') === false) { // arguments got reversed, we'll work with it anyway... diff --git a/wire/modules/Fieldtype/FieldtypePage.module b/wire/modules/Fieldtype/FieldtypePage.module index 04610629..db3a454a 100644 --- a/wire/modules/Fieldtype/FieldtypePage.module +++ b/wire/modules/Fieldtype/FieldtypePage.module @@ -810,6 +810,7 @@ class FieldtypePage extends FieldtypeMulti implements Module, ConfigurableModule } $pages = $this->wire()->pages; + $inputfield = null; // value is an int or array of int|string|Page, load to pages, add to $pageArray if(!is_array($value)) $value = array($value); @@ -818,17 +819,24 @@ class FieldtypePage extends FieldtypeMulti implements Module, ConfigurableModule // Page object if($v->id == $page->id) continue; $pg = $v; - } else if(is_int($v)) { + } else if(is_int($v) || ctype_digit("$v")) { // integer page ID if($v == $page->id) continue; $pg = $pages->get($v); } else if(is_string($v)) { // path or selector string - if(ctype_digit($v)) { - $v = (int) $v; - if($v == $page->id) continue; + if(strpos($v, '/') === 0 && $this->wire()->sanitizer->pagePathName($v) === $v) { + $pg = $pages->get($v); + } else if(Selectors::stringHasSelector($v)) { + $pg = $pages->get($v); + } else { + $pg = null; + } + if(!$pg || !$pg->id) { + if(!$inputfield) $inputfield = $this->getInputfield($page, $field); + $pgs = $inputfield->getSelectablePages($page, 'name|title=' . $this->wire()->sanitizer->selectorValue($v)); + if(count($pgs)) $pg = $pgs->first(); } - $pg = $pages->get($v); } else { // unrecognized type: can't make a page object from it continue; diff --git a/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module b/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module index 5b8cb2f8..e7b27837 100644 --- a/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module +++ b/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module @@ -5,7 +5,7 @@ * * Delegates the actual input control to a user-defined Inputfield derived from InputfieldSelect * - * @method PageArray|null getSelectablePages(Page $page) + * @method PageArray|null getSelectablePages(Page $page, $filterSelector = '') * @method PageArray findPagesCode(Page $page) * * Can be accessed from $this or from $field: @@ -349,10 +349,11 @@ class InputfieldPage extends Inputfield implements ConfigurableModule { * Return PageArray of selectable pages for this input * * @param Page $page The Page being edited + * @param string $filterSelector Additional selector to filter selectable pages (3.0.245+) * @return PageArray|null * */ - public function ___getSelectablePages(Page $page) { + public function ___getSelectablePages(Page $page, $filterSelector = '') { $pages = $this->wire()->pages; $lockedModes = array(Inputfield::collapsedNoLocked, Inputfield::collapsedYesLocked, Inputfield::collapsedBlankLocked); @@ -386,25 +387,30 @@ class InputfieldPage extends Inputfield implements ConfigurableModule { $selector = self::populateFindPagesSelector($page, $findPagesSelector, $instance); if($templateIDs) $selector = trim("$selector, templates_id=$templateIDs", ", "); if($this->parent_id) $selector = trim("$selector, parent_id=$this->parent_id", ", "); + if($filterSelector) $selector .= ", $filterSelector"; $children = $pages->find($selector); } else if($this->findPagesCode) { // php statement that returns a PageArray or a Page (to represent a parent) $children = $this->findPagesCode($page); - if($children instanceof Page) $children = $children->children(); // @teppokoivula + if($children instanceof Page) $children = $children->children($filterSelector); // @teppokoivula } else if($this->parent_id) { $parent = $pages->get($this->parent_id); if($parent) { if($templateIDs) { - $children = $parent->children("templates_id=$templateIDs, check_access=0, status<$statusUnder"); + $selector = "templates_id=$templateIDs, check_access=0, status<$statusUnder"; } else { - $children = $parent->children("check_access=0, status<$statusUnder"); + $selector = "check_access=0, status<$statusUnder"; } + if($filterSelector) $selector .= ", $filterSelector"; + $children = $parent->children($selector); } } else if($templateIDs) { - $children = $pages->find("templates_id=$templateIDs, check_access=0, status<$statusUnder"); + $selector = "templates_id=$templateIDs, check_access=0, status<$statusUnder"; + if($filterSelector) $selector .= ", $filterSelector"; + $children = $pages->find($selector); } else { $children = $pages->newPageArray();