Open Journal Systems  3.3.0
CategoryGridHandler.inc.php
1 <?php
2 
16 // import grid classes
17 import('lib.pkp.classes.controllers.grid.GridHandler');
18 import('lib.pkp.classes.controllers.grid.GridCategoryRow');
19 
20 // empty category constant
21 define('GRID_CATEGORY_NONE', 'NONE');
22 
24 
26  var $_emptyCategoryRowText = 'grid.noItems';
27 
30 
32  var $_currentCategoryId = null;
33 
34 
38  function __construct($dataProvider = null) {
39  parent::__construct($dataProvider);
40 
41  import('lib.pkp.classes.controllers.grid.NullGridCellProvider');
42  $this->addColumn(new GridColumn('indent', null, null, null,
43  new NullGridCellProvider(), array('indent' => true, 'width' => 2)));
44  }
45 
46 
47  //
48  // Getters and setters.
49  //
54  function getEmptyCategoryRowText() {
56  }
57 
62  function setEmptyCategoryRowText($translationKey) {
63  $this->_emptyCategoryRowText = $translationKey;
64  }
65 
70  function getCurrentCategoryId() {
72  }
73 
82  function getDataElementInCategorySequence($categoryId, &$gridDataElement) {
83  assert(false);
84  }
85 
94  function setDataElementInCategorySequence($categoryId, &$gridDataElement, $newSequence) {
95  assert(false);
96  }
97 
104  function isDataElementInCategorySelected($categoryId, &$gridDataElement) {
105  assert(false);
106  }
107 
114  function &getGridCategoryDataElements($request, $categoryElement) {
115  $filter = $this->getFilterSelectionData($request);
116 
117  // Get the category element id.
118  $categories = $this->getGridDataElements($request);
119  $categoryElementId = array_search($categoryElement, $categories);
120  assert($categoryElementId !== false);
121 
122  // Try to load data if it has not yet been loaded.
123  if (!is_array($this->_categoryData) || !array_key_exists($categoryElementId, $this->_categoryData)) {
124  $data = $this->loadCategoryData($request, $categoryElement, $filter);
125 
126  if (is_null($data)) {
127  // Initialize data to an empty array.
128  $data = array();
129  }
130 
131  $this->setGridCategoryDataElements($request, $categoryElementId, $data);
132  }
133 
134  return $this->_categoryData[$categoryElementId];
135  }
136 
144  function hasGridDataElementsInCategory($categoryElement, $request) {
145  $data =& $this->getGridCategoryDataElements($request, $categoryElement);
146  assert (is_array($data));
147  return (boolean) count($data);
148  }
149 
156  function getCategoryItemsCount($categoryElement, $request) {
157  $data = $this->getGridCategoryDataElements($request, $categoryElement);
158  assert(is_array($data));
159  return count($data);
160  }
161 
167  function setGridCategoryDataElements($request, $categoryElementId, $data) {
168  // Make sure we have an array to store all categories elements data.
169  if (!is_array($this->_categoryData)) {
170  $this->_categoryData = array();
171  }
172 
173  // FIXME: We go to arrays for all types of iterators because
174  // iterators cannot be re-used, see #6498.
175  if (is_array($data)) {
176  $this->_categoryData[$categoryElementId] = $data;
177  } elseif(is_a($data, 'DAOResultFactory')) {
178  $this->_categoryData[$categoryElementId] = $data->toAssociativeArray();
179  } elseif(is_a($data, 'ItemIterator')) {
180  $this->_categoryData[$categoryElementId] = $data->toArray();
181  } else {
182  assert(false);
183  }
184  }
185 
186 
187  //
188  // Public handler methods
189  //
197  function fetchCategory($args, $request) {
198  // Instantiate the requested row (includes a
199  // validity check on the row id).
200  $row = $this->getRequestedCategoryRow($request, $args);
201 
202  $json = new JSONMessage(true);
203  if (is_null($row)) {
204  // Inform the client that the category does no longer exist.
205  $json->setAdditionalAttributes(array('elementNotFound' => (int)$args['rowId']));
206  } else {
207  // Render the requested category
208  $this->setFirstDataColumn();
209  $json->setContent($this->_renderCategoryInternally($request, $row));
210  }
211  return $json;
212  }
213 
214 
215  //
216  // Extended methods from GridHandler
217  //
221  function initialize($request, $args = null) {
222  parent::initialize($request, $args);
223 
224  if (!is_null($request->getUserVar('rowCategoryId'))) {
225  $this->_currentCategoryId = (string) $request->getUserVar('rowCategoryId');
226  }
227  }
228 
232  function getRequestArgs() {
233  $args = parent::getRequestArgs();
234 
235  // If grid is rendering grid rows inside category,
236  // add current category id value so rows will also know
237  // their parent category.
238  if (!is_null($this->_currentCategoryId)) {
239  if ($this->getCategoryRowIdParameterName()) {
241  }
242  }
243 
244  return $args;
245  }
246 
247 
251  public function getJSHandler() {
252  return '$.pkp.controllers.grid.CategoryGridHandler';
253  }
254 
258  function setUrls($request, $extraUrls = array()) {
259  $router = $request->getRouter();
260  $extraUrls['fetchCategoryUrl'] = $router->url($request, null, null, 'fetchCategory', null, $this->getRequestArgs());
261  parent::setUrls($request, $extraUrls);
262  }
263 
267  protected function getRowsSequence($request) {
268  return array_keys($this->getGridCategoryDataElements($request, $this->getCurrentCategoryId()));
269  }
270 
274  protected function doSpecificFetchGridActions($args, $request, $templateMgr) {
275  // Render the body elements (category groupings + rows inside a <tbody>)
276  $gridBodyParts = $this->_renderCategoriesInternally($request);
277  $templateMgr->assign('gridBodyParts', $gridBodyParts);
278  }
279 
283  protected function getRowDataElement($request, &$rowId) {
284  $rowData = parent::getRowDataElement($request, $rowId);
285  $rowCategoryId = $request->getUserVar('rowCategoryId');
286 
287  if (is_null($rowData) && !is_null($rowCategoryId)) {
288  // Try to get row data inside category.
289  $categoryRowData = parent::getRowDataElement($request, $rowCategoryId);
290  if (!is_null($categoryRowData)) {
291  $categoryElements = $this->getGridCategoryDataElements($request, $categoryRowData);
292 
293  assert(is_array($categoryElements));
294  if (!isset($categoryElements[$rowId])) return null;
295 
296  // Let grid (and also rows) knowing the current category id.
297  // This value will be published by the getRequestArgs method.
298  $this->_currentCategoryId = $rowCategoryId;
299 
300  return $categoryElements[$rowId];
301  }
302  } else {
303  return $rowData;
304  }
305  }
306 
310  protected function setFirstDataColumn() {
311  $columns =& $this->getColumns();
312  reset($columns);
313  // Category grids will always have indent column firstly,
314  // so we need to consider the first column the second one.
315  $secondColumn = next($columns); /* @var $secondColumn GridColumn */
316  $secondColumn->addFlag('firstColumn', true);
317  }
318 
322  protected function renderRowInternally($request, $row) {
323  if ($this->getCategoryRowIdParameterName()) {
324  $param = $this->getRequestArg($this->getCategoryRowIdParameterName());
325  $templateMgr = TemplateManager::getManager($request);
326  $templateMgr->assign('categoryId', $param);
327  }
328 
329  return parent::renderRowInternally($request, $row);
330  }
331 
343  protected function getRequestedCategoryRow($request, $args) {
344  if (isset($args['rowId'])) {
345  // A row ID was specified. Fetch it
346  $elementId = $args['rowId'];
347 
348  // Retrieve row data for the requested row id
349  // (we can use the default getRowData element, works for category grids as well).
350  $dataElement = $this->getRowDataElement($request, $elementId);
351  if (is_null($dataElement)) {
352  // If the row doesn't exist then
353  // return null. It may be that the
354  // row has been deleted in the meantime
355  // and the client does not yet know about this.
356  $nullVar = null;
357  return $nullVar;
358  }
359  }
360 
361  // Instantiate a new row
362  return $this->_getInitializedCategoryRowInstance($request, $elementId, $dataElement);
363  }
364 
365 
366  //
367  // Protected methods to be overridden/used by subclasses
368  //
375  protected function getCategoryRowInstance() {
376  //provide a sensible default category row definition
377  return new GridCategoryRow();
378  }
379 
384  protected function getCategoryRowIdParameterName() {
385  // Must be implemented by subclasses.
386  return null;
387  }
388 
396  protected function loadCategoryData($request, &$categoryDataElement, $filter = null) {
397  $gridData = array();
398  $dataProvider = $this->getDataProvider();
399  if (is_a($dataProvider, 'CategoryGridDataProvider')) {
400  // Populate the grid with data from the
401  // data provider.
402  $gridData = $dataProvider->loadCategoryData($request, $categoryDataElement, $filter);
403  }
404  return $gridData;
405  }
406 
407 
408  //
409  // Private helper methods
410  //
419  private function _getInitializedCategoryRowInstance($request, $elementId, $element) {
420  // Instantiate a new row
421  $row = $this->getCategoryRowInstance();
422  $row->setGridId($this->getId());
423  $row->setId($elementId);
424  $row->setData($element);
425  $row->setRequestArgs($this->getRequestArgs());
426 
427  // Initialize the row before we render it
428  $row->initialize($request);
429  $this->callFeaturesHook('getInitializedCategoryRowInstance',
430  array('request' => $request,
431  'grid' => $this,
432  'categoryId' => $this->_currentCategoryId,
433  'row' => $row));
434  return $row;
435  }
436 
441  private function _renderCategoriesInternally($request) {
442  // Iterate through the rows and render them according
443  // to the row definition.
444  $renderedCategories = array();
445 
446  $elements = $this->getGridDataElements($request);
447  foreach($elements as $key => $element) {
448 
449  // Instantiate a new row
450  $categoryRow = $this->_getInitializedCategoryRowInstance($request, $key, $element);
451 
452  // Render the row
453  $renderedCategories[] = $this->_renderCategoryInternally($request, $categoryRow);
454  }
455 
456  return $renderedCategories;
457  }
458 
465  private function _renderCategoryInternally($request, $categoryRow) {
466  // Prepare the template to render the category.
467  $templateMgr = TemplateManager::getManager($request);
468  $templateMgr->assign('grid', $this);
469  $columns = $this->getColumns();
470  $templateMgr->assign('columns', $columns);
471 
472  $categoryDataElement = $categoryRow->getData();
473  $rowData = $this->getGridCategoryDataElements($request, $categoryDataElement);
474 
475  // Render the data rows
476  $templateMgr->assign('categoryRow', $categoryRow);
477 
478  // Let grid (and also rows) knowing the current category id.
479  // This value will be published by the getRequestArgs method.
480  $this->_currentCategoryId = $categoryRow->getId();
481 
482  $renderedRows = $this->renderRowsInternally($request, $rowData);
483  $templateMgr->assign('rows', $renderedRows);
484 
485  $renderedCategoryRow = $this->renderRowInternally($request, $categoryRow);
486 
487  // Finished working with this category, erase the current id value.
488  $this->_currentCategoryId = null;
489 
490  $templateMgr->assign('renderedCategoryRow', $renderedCategoryRow);
491  return $templateMgr->fetch('controllers/grid/gridBodyPartWithCategory.tpl');
492  }
493 }
494 
495 
GridHandler\renderRowsInternally
renderRowsInternally($request, &$elements)
Definition: GridHandler.inc.php:1015
CategoryGridHandler\__construct
__construct($dataProvider=null)
Definition: CategoryGridHandler.inc.php:47
GridColumn
The GridColumn class represents a column within a grid. It is used to format the data presented in a ...
Definition: GridColumn.inc.php:27
PKPHandler\__construct
__construct()
Definition: PKPHandler.inc.php:85
CategoryGridHandler\getRequestedCategoryRow
getRequestedCategoryRow($request, $args)
Definition: CategoryGridHandler.inc.php:352
CategoryGridHandler\fetchCategory
fetchCategory($args, $request)
Definition: CategoryGridHandler.inc.php:206
GridHandler\getDataProvider
getDataProvider()
Definition: GridHandler.inc.php:157
CategoryGridHandler\getDataElementInCategorySequence
getDataElementInCategorySequence($categoryId, &$gridDataElement)
Definition: CategoryGridHandler.inc.php:91
CategoryGridHandler\setUrls
setUrls($request, $extraUrls=array())
Definition: CategoryGridHandler.inc.php:267
CategoryGridHandler\loadCategoryData
loadCategoryData($request, &$categoryDataElement, $filter=null)
Definition: CategoryGridHandler.inc.php:405
CategoryGridHandler\getRowsSequence
getRowsSequence($request)
Definition: CategoryGridHandler.inc.php:276
NullGridCellProvider
Class to return null when render method is called by a grid handler. Use this when you want to create...
Definition: NullGridCellProvider.inc.php:20
CategoryGridHandler\hasGridDataElementsInCategory
hasGridDataElementsInCategory($categoryElement, $request)
Definition: CategoryGridHandler.inc.php:153
CategoryGridHandler\setEmptyCategoryRowText
setEmptyCategoryRowText($translationKey)
Definition: CategoryGridHandler.inc.php:71
CategoryGridHandler\getRowDataElement
getRowDataElement($request, &$rowId)
Definition: CategoryGridHandler.inc.php:292
PKPHandler\getId
getId()
Definition: PKPHandler.inc.php:107
GridCategoryRow
Class defining basic operations for handling the category row in a grid.
Definition: GridCategoryRow.inc.php:19
GridHandler\getRequestArg
getRequestArg($key)
Definition: GridHandler.inc.php:197
GridHandler\getGridDataElements
& getGridDataElements($request)
Definition: GridHandler.inc.php:345
Seboettg\Collection\next
next()
Definition: ArrayListTrait.php:65
GridHandler\addColumn
addColumn($column)
Definition: GridHandler.inc.php:335
CategoryGridHandler\getJSHandler
getJSHandler()
Definition: CategoryGridHandler.inc.php:260
CategoryGridHandler\$_emptyCategoryRowText
$_emptyCategoryRowText
Definition: CategoryGridHandler.inc.php:29
CategoryGridHandler\$_categoryData
$_categoryData
Definition: CategoryGridHandler.inc.php:35
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
CategoryGridHandler\setDataElementInCategorySequence
setDataElementInCategorySequence($categoryId, &$gridDataElement, $newSequence)
Definition: CategoryGridHandler.inc.php:103
CategoryGridHandler\isDataElementInCategorySelected
isDataElementInCategorySelected($categoryId, &$gridDataElement)
Definition: CategoryGridHandler.inc.php:113
CategoryGridHandler\getRequestArgs
getRequestArgs()
Definition: CategoryGridHandler.inc.php:241
CategoryGridHandler\$_currentCategoryId
$_currentCategoryId
Definition: CategoryGridHandler.inc.php:41
CategoryGridHandler\setFirstDataColumn
setFirstDataColumn()
Definition: CategoryGridHandler.inc.php:319
Seboettg\Collection\count
count()
Definition: ArrayListTrait.php:253
CategoryGridHandler\initialize
initialize($request, $args=null)
Definition: CategoryGridHandler.inc.php:230
CategoryGridHandler
Class defining basic operations for handling HTML grids with categories.
Definition: CategoryGridHandler.inc.php:23
GridHandler\getColumns
& getColumns()
Definition: GridHandler.inc.php:275
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
GridHandler\getFilterSelectionData
getFilterSelectionData($request)
Definition: GridHandler.inc.php:906
CategoryGridHandler\renderRowInternally
renderRowInternally($request, $row)
Definition: CategoryGridHandler.inc.php:331
GridHandler
This class defines basic operations for handling HTML grids. Grids are used to implement a standardiz...
Definition: GridHandler.inc.php:58
CategoryGridHandler\getEmptyCategoryRowText
getEmptyCategoryRowText()
Definition: CategoryGridHandler.inc.php:63
CategoryGridHandler\getCurrentCategoryId
getCurrentCategoryId()
Definition: CategoryGridHandler.inc.php:79
CategoryGridHandler\getGridCategoryDataElements
& getGridCategoryDataElements($request, $categoryElement)
Definition: CategoryGridHandler.inc.php:123
CategoryGridHandler\getCategoryItemsCount
getCategoryItemsCount($categoryElement, $request)
Definition: CategoryGridHandler.inc.php:165
CategoryGridHandler\doSpecificFetchGridActions
doSpecificFetchGridActions($args, $request, $templateMgr)
Definition: CategoryGridHandler.inc.php:283
CategoryGridHandler\getCategoryRowIdParameterName
getCategoryRowIdParameterName()
Definition: CategoryGridHandler.inc.php:393
GridHandler\callFeaturesHook
callFeaturesHook($hookName, $args)
Definition: GridHandler.inc.php:996
CategoryGridHandler\setGridCategoryDataElements
setGridCategoryDataElements($request, $categoryElementId, $data)
Definition: CategoryGridHandler.inc.php:176
CategoryGridHandler\getCategoryRowInstance
getCategoryRowInstance()
Definition: CategoryGridHandler.inc.php:384