40 import(
'lib.pkp.classes.handler.PKPHandler');
43 import(
'lib.pkp.classes.linkAction.LinkAction');
46 import(
'lib.pkp.classes.controllers.grid.GridColumn');
47 import(
'lib.pkp.classes.controllers.grid.GridRow');
50 import(
'lib.pkp.classes.core.JSONMessage');
53 define(
'GRID_ACTION_POSITION_DEFAULT',
'default');
54 define(
'GRID_ACTION_POSITION_ABOVE',
'above');
55 define(
'GRID_ACTION_POSITION_LASTCOL',
'lastcol');
56 define(
'GRID_ACTION_POSITION_BELOW',
'below');
77 var
$_actions = array(GRID_ACTION_POSITION_DEFAULT => array());
109 $this->_dataProvider = $dataProvider;
110 parent::__construct();
144 $requestArgs = array();
145 if (is_a($dataProvider,
'GridDataProvider')) {
146 $requestArgs = $dataProvider->getRequestArgs();
149 $this->
callFeaturesHook(
'getRequestArgs', array(
'grid' => &$this,
'requestArgs' => &$requestArgs));
163 assert(isset($requestArgs[$key]));
164 return $requestArgs[$key];
180 $this->_title = $title;
196 $this->_emptyRowText = $emptyRowText;
212 $this->_footNote = $footNote;
220 function getActions($position = GRID_ACTION_POSITION_ABOVE) {
221 if(!isset($this->_actions[$position]))
return array();
222 return $this->_actions[$position];
230 function addAction($action, $position = GRID_ACTION_POSITION_ABOVE) {
231 if (!isset($this->_actions[$position])) $this->_actions[$position] = array();
232 $this->_actions[$position][$action->getId()] = $action;
249 assert(isset($this->_columns[$columnId]));
250 return $this->_columns[$columnId];
261 if ($column->hasFlag($flag)) {
262 $columns[$column->getId()] = $column;
278 if (!$column->hasFlag($flag)) {
292 return isset($this->_columns[$columnId]);
300 assert(is_a($column,
'GridColumn'));
301 $this->_columns[$column->getId()] = $column;
313 if (is_null($this->_data)) {
314 $data = $this->
loadData($request, $filter);
316 if (is_null($data)) {
324 $this->
callFeaturesHook(
'getGridDataElements', array(
'request' => &$request,
'grid' => &$this,
'gridData' => &$data,
'filter' => &$filter));
335 assert (is_array($data));
336 return (
boolean) count($data);
344 $this->
callFeaturesHook(
'setGridDataElements', array(
'grid' => &$this,
'data' => &$data));
348 if (is_array($data)) {
349 $this->_data = $data;
350 } elseif(is_a($data,
'DAOResultFactory')) {
351 $this->_data = $data->toAssociativeArray();
352 } elseif(is_a($data,
'ItemIterator')) {
353 $this->_data = $data->toArray();
364 if (is_null($this->_template)) {
376 $this->_template = $template;
394 function setUrls($request, $extraUrls = array()) {
395 $router = $request->getRouter();
397 'fetchGridUrl' => $router->url($request,
null,
null,
'fetchGrid',
null, $this->getRequestArgs()),
398 'fetchRowsUrl' => $router->url($request,
null,
null,
'fetchRows',
null, $this->getRequestArgs()),
399 'fetchRowUrl' => $router->url($request,
null,
null,
'fetchRow',
null, $this->getRequestArgs())
401 $this->_urls = array_merge($urls, $extraUrls);
504 $isModified = isset($args[
'modify']);
505 if (isset($args[
'rowId']) && !$isModified) {
507 $elementId = $args[
'rowId'];
511 if (is_null($dataElement)) {
519 } elseif ( $isModified ) {
525 if ( isset($args[
'rowId']) ) {
527 $elementId = $args[
'rowId'];
532 return $this->_getInitializedRowInstance($request, $elementId, $dataElement, $isModified);
554 $rangeInfo = parent::getRangeInfo($request, $rangeName, $contextData);
556 $this->
callFeaturesHook(
'getGridRangeInfo', array(
'request' => &$request,
'grid' => &$this,
'rangeInfo' => $rangeInfo));
568 function authorize($request, &$args, $roleAssignments) {
570 $hasDataProvider = is_a($dataProvider,
'GridDataProvider');
571 if ($hasDataProvider) {
572 $this->
addPolicy($dataProvider->getAuthorizationPolicy($request, $args, $roleAssignments));
575 $success = parent::authorize($request, $args, $roleAssignments);
577 if ($hasDataProvider && $success ===
true) {
590 parent::initialize($request);
596 import(
'lib.pkp.classes.linkAction.request.NullAction');
602 'search_extras_expand'
610 $this->_addFeatures($this->
initFeatures($request, $args));
630 $templateMgr->assign(
'grid', $this);
631 $templateMgr->assign(
'request', $request);
635 $templateMgr->assign(
'gridFilterForm', $renderedFilter);
640 $templateMgr->assign(
'columns', $columns);
642 $this->_fixColumnWidths();
650 $this->
callFeaturesHook(
'fetchGrid', array(
'grid' => &$this,
'request' => &$request));
653 $templateMgr->assign(
'features', $this->
getFeatures());
656 $templateMgr->assign(
'gridConstants', $this->_constants);
659 return new JSONMessage(
true, $templateMgr->fetch($this->getTemplate()));
675 $json->setStatus(
false);
678 $renderedRowsString =
null;
679 foreach ($renderedRows as $rowString) {
680 $renderedRowsString .= $rowString;
682 $json->setStatus(
true);
683 $json->setContent($renderedRowsString);
686 $this->
callFeaturesHook(
'fetchRows', array(
'request' => &$request,
'grid' => &$this,
'jsonMessage' => &$json));
698 function fetchRow($args, $request) {
706 $json->setAdditionalAttributes(array(
'elementNotFound' => $args[
'rowId']));
709 $renderedRow = $this->
renderRow($request, $row);
710 $json->setContent($renderedRow);
714 $json->setAdditionalAttributes(array(
'sequenceMap' => $sequenceMap));
717 $this->
callFeaturesHook(
'fetchRow', array(
'request' => &$request,
'grid' => &$this,
'row' => &$row,
'jsonMessage' => &$json));
731 if(!isset($args[
'columnId']))
fatalError(
'Missing column id!');
738 if (is_null($row))
fatalError(
'Row not found!');
741 return new JSONMessage(
true, $this->_renderCellInternally($request, $row, $column));
754 $this->
callFeaturesHook(
'saveSequence', array(
'request' => &$request,
'grid' => &$this));
764 return '$.pkp.controllers.grid.GridHandler';
805 fatalError(
'Grid does not support data element creation!');
819 assert(is_array($elements));
820 if (!isset($elements[$rowId]))
return null;
822 return $elements[$rowId];
833 protected function loadData($request, $filter) {
836 if (is_a($dataProvider,
'GridDataProvider')) {
839 $gridData = $dataProvider->loadData($filter);
842 $this->
callFeaturesHook(
'loadData', array(
'request' => &$request,
'grid' => &$this,
'gridData' => &$gridData));
880 protected function renderFilter($request, $filterData = array()) {
885 case is_string($form):
889 $templateMgr->assign(
'filterData', $filterData);
893 $templateMgr->assign(
'filterSelectionData', $filterSelectionData);
895 return $templateMgr->fetch($form);
908 $returner[] = array(
'label' => __(
'common.noMatches'),
'value' =>
'');
924 $templateMgr->assign(
'gridBodyParts', $gridBodyParts);
936 $firstColumn = reset($columns);
937 $firstColumn->addFlag(
'firstColumn',
true);
962 if (is_array($features)) {
963 foreach ($features as &$feature) {
964 if (is_callable(array($feature, $hookName))) {
965 $feature->$hookName($args);
982 $renderedRows = array();
983 foreach ($elements as $elementId => $element) {
985 $row = $this->_getInitializedRowInstance($request, $elementId, $element);
991 return $renderedRows;
1007 $renderedCells = array();
1009 foreach ($columns as $column) {
1010 assert(is_a($column,
'GridColumn'));
1011 $renderedCells[] = $this->_renderCellInternally($request, $row, $column);
1016 $templateMgr->assign(array(
1018 'columns' => $columns,
1019 'cells' => $renderedCells,
1022 return $templateMgr->fetch($row->getTemplate());
1037 $gridBodyParts = array();
1038 if ( count($renderedRows) > 0 ) {
1039 $templateMgr->assign(
'grid', $this);
1040 $templateMgr->assign(
'rows', $renderedRows);
1041 $gridBodyParts[] = $templateMgr->fetch(
'controllers/grid/gridBodyPart.tpl');
1043 return $gridBodyParts;
1058 private function _getInitializedRowInstance($request, $elementId, &$element, $isModified =
false) {
1061 $row->setGridId($this->
getId());
1062 $row->setId($elementId);
1063 $row->setData($element);
1065 $row->setIsModified($isModified);
1068 $row->initialize($request);
1069 $this->
callFeaturesHook(
'getInitializedRowInstance', array(
'grid' => &$this,
'row' => &$row));
1084 private function _renderCellInternally($request, $row, $column) {
1087 $element =& $row->getData();
1088 if ( is_null($element) && $row->getIsModified() ) {
1089 import(
'lib.pkp.classes.controllers.grid.GridCellProvider');
1091 return $cellProvider->render($request, $row, $column);
1096 $cellProvider = $row->getCellProvider();
1097 if (!is_a($cellProvider,
'GridCellProvider')) {
1099 unset($cellProvider);
1101 $cellProvider = $column->getCellProvider();
1104 return $cellProvider->render($request, $row, $column);
1111 private function _fixColumnWidths() {
1114 $noSpecifiedWidthCount = 0;
1116 foreach ($columns as $column) {
1117 if ($column->hasFlag(
'width')) {
1118 $width += $column->getFlag(
'width');
1120 $noSpecifiedWidthCount++;
1127 if ($noSpecifiedWidthCount > 0) {
1129 foreach ($columns as $column) {
1130 if (!$column->hasFlag(
'width')) {
1131 $modifyColumn = $this->
getColumn($column->getId());
1132 $modifyColumn->addFlag(
'width', round((100 - $width)/$noSpecifiedWidthCount));
1133 unset($modifyColumn);
1141 if ($noSpecifiedWidthCount == 0) {
1143 $columnsToModify = $columns;
1144 foreach ($columns as $key => $column) {
1146 if ($column->getId() ==
'indent') {
1147 unset($columnsToModify[$key]);
1152 $difference = $width - 100;
1153 $columnsCount =
count($columnsToModify);
1154 $removeValue = round($difference/$columnsCount);
1155 foreach ($columnsToModify as $column) {
1156 $modifyColumn = $this->
getColumn($column->getId());
1157 if (end($columnsToModify) === $column) {
1159 $totalWidth = $width - ($removeValue * $columnsCount);
1160 if ($totalWidth < 100) {
1161 $removeValue -= 100 - $totalWidth;
1165 $modifyColumn->addFlag(
'width', $modifyColumn->getFlag(
'width') - $removeValue);
1175 private function _addFeatures($features) {
1176 assert(is_array($features));
1177 foreach ($features as &$feature) {
1178 assert(is_a($feature,
'GridFeature'));
1179 $this->_features[$feature->getId()] = $feature;