1
0
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:
Ryan Cramer
2016-09-30 07:37:44 -04:00
parent 0cd0587778
commit 7b59b1df33

View File

@@ -706,8 +706,8 @@ class PageFinder extends Wire {
$selector->value = count($ids) > 1 ? $ids : reset($ids);
} else {
$field = $this->isPageField($fieldName);
if(is_object($field) && $field instanceof FieldtypePage) {
$isPageField = $this->isPageField($fieldName, true);
if($isPageField) {
// FieldtypePage fields can use the "," separation syntax for speed optimization
$selector->value = count($ids) > 1 ? implode(',', $ids) : reset($ids);
} 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?
*
* @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
*
*/
protected function isPageField($fieldName) {
protected function isPageField($fieldName, $literal = false) {
$is = false;
$field = null;
if($fieldName === 'parent' || $fieldName === 'children') {
return $fieldName; // early exit
} else if(is_object($fieldName) && $fieldName instanceof Field) {
$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 {
$field = $this->wire('fields')->get($fieldName);
}
if($field) {
$className = $field->type->className();
if($field->type instanceof FieldtypePage) {
$is = true;
} else if(strpos($className, 'FieldtypeRepeater') !== false || strpos($className, 'FieldtypePageTable') !== false) {
} else if(strpos($field->type->className(), 'FieldtypePageTable') !== false) {
$is = true;
} else if(strpos($className, 'FieldtypeRepeater') !== false) {
$is = $literal ? false : true;
} else {
$test = $field->type->getBlankValue(new NullPage(), $field);
if(is_object($test) && ($test instanceof Page || $test instanceof PageArray)) {
$is = true;
$is = $literal ? false : true;
}
}
}