diff --git a/Controller/GrouperGroupsController.php b/Controller/GrouperGroupsController.php index c2b9f69..5e6f072 100644 --- a/Controller/GrouperGroupsController.php +++ b/Controller/GrouperGroupsController.php @@ -36,10 +36,20 @@ class GrouperGroupsController extends GrouperLiteAppController { public $helpers = array('Html', 'Form', 'Flash'); - public $components = array('Flash'); + public $components = array('Flash', 'Paginator'); public $name = 'GrouperGroups'; + //Unfortunately we cannot go below 20 since that is the default and if change to below 20 will not show + //page navigation unless change record count and go back to lower number on Display record selection!! Sucks! + public $paginate = array( + //Default records per page. + 'limit' => 20, + 'maxlimit' => 60, + 'page' => 1 + ); + + /** * Overrides parent beforeFilter to verify that Session contains the correct API settings. * @@ -121,12 +131,25 @@ public function groupInfo() { public function groupOwner() { $this->set('title', _txt('pl.grouperlite.title.groupowner')); + //Set initial settings for pagination + $scope = [ + 'userId' => $this->userId, + 'page' => ($this->passedArgs['page'] ? $this->passedArgs['page']: $this->paginate['page']), + 'limit' => ($this->passedArgs['limit'] ? $this->passedArgs['limit']: $this->paginate['limit']), + ]; + if (isset($this->request->data['search'])) { $searchCriteria = urldecode($this->request->data['search']); $this->set('searchcriteria', $searchCriteria); try { - $this->set('groupergroupsowner', $this->GrouperGroup->getSearchedGroups($this->userId, $searchCriteria, 'groupOwner')); + //Add settings for search Owned Groups + $scope['method'] = 'getSearchedGroups'; + $scope['searchcriteria'] = $searchCriteria; + $scope['searchpage'] = 'ownerGroups'; + + $data = $this->Paginator->paginate('GrouperGroup', $scope); + $this->set('groupergroupsowner', $data); } catch (Exception $e) { CakeLog::write('error', __METHOD__ . ' Search: ' . var_export($e->getMessage(), true)); @@ -137,7 +160,11 @@ public function groupOwner() { } } else { try { - $this->set('groupergroupsowner', $this->GrouperGroup->ownerGroups($this->userId)); + $scope['method'] = 'ownerGroups'; + + $data = $this->Paginator->paginate('GrouperGroup', $scope); + $this->set('groupergroupsowner', $data); + } catch (Exception $e) { CakeLog::write('error', __METHOD__ . ': ' . var_export($e->getMessage(), true)); @@ -158,12 +185,25 @@ public function groupOwner() { public function groupMember() { $this->set('title', _txt('pl.grouperlite.title.groupmember')); + //Set initial settings for pagination + $scope = [ + 'userId' => $this->userId, + 'page' => ($this->passedArgs['page'] ? $this->passedArgs['page']: $this->paginate['page']), + 'limit' => ($this->passedArgs['limit'] ? $this->passedArgs['limit']: $this->paginate['limit']), + ]; + if (isset($this->request->data['search'])) { $searchCriteria = urldecode($this->request->data['search']); $this->set('searchcriteria', $searchCriteria); try { - $this->set('groupergroupmemberships', $this->GrouperGroup->getSearchedGroups($this->userId, $searchCriteria, 'groupMember')); + //Add settings for search Member Groups + $scope['method'] = 'getSearchedGroups'; + $scope['searchcriteria'] = $searchCriteria; + $scope['searchpage'] = 'filteredMemberOfGroups'; + + $data = $this->Paginator->paginate('GrouperGroup', $scope); + $this->set('groupergroupmemberships', $data); } catch (Exception $e) { CakeLog::write('error', __METHOD__ . ' Search: ' . var_export($e->getMessage(), true)); @@ -174,7 +214,11 @@ public function groupMember() { } } else { try { - $this->set('groupergroupmemberships', $this->GrouperGroup->filteredMemberOfGroups($this->userId)); + //Add setting for Group Membership + $scope['method'] = 'filteredMemberOfGroups'; + + $data = $this->Paginator->paginate('GrouperGroup', $scope); + $this->set('groupergroupmemberships', $data); } catch (Exception $e) { CakeLog::write('error', __METHOD__ . ': ' . var_export($e->getMessage(), true)); @@ -193,12 +237,25 @@ public function groupMember() { public function groupOptin() { $this->set('title', _txt('pl.grouperlite.title.groupoptin')); + //Set initial settings for pagination + $scope = [ + 'userId' => $this->userId, + 'page' => ($this->passedArgs['page'] ? $this->passedArgs['page']: $this->paginate['page']), + 'limit' => ($this->passedArgs['limit'] ? $this->passedArgs['limit']: $this->paginate['limit']), + ]; + if (isset($this->request->data['search'])) { $searchCriteria = urldecode($this->request->data['search']); $this->set('searchcriteria', $searchCriteria); try { - $this->set('groupergroupoptin', $this->GrouperGroup->getSearchedGroups($this->userId, $searchCriteria, 'groupOptin')); + //Add settings for search Optin's + $scope['method'] = 'getSearchedGroups'; + $scope['searchcriteria'] = $searchCriteria; + $scope['searchpage'] = 'optinGroups'; + + $data = $this->Paginator->paginate('GrouperGroup', $scope); + $this->set('groupergroupoptin', $data); } catch (Exception $e) { CakeLog::write('error', __METHOD__ . 'Search: ' . var_export($e->getMessage(), true)); @@ -209,7 +266,11 @@ public function groupOptin() { } } else { try { - $this->set('groupergroupoptin', $this->GrouperGroup->optinGroups($this->userId)); + //Add settings for optinGroups + $scope['method'] = 'optinGroups'; + + $data = $this->Paginator->paginate('GrouperGroup', $scope); + $this->set('groupergroupoptin', $data); } catch (Exception $e) { CakeLog::write('error', __METHOD__ . ': ' . var_export($e->getMessage(), true)); diff --git a/Lib/GrouperApiAccess.php b/Lib/GrouperApiAccess.php index 81377e5..fa05bb2 100644 --- a/Lib/GrouperApiAccess.php +++ b/Lib/GrouperApiAccess.php @@ -80,7 +80,7 @@ public function __construct() { */ public function getGrouperUser(array $queryData) { - $userId = $queryData['conditions']['userId']; + $userId = $queryData['userId']; $this->http->setHeader(array('Content-Type' => 'application/json', 'Accept' => 'application/json')); // Create attributes want returned from call to Grouper WS @@ -127,7 +127,7 @@ public function getGrouperUser(array $queryData) { public function getGrouperMemberOfGroups(array $queryData) { //Build request logic - $userId = $queryData['conditions']['userId']; + $userId = $queryData['userId']; $connectionUrl = "{$this->config['fullUrl']}/subjects/{$userId}/groups"; try { @@ -154,9 +154,9 @@ public function getGrouperMemberOfGroups(array $queryData) { */ public function grouperGroupLeaveOrJoin(array $queryData) { - $groupName = $queryData['conditions']['groupName']; - $userId = $queryData['conditions']['userId']; - $groupLeaveOrJoin = $queryData['conditions']['LeaveJoin']; + $groupName = $queryData['groupName']; + $userId = $queryData['userId']; + $groupLeaveOrJoin = $queryData['LeaveJoin']; $groupName = urlencode($groupName); if ($groupLeaveOrJoin == "Leave") { @@ -216,7 +216,7 @@ public function grouperGroupLeaveOrJoin(array $queryData) { * */ public function getOptinGroups(array $queryData) { - $queryData['conditions']['groupType'] = 'Optins'; + $queryData['groupType'] = 'Optins'; try { $results = $this->useMembershipUrl($queryData); @@ -240,7 +240,7 @@ public function getOptinGroups(array $queryData) { * */ public function getOwnerGroups(array $queryData) { - $queryData['conditions']['groupType'] = 'Owner'; + $queryData['groupType'] = 'Owner'; try { $results = $this->useMembershipUrl($queryData); @@ -263,7 +263,7 @@ public function getOwnerGroups(array $queryData) { * @throws GrouperLiteException */ public function getOwnerStems(array $queryData) { - $queryData['conditions']['groupType'] = 'StemOwner'; + $queryData['groupType'] = 'StemOwner'; try { $results = $this->useMembershipUrl($queryData); @@ -290,8 +290,8 @@ public function getOwnerStems(array $queryData) { * @throws GrouperLiteException */ private function useMembershipUrl(array $queryData) { - $groupType = $queryData['conditions']['groupType']; - $userId = $queryData['conditions']['userId']; + $groupType = $queryData['groupType']; + $userId = $queryData['userId']; if ($groupType == 'Optins') { $fieldName = "optins"; @@ -335,7 +335,7 @@ private function useMembershipUrl(array $queryData) { * @throws GrouperLiteException */ public function getGrouperGroupDescription(array $queryData) { - $groupName = $queryData['conditions']['groupName']; + $groupName = $queryData['groupName']; //Build request logic $groupName = urlencode($groupName); @@ -367,10 +367,10 @@ public function createUpdateGroup(array $queryData) { //TODO - Need to add checking for missing ':' //Currently only supporting create group, need to test if update a group will work! - $groupName = $queryData['conditions']['groupName']; - $stemName = $queryData['conditions']['stemName']; - $userId = $queryData['conditions']['userId']; - $groupDescription = $queryData['conditions']['groupDescription']; + $groupName = $queryData['groupName']; + $stemName = $queryData['stemName']; + $userId = $queryData['userId']; + $groupDescription = $queryData['groupDescription']; $newGroupToSave = $stemName . $groupName; @@ -420,7 +420,7 @@ public function createUpdateGroup(array $queryData) { */ public function getGroupAttributes(array $queryData) { // Need to pass in the full stem path, so thing like sandbox:app:sympa are good! - $groupName = $queryData['conditions']['groupName']; + $groupName = $queryData['groupName']; //Build request logic $stemToFind = array( diff --git a/Model/CoManagePerson.php b/Model/CoManagePerson.php new file mode 100644 index 0000000..8d999c9 --- /dev/null +++ b/Model/CoManagePerson.php @@ -0,0 +1,11 @@ +grouperAPI->getGroupAttributes($args); diff --git a/Model/GrouperGroup.php b/Model/GrouperGroup.php index 72e814e..3326ad3 100644 --- a/Model/GrouperGroup.php +++ b/Model/GrouperGroup.php @@ -42,30 +42,18 @@ class GrouperGroup extends GrouperLiteAppModel /** @var GrouperApiAccess $grouperAPI */ public $grouperAPI = null; - /** - * Used to instantiate API class - * - * Tried to use the constructor for GrouperGroup to set this but it was triggering the GrouperAPIAccess class - * to instantiate before the Controller was able populate the connection settings from the DB into the Session, - * so error was being thrown. - * Now will call this before each function call to verify set. - */ - private function initApi() { - if ($this->grouperAPI == null) { - $this->grouperAPI = new GrouperApiAccess(); - } - } + private $totalRecords = 0; /** * Verifies if user is an owner/admin of a group and then stores results in Session. * Session variable is reset on Group Creation and Group Deletion * - * @see GrouperGroup::resetUserOwner() - * * @param string $userId Id of User * @return String T or F * @throws GrouperLiteException * + * @see GrouperGroup::resetUserOwner() + * */ public function isUserOwner(string $userId) { if (CakeSession::check('Plugin.Grouper.isUserOwner')) { @@ -76,7 +64,7 @@ public function isUserOwner(string $userId) { try { $args = array(); - $args['conditions']['userId'] = $userId; + $args['userId'] = $userId; $ownGroups = $this->grouperAPI->getOwnerGroups($args); @@ -94,14 +82,16 @@ public function isUserOwner(string $userId) { } /** - * Private function used to reset the IsUserOwner Session variable, - * that maintains the status of a user being an owner/admin of a group + * Used to instantiate API class * - * @see GrouperGroup::isUserOwner() + * Tried to use the constructor for GrouperGroup to set this but it was triggering the GrouperAPIAccess class + * to instantiate before the Controller was able populate the connection settings from the DB into the Session, + * so error was being thrown. + * Now will call this before each function call to verify set. */ - private function resetUserOwner() { - if (CakeSession::check('Plugin.Grouper.isUserOwner')) { - CakeSession::delete('Plugin.Grouper.isUserOwner'); + private function initApi() { + if ($this->grouperAPI == null) { + $this->grouperAPI = new GrouperApiAccess(); } } @@ -109,24 +99,22 @@ private function resetUserOwner() { * Return all Groups that a User belongs to in Grouper. * Will also add Optin Groups and flag them as joined so can display Optout option in UI. * - * @param string $userId Id of User + * @param array $conditions Listing of conditions for display of records, including UserId * @return array Records of Groups from Grouper that the User belongs to * @throws GrouperLiteException * */ - public function filteredMemberOfGroups(string $userId) { + public function filteredMemberOfGroups(array $conditions) { $this->initApi(); try { - $memberOfGroups = $this->memberOfGroups($userId); + $memberOfGroups = $this->memberOfGroups($conditions); - $args = array(); - $args['conditions']['userId'] = $userId; // Determine which groups can be left by user, if want. - $optInGroups = $this->grouperAPI->getOptinGroups($args); + $optInGroups = $this->grouperAPI->getOptinGroups($conditions); - foreach($memberOfGroups as &$memberOfGroup) { - foreach($optInGroups as $key => $value) { + foreach ($memberOfGroups as &$memberOfGroup) { + foreach ($optInGroups as $key => $value) { if ($value['name'] == $memberOfGroup['name']) { //Match! $memberOfGroup['optedin'] = true; @@ -136,6 +124,7 @@ public function filteredMemberOfGroups(string $userId) { } } } + return $this->getFriendlyName($memberOfGroups); } catch (Exception $e) { @@ -147,18 +136,15 @@ public function filteredMemberOfGroups(string $userId) { /** * Internal process used by other functions to fetch Groups the User is a member of * - * @param string $userId Id of User + * @param array $conditions Listing of conditions for display of records, including UserId * @return array Records of Groups from Grouper that the User belongs to * @throws GrouperLiteException * */ - private function memberOfGroups(string $userId) { + private function memberOfGroups(array $conditions) { try { - $args = array(); - $args['conditions']['userId'] = $userId; - - return $this->grouperAPI->getGrouperMemberOfGroups($args); + return $this->grouperAPI->getGrouperMemberOfGroups($conditions); } catch (Exception $e) { CakeLog::write('error', __METHOD__ . ': An error occurred'); @@ -166,6 +152,49 @@ private function memberOfGroups(string $userId) { } } + /** + * Determine if result set contains friendly name, if so add as a new attribute in result set + * + * @param array $groups Current result set of Groups + * @return array Same result set with added param for friendly name + * + */ + private function getFriendlyName(array $groups) { + + //NOT fetching attributes now, just using name display name as friendly name, if different from name field + foreach ($groups as &$group) { + //$group['friendlyName'] = $group['displayName']; + $nameSections = explode(':', $group['name']); + $friendlySections = explode(':', $group['displayName']); + $numberNameSections = count($nameSections); + for ($x = 0; $x < $numberNameSections; $x++) { + if ($nameSections[$x] == $friendlySections[$x]) { + unset($friendlySections[$x]); + } + } + $group['friendlyName'] = implode(':', $friendlySections); + if (strlen($group['friendlyName']) == 0) { + $group['friendlyName'] = $group['name']; + } + } + + return $groups; + + /* Old Process, keeping in case changes back! + foreach ($groups as &$group) { + $group['friendlyName'] = $group['displayName']; + $attributes = $this->grouperAPI->getGroupAttributes(array('conditions' => array('groupName' => $group['displayName']))); + foreach ($attributes as $attribute) { + if ($attribute['attributeDefNameName'] == $this->friendly) { + if (isset($attribute['wsAttributeAssignValues']['valueSystem'])) { + $group['friendlyName'] = $attribute['wsAttributeAssignValues']['valueSystem']; + } + break; + } + } + }*/ + } + /** * Gets the Grouper Groups params and values as well as its associated attributes. * @@ -178,7 +207,7 @@ public function groupDescriptions(string $groupName) { try { $args = array(); - $args['conditions']['groupName'] = $groupName; + $args['groupName'] = $groupName; $groupDescription = $this->grouperAPI->getGrouperGroupDescription($args); $groupInfo = $this->getFriendlyName($groupDescription); @@ -211,9 +240,9 @@ public function leaveGroup(string $userId, string $groupName) { try { $args = array(); - $args['conditions']['LeaveJoin'] = 'Leave'; - $args['conditions']['userId'] = $userId; - $args['conditions']['groupName'] = $groupName; + $args['LeaveJoin'] = 'Leave'; + $args['userId'] = $userId; + $args['groupName'] = $groupName; return $this->grouperAPI->grouperGroupLeaveOrJoin($args); @@ -237,9 +266,9 @@ public function joinGroup(string $userId, string $groupName) { try { $args = array(); - $args['conditions']['LeaveJoin'] = 'Join'; - $args['conditions']['userId'] = $userId; - $args['conditions']['groupName'] = $groupName; + $args['LeaveJoin'] = 'Join'; + $args['userId'] = $userId; + $args['groupName'] = $groupName; return $this->grouperAPI->grouperGroupLeaveOrJoin($args); @@ -252,19 +281,17 @@ public function joinGroup(string $userId, string $groupName) { /** * Return all Grouper Groups that the User has a role of owner/admin * - * @param string $userId + * @param array $conditions Listing of conditions for display of records, including UserId * @return array * @throws GrouperLiteException * */ - public function ownerGroups(string $userId) { + public function ownerGroups(array $conditions) { $this->initApi(); try { - $args = array(); - $args['conditions']['userId'] = $userId; + $ownGroups = $this->grouperAPI->getOwnerGroups($conditions); - $ownGroups = $this->grouperAPI->getOwnerGroups($args); return $this->getFriendlyName($ownGroups); } catch (Exception $e) { @@ -278,31 +305,30 @@ public function ownerGroups(string $userId) { * Get all Groups with Optin attribute set and display ones User can join. * Will Match up with Groups User is already a member of to determine which Optin groups to not display * - * @param string $userId Id of user + * @param array $conditions Listing of conditions for display of records, including UserId * @return array Listing of Optin groups available in Grouper * @throws GrouperLiteException Captured in Controller */ - public function optinGroups(string $userId) { + public function optinGroups(array $conditions) { $this->initApi(); try { - $args = array(); - $args['conditions']['userId'] = $userId; - - $joinOrLeave = $this->grouperAPI->getOptinGroups($args); - $userGroups = $this->memberOfGroups($userId); + $joinOrLeave = $this->grouperAPI->getOptinGroups($conditions); + $userGroups = $this->memberOfGroups($conditions); //See if Optin group match any of the groups user already belongs to. foreach ($joinOrLeave as $key => $value) { foreach ($userGroups as $userGroup) { if ($value['name'] == $userGroup['name']) { //Match!! - //Removing as already a member of. + //Removing from array since already a member of. unset($joinOrLeave[$key]); break; } } } + //$finalSet = $this->paginateRecords($joinOrLeave, $conditions); + return $this->getFriendlyName($joinOrLeave); } catch (Exception $e) { @@ -327,11 +353,11 @@ public function createGroup(string $userId, string $groupName, string $stemName, try { $args = array(); - $args['conditions']['groupType'] = 'Optins'; - $args['conditions']['userId'] = $userId; - $args['conditions']['groupName'] = $groupName; - $args['conditions']['stemName'] = $stemName; - $args['conditions']['groupDescription'] = $groupDesc; + $args['groupType'] = 'Optins'; + $args['userId'] = $userId; + $args['groupName'] = $groupName; + $args['stemName'] = $stemName; + $args['groupDescription'] = $groupDesc; // Reset Session variable that shows if User is an owner or not $this->resetUserOwner(); @@ -344,6 +370,18 @@ public function createGroup(string $userId, string $groupName, string $stemName, } } + /** + * Private function used to reset the IsUserOwner Session variable, + * that maintains the status of a user being an owner/admin of a group + * + * @see GrouperGroup::isUserOwner() + */ + private function resetUserOwner() { + if (CakeSession::check('Plugin.Grouper.isUserOwner')) { + CakeSession::delete('Plugin.Grouper.isUserOwner'); + } + } + /** * Get Grouper Stems where User has authority to create a Grouper Group * @@ -356,7 +394,7 @@ public function getOwnerStems(string $userId) { try { $args = array(); - $args['conditions']['userId'] = $userId; + $args['userId'] = $userId; return $this->grouperAPI->getOwnerStems($args); @@ -372,30 +410,22 @@ public function getOwnerStems(string $userId) { * functionality. This is due to the fact that the grouperName is autogenerated and this app needs to search * attributes which the Grouper WS does not do. * - * @param string $userId Id of User - * @param string $searchCriteria Search term entered by user - * @param string $page Page where search was executed, so can search correct criteria + * @param array $conditions Listing of conditions for display of records, including UserId * @return array Records that meet search criteria - * @throws GrouperLiteException Captured in Controller + * @throws Exception Captured in Controller */ - public function getSearchedGroups(string $userId, string $searchCriteria, string $page) { + public function getSearchedGroups(array $conditions) { $this->initApi(); try { - // Current list of views that search can be executed from - if($page == 'groupOptin') { - $pageResults = $this->optinGroups($userId); - } elseif ($page == 'groupOwner') { - $pageResults = $this->ownerGroups($userId); - } elseif ($page == 'groupMember') { - $pageResults = $this->filteredMemberOfGroups($userId); - } else { - $pageResults = array(); - } + //Breakout page where search was called and forward to appropriate method for processing + $page = $conditions['searchpage']; + $pageResults = $this->$page($conditions); $returnResults = array(); + $searchCriteria = $conditions['searchcriteria']; - foreach($pageResults as $result) { + foreach ($pageResults as $result) { $match = preg_grep("/$searchCriteria/i", $result); if (!empty($match)) { $returnResults[] = $result; @@ -411,46 +441,60 @@ public function getSearchedGroups(string $userId, string $searchCriteria, string } /** - * Determine if result set contains friendly name, if so add as a new attribute in result set + * Method needed to support Pagination + * Adjusted to fit the data source being the Grouper API vs DB calls * - * @param array $groups Current result set of Groups - * @return array Same result set with added param for friendly name + * @param $conditions Listing of conditions for display of records with pagination + * @return array Records requested by user with pagination support * */ - private function getFriendlyName(array $groups) { + public function paginate($conditions) { - //NOT fetching attributes now, just using name display name as friendly name, if different from name field - foreach ($groups as &$group) { - //$group['friendlyName'] = $group['displayName']; - $nameSections = explode(':', $group['name']); - $friendlySections = explode(':', $group['displayName']); - $numberNameSections = count($nameSections); - for($x = 0; $x < $numberNameSections; $x++){ - if ($nameSections[$x] == $friendlySections[$x]) { - unset($friendlySections[$x]); - } - } - $group['friendlyName'] = implode(':', $friendlySections); - if(strlen($group['friendlyName']) == 0 ){ - $group['friendlyName'] = $group['name']; - } - } + //Pull out the method that should be run. + $method = $conditions['method']; - return $groups; + $resultSet = $this->$method($conditions); - /* Old Process, keeping in case changes back! - foreach ($groups as &$group) { - $group['friendlyName'] = $group['displayName']; - $attributes = $this->grouperAPI->getGroupAttributes(array('conditions' => array('groupName' => $group['displayName']))); - foreach ($attributes as $attribute) { - if ($attribute['attributeDefNameName'] == $this->friendly) { - if (isset($attribute['wsAttributeAssignValues']['valueSystem'])) { - $group['friendlyName'] = $attribute['wsAttributeAssignValues']['valueSystem']; - } - break; - } - } - }*/ + return $this->paginateRecords($resultSet, $conditions); + } + + /** + * Parses returned records to display only requested records for pagination. + * + * @param array $recSet All Grouper Records associated to User's request + * @param array $conditions Listing of conditions for display of records with pagination + * @return array Records requested by user with pagination support + * + */ + private function paginateRecords(array $recSet, array $conditions) { + + //set for pagination record count + $this->totalRecords = count($recSet); + + //Now slice recordset to return correct set of records. + $page = $conditions['page'] - 1; + $limit = $conditions['limit']; + if ($page == 0) { + $start = 0; + } else { + $start = $page * $limit; + } + $end = $start + $limit; + + return array_slice($recSet, $start, $end); } + /** + * Needed method to support Cake's pagination in the views + * + * @param null $conditions Listing of conditions for display of records with pagination + * @param int $recursive + * @param array $extra + * @return int Total number of Grouper Records returned by Grouper API call + * + */ + public function paginateCount($conditions = null, $recursive = 0, + $extra = array()) { + return $this->totalRecords; + } } diff --git a/View/Elements/pagination.ctp b/View/Elements/pagination.ctp new file mode 100644 index 0000000..429510e --- /dev/null +++ b/View/Elements/pagination.ctp @@ -0,0 +1,133 @@ + + + diff --git a/View/Elements/pagination.php b/View/Elements/pagination.php deleted file mode 100644 index 2bb25ec..0000000 --- a/View/Elements/pagination.php +++ /dev/null @@ -1,110 +0,0 @@ - - - \ No newline at end of file diff --git a/View/GrouperGroups/groupmember.ctp b/View/GrouperGroups/groupmember.ctp index 5bb3b0a..91ccc69 100644 --- a/View/GrouperGroups/groupmember.ctp +++ b/View/GrouperGroups/groupmember.ctp @@ -32,5 +32,12 @@ + + + + element("pagination"); ?> + + + \ No newline at end of file diff --git a/View/GrouperGroups/groupoptin.ctp b/View/GrouperGroups/groupoptin.ctp index c016da5..473d1e6 100644 --- a/View/GrouperGroups/groupoptin.ctp +++ b/View/GrouperGroups/groupoptin.ctp @@ -32,6 +32,12 @@ + + + + element("pagination"); ?> + + + - Paginator->numbers(array('first' => 1, 'last' => 1)); ?> \ No newline at end of file diff --git a/View/GrouperGroups/groupowner.ctp b/View/GrouperGroups/groupowner.ctp index 606de69..8368178 100644 --- a/View/GrouperGroups/groupowner.ctp +++ b/View/GrouperGroups/groupowner.ctp @@ -39,5 +39,12 @@ + + + + element("pagination"); ?> + + + \ No newline at end of file