Files
CHIEFSOFT\ameye df3a033196 first commit
2024-06-08 17:09:23 -04:00

196 lines
5.4 KiB
PHP

<?php
/**
* @file classes/controllers/grid/feature/GeneralPagingFeature.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class GeneralPagingFeature
*
* @ingroup controllers_grid_feature
*
* @brief Base class that implements common functionality for
* paging features.
*
*/
namespace PKP\controllers\grid\feature;
use APP\core\Application;
use PKP\controllers\grid\GridHandler;
use PKP\core\ArrayItemIterator;
use PKP\core\ItemIterator;
use PKP\handler\PKPHandler;
class GeneralPagingFeature extends GridFeature
{
/** @var ItemIterator */
private $_itemIterator;
/** @var int itemsPerPage */
private $_itemsPerPage;
/**
* @see GridFeature::GridFeature()
*
* @param string $id Feature identifier.
* @param null|int $itemsPerPage Optional Number of items to show at
* the first time.
* Constructor.
*/
public function __construct($id, $itemsPerPage = null)
{
$this->_itemsPerPage = $itemsPerPage;
parent::__construct($id);
}
//
// Getters and setters.
//
/**
* Get item iterator.
*
* @return ItemIterator
*/
public function getItemIterator()
{
return $this->_itemIterator;
}
//
// Extended GridFeature methods.
//
/**
* @copydoc GridFeature::setOptions()
*/
public function setOptions($request, $grid)
{
// Get the default items per page setting value.
$rangeInfo = PKPHandler::getRangeInfo($request, $grid->getId());
$iterator = $this->getItemIterator();
$defaultItemsPerPage = $rangeInfo->getCount();
// Check for a component level items per page setting.
$componentItemsPerPage = $request->getUserVar($this->_getItemsPerPageParamName($grid->getId()));
if (!$componentItemsPerPage) {
$componentItemsPerPage = $this->_itemsPerPage;
}
if ($componentItemsPerPage) {
$currentItemsPerPage = $componentItemsPerPage;
} else {
$currentItemsPerPage = $defaultItemsPerPage;
}
$this->addOptions([
'itemsPerPageParamName' => $this->_getItemsPerPageParamName($grid->getId()),
'defaultItemsPerPage' => $defaultItemsPerPage,
'currentItemsPerPage' => $currentItemsPerPage,
'itemsTotal' => $iterator->getCount(),
'pageParamName' => PKPHandler::getPageParamName($grid->getId()),
'currentPage' => $iterator->getPage()
]);
parent::setOptions($request, $grid);
}
//
// Hooks implementation.
//
/**
* @copydoc GridFeature::gridInitialize()
* The feature will know about the current filter
* value so it can request grid refreshes keeping
* the filter.
*/
public function getGridDataElements($args)
{
$filter = $args['filter'];
if (is_array($filter) && !empty($filter)) {
$this->addOptions(['filter' => json_encode($filter)]);
}
}
/**
* @copydoc GridFeature::setGridDataElements()
*/
public function setGridDataElements($args)
{
$grid = & $args['grid'];
$data = & $args['data'];
if (is_array($data)) {
$request = Application::get()->getRequest();
$rangeInfo = $grid->getGridRangeInfo($request, $grid->getId());
$itemIterator = new ArrayItemIterator($data, $rangeInfo->getPage(), $rangeInfo->getCount());
$this->_itemIterator = $itemIterator;
$data = $itemIterator->toArray();
} elseif ($data instanceof ItemIterator) {
$this->_itemIterator = $data;
}
}
/**
* @copydoc GridFeature::getRequestArgs()
*/
public function getRequestArgs($args)
{
$grid = $args['grid'];
$requestArgs = & $args['requestArgs'];
// Add paging info so grid actions will not lose paging context.
// Only works if grid link actions use the getRequestArgs
// returned content.
$request = Application::get()->getRequest();
$rangeInfo = $grid->getGridRangeInfo($request, $grid->getId());
$requestArgs[GridHandler::getPageParamName($grid->getId())] = $rangeInfo->getPage();
$requestArgs[$this->_getItemsPerPageParamName($grid->getId())] = $rangeInfo->getCount();
}
/**
* @copydoc GridFeature::getGridRangeInfo()
*/
public function getGridRangeInfo($args)
{
$request = $args['request'];
$grid = $args['grid'];
$rangeInfo = $args['rangeInfo'];
// Add grid level items per page setting, if any.
$itemsPerPage = $request->getUserVar($this->_getItemsPerPageParamName($grid->getId()));
if ($this->_itemsPerPage) {
$itemsPerPage = $this->_itemsPerPage;
} // Feature config overrides.
if ($itemsPerPage) {
$rangeInfo->setCount($itemsPerPage);
}
}
//
// Private helper methods.
//
/**
* Get the range info items per page parameter name.
*
* @param string $rangeName
*
* @return string
*/
private function _getItemsPerPageParamName($rangeName)
{
return $rangeName . 'ItemsPerPage';
}
}
if (!PKP_STRICT_MODE) {
class_alias('\PKP\controllers\grid\feature\GeneralPagingFeature', '\GeneralPagingFeature');
}