1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-09 00:06:55 +02:00

Update PageFinder and Fieldtype interface so that Fieldtype modules can optionally take over sorting of their own fields/subfields in PageFinder searches.

This commit is contained in:
Ryan Cramer
2020-09-18 14:27:02 -04:00
parent ee4c46a442
commit a751edf51b
2 changed files with 42 additions and 10 deletions

View File

@@ -726,6 +726,28 @@ abstract class Fieldtype extends WireData implements Module {
return $query; return $query;
} }
/**
* Get or update query to sort by given $field or $subfield
*
* Return false if this Fieldtype does not have built-in sort logic and PageFinder should handle it.
* Return string of query to add to ORDER BY statement, or boolean true if method added it already.
*
* #pw-internal
*
* @param Field $field
* @param DatabaseQuerySelect $query
* @param string $table
* @param string $subfield
* @param bool $desc True for descending, false for ascending
* @return bool|string
* @since 3.0.167
*
*/
public function getMatchQuerySort(Field $field, $query, $table, $subfield, $desc) {
if($query && $table && $field && $subfield && $desc) {}
return false;
}
/** /**
* Create a new field table in the database. * Create a new field table in the database.
* *

View File

@@ -2104,10 +2104,13 @@ class PageFinder extends Wire {
foreach($values as $value) { foreach($values as $value) {
$fc = substr($value, 0, 1); $fc = substr($value, 0, 1);
$lc = substr($value, -1); $lc = substr($value, -1);
$descending = $fc == '-' || $lc == '-';
$value = trim($value, "-+"); $value = trim($value, "-+");
$subValue = ''; $subValue = '';
// $terValue = ''; // not currently used, here for future use // $terValue = ''; // not currently used, here for future use
if($this->lastOptions['reverseSort']) $descending = !$descending;
if(strpos($value, ".")) { if(strpos($value, ".")) {
list($value, $subValue) = explode(".", $value, 2); // i.e. some_field.title list($value, $subValue) = explode(".", $value, 2); // i.e. some_field.title
@@ -2186,8 +2189,15 @@ class PageFinder extends Wire {
} }
$query->leftjoin("$table AS $tableAlias ON $tableAlias.pages_id=pages.$idColumn"); $query->leftjoin("$table AS $tableAlias ON $tableAlias.pages_id=pages.$idColumn");
$customValue = $field->type->getMatchQuerySort($field, $query, $tableAlias, $subValue, $descending);
if(!empty($customValue)) {
// Fieldtype handled it: boolean true (handled by Fieldtype) or string to add to orderby
if(is_string($customValue)) $query->orderby($customValue, true);
$value = false;
if($subValue === 'count') { } else if($subValue === 'count') {
if($this->isRepeaterFieldtype($field->type)) { if($this->isRepeaterFieldtype($field->type)) {
// repeaters have a native count column that can be used for sorting // repeaters have a native count column that can be used for sorting
$value = "$tableAlias.count"; $value = "$tableAlias.count";
@@ -2212,7 +2222,7 @@ class PageFinder extends Wire {
} else if($subValue == 'parent') { } else if($subValue == 'parent') {
$query->leftjoin("pages AS $tableAlias2 ON $tableAlias.data=$tableAlias2.$idColumn"); $query->leftjoin("pages AS $tableAlias2 ON $tableAlias.data=$tableAlias2.$idColumn");
$value = "$tableAlias2.name"; $value = "$tableAlias2.name";
} else { } else {
$subValueField = $this->fields->get($subValue); $subValueField = $this->fields->get($subValue);
if($subValueField) { if($subValueField) {
@@ -2237,13 +2247,13 @@ class PageFinder extends Wire {
$value = "$tableAlias." . ($subValue ? $subValue : "data"); ; $value = "$tableAlias." . ($subValue ? $subValue : "data"); ;
} }
} }
$descending = $fc == '-' || $lc == '-'; if(is_string($value) && strlen($value)) {
if($this->lastOptions['reverseSort']) $descending = !$descending; if($descending) {
if($descending) { $query->orderby("$value DESC", true);
$query->orderby("$value DESC", true); } else {
} else { $query->orderby("$value", true);
$query->orderby("$value", true); }
} }
} }
} }