diff --git a/src/Plugin/facets/processor/SortProcessorHandler.php b/src/Plugin/facets/processor/SortProcessorHandler.php index c4bcd34..56d3a66 100644 --- a/src/Plugin/facets/processor/SortProcessorHandler.php +++ b/src/Plugin/facets/processor/SortProcessorHandler.php @@ -11,6 +11,7 @@ use Drupal\facets\FacetInterface; use Drupal\facets\Processor\BuildProcessorInterface; use Drupal\facets\Processor\ProcessorPluginBase; +use Drupal\facets\Result\Result; /** * The sort processor handler to manager the sorting. @@ -35,6 +36,11 @@ class SortProcessorHandler extends ProcessorPluginBase implements BuildProcessor protected $facet; /** + * The sorts enabled for facet. + */ + protected $sorts = []; + + /** * {@inheritdoc} */ public function __construct(array $configuration, $plugin_id, array $plugin_definition) { @@ -46,6 +52,7 @@ public function __construct(array $configuration, $plugin_id, array $plugin_defi /** @var \Drupal\facets\FacetInterface $facet */ $this->facet = $configuration['facet']; + } /** @@ -61,13 +68,26 @@ public function build(FacetInterface $facet, array $results) { foreach ($configs as $id => $sort_config) { if ($sort_config['status'] == TRUE) { /** @var \Drupal\facets\SortProcessor\SortProcessorInterface $sort */ - $sort = $plugin_manager->createInstance($id, $sort_config); - $results = $sort->sortResults($results, $sort_config['sort']); - return $results; + $this->sorts[] = $plugin_manager->createInstance($id, $sort_config); } } + uasort($results, array($this, 'sortCallback')); + return $results; } + /** + * Applies sorts and return the sorting information for uasort(). + */ + protected function sortCallback(Result $a, Result $b) { + $return = 0; + foreach ($this->sorts as $sort) { + if ($return = $sort->sortResults($a, $b)) { + break; + } + } + return $return; + } + } diff --git a/src/Plugin/facets/sort_processor/ActiveWidgetOrderProcessor.php b/src/Plugin/facets/sort_processor/ActiveWidgetOrderProcessor.php index 5d24b55..76bbf72 100644 --- a/src/Plugin/facets/sort_processor/ActiveWidgetOrderProcessor.php +++ b/src/Plugin/facets/sort_processor/ActiveWidgetOrderProcessor.php @@ -27,15 +27,18 @@ class ActiveWidgetOrderProcessor extends SortProcessorPluginBase { /** * {@inheritdoc} */ - public function sortResults(array $results, $order = 'ASC') { + public function sortResults(Result $a, Result $b) { + + $order = $this->getConfiguration()['sort']; + if ($order === 'ASC') { - usort($results, 'self::sortActiveAsc'); + return self::sortActiveAsc($a, $b); } else { - usort($results, 'self::sortActiveDesc'); + return self::sortActiveDesc($a, $b); } - return $results; + return 0; } /** diff --git a/src/Plugin/facets/sort_processor/CountWidgetOrderProcessor.php b/src/Plugin/facets/sort_processor/CountWidgetOrderProcessor.php index 0ea9f8c..b24d16c 100644 --- a/src/Plugin/facets/sort_processor/CountWidgetOrderProcessor.php +++ b/src/Plugin/facets/sort_processor/CountWidgetOrderProcessor.php @@ -27,15 +27,18 @@ class CountWidgetOrderProcessor extends SortProcessorPluginBase { /** * {@inheritdoc} */ - public function sortResults(array $results, $order = 'ASC') { + public function sortResults(Result $a, Result $b) { + + $order = $this->getConfiguration()['sort']; + if ($order === 'ASC') { - usort($results, 'self::sortCountAsc'); + return self::sortCountAsc($a, $b); } else { - usort($results, 'self::sortCountDesc'); + return self::sortCountDesc($a, $b); } - return $results; + return 0; } /** diff --git a/src/Plugin/facets/sort_processor/DisplayValueWidgetOrderProcessor.php b/src/Plugin/facets/sort_processor/DisplayValueWidgetOrderProcessor.php index 9825dbf..25d92b0 100644 --- a/src/Plugin/facets/sort_processor/DisplayValueWidgetOrderProcessor.php +++ b/src/Plugin/facets/sort_processor/DisplayValueWidgetOrderProcessor.php @@ -27,15 +27,18 @@ class DisplayValueWidgetOrderProcessor extends SortProcessorPluginBase { /** * {@inheritdoc} */ - public function sortResults(array $results, $order = 'ASC') { + public function sortResults(Result $a, Result $b) { + + $order = $this->getConfiguration()['sort']; + if ($order === 'ASC') { - usort($results, 'self::sortDisplayValueAsc'); + return self::sortDisplayValueAsc($a, $b); } else { - usort($results, 'self::sortDisplayValueDesc'); + return self::sortDisplayValueDesc($a, $b); } - return $results; + return 0; } /** diff --git a/src/Plugin/facets/sort_processor/RawValueWidgetOrderProcessor.php b/src/Plugin/facets/sort_processor/RawValueWidgetOrderProcessor.php index da345ae..bd11443 100644 --- a/src/Plugin/facets/sort_processor/RawValueWidgetOrderProcessor.php +++ b/src/Plugin/facets/sort_processor/RawValueWidgetOrderProcessor.php @@ -27,15 +27,18 @@ class RawValueWidgetOrderProcessor extends SortProcessorPluginBase { /** * {@inheritdoc} */ - public function sortResults(array $results, $order = 'ASC') { + public function sortResults(Result $a, Result $b) { + + $order = $this->getConfiguration()['sort']; + if ($order === 'ASC') { - usort($results, 'self::sortRawValueAsc'); + return self::sortRawValueAsc($a, $b); } else { - usort($results, 'self::sortRawValueDesc'); + return self::sortRawValueDesc($a, $b); } - return $results; + return 0; } /** diff --git a/src/SortProcessor/SortProcessorInterface.php b/src/SortProcessor/SortProcessorInterface.php index cf6109f..fcd4e56 100644 --- a/src/SortProcessor/SortProcessorInterface.php +++ b/src/SortProcessor/SortProcessorInterface.php @@ -6,6 +6,8 @@ namespace Drupal\facets\SortProcessor; +use Drupal\facets\Result\Result; + /** * Interface SortProcessorInterface. * @@ -18,17 +20,16 @@ /** - * Orders results and return the new order of results. + * Compares results and returns the result for uasort(). * - * @param \Drupal\facets\Result\Result[] $results + * @param \Drupal\facets\Result\Result $a * An array containing results. - * @param string $order - * A string denoting the order in which we should sort, either 'ASC' or - * 'DESC'. + * @param \Drupal\facets\Result\Result $b + * Second result item for comparison. * - * @return \Drupal\facets\Result\Result[] - * The same array that was passed in, ordered by $order + * @return int + * The comparison result for uasort(). */ - public function sortResults(array $results, $order = 'ASC'); + public function sortResults(Result $a, Result $b); }