1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-07 15:26:54 +02:00

Improvements to FieldtypePage set of string value(s) to pages, so that it recognizes title and name for setting purposes.

This commit is contained in:
Ryan Cramer
2025-01-29 09:55:22 -05:00
parent f22739a54c
commit 1805ad0a59
3 changed files with 27 additions and 11 deletions

View File

@@ -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...

View File

@@ -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();
}
} else {
// unrecognized type: can't make a page object from it
continue;

View File

@@ -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();