tao-test/app/taoTaskQueue/model/TaskLog/DataTablePayload.php

181 lines
5.0 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2017 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);
*
*/
namespace oat\taoTaskQueue\model\TaskLog;
use oat\tao\model\datatable\DatatablePayload as DataTablePayloadInterface;
use oat\tao\model\datatable\implementation\DatatableRequest;
use oat\taoTaskQueue\model\TaskLogBroker\TaskLogBrokerInterface;
/**
* Helper class for handling js datatable request.
*
* @deprecated Use \oat\tao\model\taskQueue\TaskLog\DataTablePayload
*
* @author Gyula Szucs <gyula@taotesting.com>
*/
class DataTablePayload implements DataTablePayloadInterface, \Countable
{
private $taskLogFilter;
private $broker;
private $request;
/**
* @var \Closure
*/
private $rowCustomiser;
/**
* DataTablePayload constructor.
*
* @param TaskLogFilter $filter
* @param TaskLogBrokerInterface $broker
*/
public function __construct(TaskLogFilter $filter, TaskLogBrokerInterface $broker)
{
$this->taskLogFilter = $filter;
$this->broker = $broker;
$this->request = DatatableRequest::fromGlobals();
$this->applyDataTableFilters();
}
/**
* You can pass an anonymous function to customise the final payload: either to change the value of a field or to add extra field(s);
*
* The function will be bind to the task log entity (TaskLogEntity) so $this can be used inside of the closure.
* The return value needs to be an array.
*
* For example:
* <code>
* $payload->customiseRowBy(function (){
* $row['extraField'] = 'value';
* $row['extraField2'] = $this->getParameters()['some_parameter_key'];
* $row['createdAt'] = \tao_helpers_Date::displayeDate($this->getCreatedAt());
*
* return $row;
* });
* </code>
*
* @param \Closure $func
* @return DataTablePayload
*/
public function customiseRowBy(\Closure $func)
{
$this->rowCustomiser = $func;
return $this;
}
/**
* @return array
*/
public function getPayload()
{
$countTotal = $this->count();
$page = $this->request->getPage();
$limit = $this->request->getRows();
// we don't want to "pollute" the original filter
$cloneFilter = clone $this->taskLogFilter;
$cloneFilter->setLimit($limit)
->setOffset($limit * ($page - 1))
->setSortBy($this->request->getSortBy())
->setSortOrder($this->request->getSortOrder());
// get task log entities by filters
$collection = $this->broker->search($cloneFilter);
// get customised data
$customisedData = $this->getCustomisedData($collection);
$data = [
'rows' => $limit,
'page' => $page,
'amount' => count($collection),
'total' => ceil($countTotal / $limit),
'data' => $customisedData ?: $collection->toArray(),
];
return $data;
}
/**
* Get customised data if we have a customiser set
*
* @param TaskLogCollection $collection
* @return array
*/
private function getCustomisedData(TaskLogCollection $collection)
{
$data = [];
if (!is_null($this->rowCustomiser)) {
foreach ($collection as $taskLogEntity) {
$newCustomiser = $this->rowCustomiser->bindTo($taskLogEntity, $taskLogEntity);
$data[] = array_merge($taskLogEntity->toArray(), (array) $newCustomiser());
}
}
return $data;
}
/**
* @return int
*/
public function count()
{
return $this->broker->count($this->taskLogFilter);
}
/**
* Add filter values from request to the taskLogFilter.
*/
private function applyDataTableFilters()
{
$filters = $this->request->getFilters();
foreach ($filters as $fieldName => $filterValue) {
if (empty($filterValue)) {
continue;
}
if (is_array($filterValue)) {
$this->taskLogFilter->in($fieldName, $filterValue);
continue;
}
$this->taskLogFilter->eq($fieldName, (string) $filterValue);
}
}
/**
* @return array
*/
public function jsonSerialize()
{
return $this->getPayload();
}
}