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); $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;
} }
} }
} }