grav/system/src/Grav/Framework/Object/ObjectCollection.php

84 lines
2.3 KiB
PHP
Raw Normal View History

2017-05-11 12:20:01 +02:00
<?php
/**
* @package Grav\Framework\Object
*
2017-12-11 23:08:05 +01:00
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
2017-05-11 12:20:01 +02:00
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Framework\Object;
use Doctrine\Common\Collections\Criteria;
2017-05-11 12:20:01 +02:00
use Grav\Framework\Collection\ArrayCollection;
use Grav\Framework\Object\Access\NestedPropertyCollectionTrait;
use Grav\Framework\Object\Base\ObjectCollectionTrait;
use Grav\Framework\Object\Collection\ObjectExpressionVisitor;
use Grav\Framework\Object\Interfaces\NestedObjectInterface;
use Grav\Framework\Object\Interfaces\ObjectCollectionInterface;
2017-05-11 12:20:01 +02:00
/**
* Object Collection
* @package Grav\Framework\Object
*/
class ObjectCollection extends ArrayCollection implements ObjectCollectionInterface, NestedObjectInterface
2017-05-11 12:20:01 +02:00
{
use ObjectCollectionTrait, NestedPropertyCollectionTrait {
NestedPropertyCollectionTrait::group insteadof ObjectCollectionTrait;
}
2017-05-11 12:20:01 +02:00
/**
* @param array $elements
* @param string $key
2017-08-18 11:28:13 +02:00
* @throws \InvalidArgumentException
2017-05-11 12:20:01 +02:00
*/
public function __construct(array $elements = [], $key = null)
{
parent::__construct($this->setElements($elements));
2017-05-11 12:20:01 +02:00
$this->setKey($key);
2017-08-18 11:28:13 +02:00
}
/**
* {@inheritDoc}
*/
public function matching(Criteria $criteria)
{
$expr = $criteria->getWhereExpression();
$filtered = $this->getElements();
if ($expr) {
$visitor = new ObjectExpressionVisitor();
$filter = $visitor->dispatch($expr);
$filtered = array_filter($filtered, $filter);
}
if ($orderings = $criteria->getOrderings()) {
$next = null;
foreach (array_reverse($orderings) as $field => $ordering) {
$next = ObjectExpressionVisitor::sortByField($field, $ordering == Criteria::DESC ? -1 : 1, $next);
}
uasort($filtered, $next);
}
$offset = $criteria->getFirstResult();
$length = $criteria->getMaxResults();
if ($offset || $length) {
$filtered = array_slice($filtered, (int)$offset, $length);
}
return $this->createFrom($filtered);
}
protected function getElements()
2017-08-18 11:28:13 +02:00
{
return $this->toArray();
}
2017-08-18 11:28:13 +02:00
protected function setElements(array $elements)
{
return $elements;
2017-05-11 12:20:01 +02:00
}
}