mirror of
https://github.com/processwire/processwire.git
synced 2025-08-08 07:47:00 +02:00
Fix @apeisa issue with PageFinder optimization on large sets
This commit is contained in:
@@ -706,8 +706,8 @@ class PageFinder extends Wire {
|
|||||||
$selector->value = count($ids) > 1 ? $ids : reset($ids);
|
$selector->value = count($ids) > 1 ? $ids : reset($ids);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$field = $this->isPageField($fieldName);
|
$isPageField = $this->isPageField($fieldName, true);
|
||||||
if(is_object($field) && $field instanceof FieldtypePage) {
|
if($isPageField) {
|
||||||
// FieldtypePage fields can use the "," separation syntax for speed optimization
|
// FieldtypePage fields can use the "," separation syntax for speed optimization
|
||||||
$selector->value = count($ids) > 1 ? implode(',', $ids) : reset($ids);
|
$selector->value = count($ids) > 1 ? implode(',', $ids) : reset($ids);
|
||||||
} else {
|
} else {
|
||||||
@@ -1963,29 +1963,54 @@ class PageFinder extends Wire {
|
|||||||
* Does the given field or fieldName resolve to a field that uses Page or PageArray values?
|
* Does the given field or fieldName resolve to a field that uses Page or PageArray values?
|
||||||
*
|
*
|
||||||
* @param string|Field $fieldName Field name or object
|
* @param string|Field $fieldName Field name or object
|
||||||
|
* @param bool $literal Specify true to only allow types that literally use FieldtypePage::getMatchQuery()
|
||||||
* @return Field|bool|string Returns Field object or boolean true (children|parent) if valid Page field, or boolean false if not
|
* @return Field|bool|string Returns Field object or boolean true (children|parent) if valid Page field, or boolean false if not
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
protected function isPageField($fieldName) {
|
protected function isPageField($fieldName, $literal = false) {
|
||||||
|
|
||||||
$is = false;
|
$is = false;
|
||||||
$field = null;
|
$field = null;
|
||||||
|
|
||||||
if($fieldName === 'parent' || $fieldName === 'children') {
|
if($fieldName === 'parent' || $fieldName === 'children') {
|
||||||
return $fieldName; // early exit
|
return $fieldName; // early exit
|
||||||
|
|
||||||
} else if(is_object($fieldName) && $fieldName instanceof Field) {
|
} else if(is_object($fieldName) && $fieldName instanceof Field) {
|
||||||
$field = $fieldName;
|
$field = $fieldName;
|
||||||
|
|
||||||
|
} else if(is_string($fieldName) && strpos($fieldName, '.')) {
|
||||||
|
// check if this is a multi-part field name
|
||||||
|
list($fieldName, $subfieldName) = explode('.', $fieldName, 2);
|
||||||
|
if($subfieldName === 'id') {
|
||||||
|
// id property is fine and can be ignored
|
||||||
|
} else {
|
||||||
|
// some other property, see if it resolves to a literal Page field
|
||||||
|
$f = $this->isPageField($subfieldName, true);
|
||||||
|
if($f) {
|
||||||
|
// subfield resolves to literal Page field, so we can pass this one through
|
||||||
|
} else {
|
||||||
|
// some other property, that doesn't resolve to a Page field, we can early-exit now
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$field = $this->wire('fields')->get($fieldName);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$field = $this->wire('fields')->get($fieldName);
|
$field = $this->wire('fields')->get($fieldName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($field) {
|
if($field) {
|
||||||
$className = $field->type->className();
|
$className = $field->type->className();
|
||||||
if($field->type instanceof FieldtypePage) {
|
if($field->type instanceof FieldtypePage) {
|
||||||
$is = true;
|
$is = true;
|
||||||
} else if(strpos($className, 'FieldtypeRepeater') !== false || strpos($className, 'FieldtypePageTable') !== false) {
|
} else if(strpos($field->type->className(), 'FieldtypePageTable') !== false) {
|
||||||
$is = true;
|
$is = true;
|
||||||
|
} else if(strpos($className, 'FieldtypeRepeater') !== false) {
|
||||||
|
$is = $literal ? false : true;
|
||||||
} else {
|
} else {
|
||||||
$test = $field->type->getBlankValue(new NullPage(), $field);
|
$test = $field->type->getBlankValue(new NullPage(), $field);
|
||||||
if(is_object($test) && ($test instanceof Page || $test instanceof PageArray)) {
|
if(is_object($test) && ($test instanceof Page || $test instanceof PageArray)) {
|
||||||
$is = true;
|
$is = $literal ? false : true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user