diff --git a/Config/Schema/schema.xml b/Config/Schema/schema.xml new file mode 100644 index 0000000..d78fd3c --- /dev/null +++ b/Config/Schema/schema.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + REFERENCES cm_co_dashboard_widgets(id) + + + + + + + + + + co_dashboard_widget_id + + +
+
\ No newline at end of file diff --git a/Controller/CoGrouperLitesController.php b/Controller/CoGrouperLitesController.php index fb563b0..32cb195 100644 --- a/Controller/CoGrouperLitesController.php +++ b/Controller/CoGrouperLitesController.php @@ -4,9 +4,69 @@ class CoGrouperLitesController extends SDWController { + public $helpers = array('Html', 'Form', 'Flash'); + public $components = array('Flash'); + // Class name, used by Cake public $name = "CoGrouperLites"; - //TODO - need to add the call $this->calculateParentPermissions($roles); for authorization + public $uses = array( + "GrouperLite.CoGrouperLite" + ); + + /** + * Callback after controller methods are invoked but before views are rendered. + * + * @since COmanage Registry v3.2.0 + */ + + function beforeRender() + { + $this->set('title_for_layout', _txt('pl.grouperlite.config.edit.title')); + + parent::beforeRender(); + } + + public function display($id) + { + $cfg = $this->CoGrouperLite->getConfig(); + + $this->set('title_for_layout', _txt('pl.grouperlite.config.display.title')); + // Pass the config so we know which div to overwrite + $this->set('vv_config', $cfg); + } + + + /** + * Authorization for this Controller, called by Auth component + * - precondition: Session.Auth holds data used for authz decisions + * - postcondition: $permissions set with calculated permissions + * + * @since COmanage Registry v3.2.0 + * @return Array Permissions + */ + + function isAuthorized() + { + $roles = $this->Role->calculateCMRoles(); + + // Determine what operations this user can perform + + // Construct the permission set for this user, which will also be passed to the view. + // Ask the parent to calculate the display permission, based on the configuration. + // Note that the display permission is set at the Dashboard, not Dashboard Widget level. + $p = $this->calculateParentPermissions($roles); + + // Delete an existing CO Announcements Widget? + $p['delete'] = ($roles['cmadmin'] || $roles['coadmin']); + + // Edit an existing CO Announcements Widget? + $p['edit'] = ($roles['cmadmin'] || $roles['coadmin']); + + // View an existing CO Announcements Widget? + $p['view'] = ($roles['cmadmin'] || $roles['coadmin']); + $this->set('permissions', $p); + return ($p[$this->action]); + } } \ No newline at end of file diff --git a/Controller/GrouperGroupsController.php b/Controller/GrouperGroupsController.php index db63416..d5477cd 100644 --- a/Controller/GrouperGroupsController.php +++ b/Controller/GrouperGroupsController.php @@ -9,7 +9,6 @@ class GrouperGroupsController extends GrouperLiteAppController public $components = array('Flash'); public $name = 'GrouperGroups'; - public $userId = 'ryan.mathis@at.internet2.edu'; public function index() { return $this->redirect( @@ -20,7 +19,7 @@ public function index() { public function groupUser() { - $this->set('title', 'Grouper Groups:'); + $this->set('title', _txt('pl.grouperlite.title.root')); //TODO - Change to get userid somehow $this->set('groupergroupsmember', $this->GrouperGroup->optinGroups($this->userId)); } @@ -31,16 +30,17 @@ public function groupInfo() $details = $this->GrouperGroup->groupDescriptions($name); $this->set('groupname', $name); - $this->set('title', 'Group configuration and attributes'); + $this->set('title', _txt('pl.grouperlite.title.groupinfo')); $this->set('groupergroupsdetail', $details[0]); } public function groupOwner() { - $this->set('title', 'Grouper Groups I Manage:'); + $this->set('title', _txt('pl.grouperlite.title.groupowner')); if (isset($this->request->data['search'])){ $searchCriteria = urldecode($this->request->data['search']); $this->set('groupergroupsowner', $this->GrouperGroup->getSearchedGroups($this->userId, $searchCriteria, 'groupOwner')); + $this->set('searchcriteria', $searchCriteria); } else { $this->set('groupergroupsowner', $this->GrouperGroup->ownerGroups($this->userId)); } @@ -49,7 +49,7 @@ public function groupOwner() public function groupOptin() { - $this->set('title', 'Grouper Groups I Can Join:'); + $this->set('title', _txt('pl.grouperlite.title.groupoptin')); if (isset($this->request->data['search'])){ $searchCriteria = urldecode($this->request->data['search']); @@ -62,7 +62,7 @@ public function groupOptin() public function emailListsOptin() { - $this->set('title', 'Email lists'); + $this->set('title', _txt('pl.grouperlite.title.emaillists')); // mock data $this->set('group', array( 'member' => true, @@ -74,7 +74,7 @@ public function emailListsOptin() public function emailListsManaged() { - $this->set('title', 'Email lists I manage'); + $this->set('title', _txt('pl.grouperlite.title.emaillistsmanaged')); // mock data $this->set('group', array( 'member' => true, @@ -86,7 +86,7 @@ public function emailListsManaged() public function emailListInfo() { - $this->set('title', 'Email list configuration and attributes'); + $this->set('title', _txt('pl.grouperlite.title.emaillistsinfo')); // mock data $this->set('groupergroupsdetail', array( 'member' => true, @@ -103,7 +103,7 @@ public function emailListInfo() } public function groupCreateForm() { - $this->set('title', 'Create Grouper Group'); + $this->set('title', _txt('pl.grouperlite.title.groupcreate')); } public function groupCreate() @@ -120,13 +120,13 @@ public function joinGroup() if ($this->request->is('post')) { $name = $this->request->data['GroupName']; if($this->GrouperGroup->joinGroup($this->userId, $name)) { - $this->Flash->success(__('You have been added to the group!')); + $this->Flash->success(_txt('You have been added to the group!')); } else { - $this->Flash->error(__('You are unable to join the group!')); + $this->Flash->error(_txt('You are unable to join the group!')); } return $this->redirect(array('action' => 'groupoptin')); } - $this->Flash->error(__('An error occurred in joining the group, please try again later.')); + $this->Flash->error(_txt('An error occurred in joining the group, please try again later.')); } @@ -135,13 +135,13 @@ public function leaveGroup() if ($this->request->is('post')) { $name = $this->request->data['GroupName']; if($this->GrouperGroup->leaveGroup($this->userId, $name)) { - $this->Flash->success(__('You have been deleted from the group!')); + $this->Flash->success(_txt('You have been deleted from the group!')); } else { - $this->Flash->error(__('You are unable to delete the group!')); + $this->Flash->error(_txt('You are unable to delete the group!')); } return $this->redirect(array('action' => 'groupoptin')); } - $this->Flash->error(__('An error occurred in leaving the group, please try again later.')); + $this->Flash->error(_txt('An error occurred in leaving the group, please try again later.')); } /** diff --git a/Lib/GrouperApiAccess.php b/Lib/GrouperApiAccess.php index c83e57f..dcd7556 100644 --- a/Lib/GrouperApiAccess.php +++ b/Lib/GrouperApiAccess.php @@ -158,33 +158,6 @@ public function getGrouperGroups($queryData) return array(); } - public function searchGrouperGroups($queryData) { - - $subjectID = $queryData['conditions']['userId']; - $search = $queryData['conditions']['search']; - - $groupsFiltered = array( - "WsRestFindGroupsRequest" => array( - "actAsSubjectLookup" => array("subjectId" => $subjectID), - "wsQueryFilter" => array( - "queryFilterType" => "FIND_BY_GROUP_NAME_APPROXIMATE", - "groupName" => $search - ) - ) - ); - - $this->http->setHeader(array('Content-Type' => 'application/json', 'Accept' => 'application/json')); - - $connectionUrl = "{$this->config['fullUrl']}/groups"; - - $results = $this->http->sendRequest('POST', $connectionUrl, json_encode($groupsFiltered)); - - if (isset($results['WsFindGroupsResults']['groupResults']) && $results['WsFindGroupsResults']['groupResults'] != NULL) { - return $results['WsFindGroupsResults']['groupResults']; - } - - return array(); - } public function getGrouperGroupDescription($queryData) { @@ -287,7 +260,7 @@ public function getGroupAttributes($queryData) { "includeAssignmentsOnAssignments" => "T", "wsOwnerGroupLookups" => array( array( - "groupName" => $groupName + "groupName" => $groupName, ) ) ) @@ -298,8 +271,8 @@ public function getGroupAttributes($queryData) { $results = $this->http->sendRequest('POST', $connectionUrl, json_encode($stemToFind)); - if (isset($results['WsGetAttributeAssignmentsResults']['wsAttributeDefNames']) && $results['WsGetAttributeAssignmentsResults']['wsAttributeDefNames'] != NULL) { - return $results['WsGetAttributeAssignmentsResults']['wsAttributeDefNames']; + if (isset($results['WsGetAttributeAssignmentsResults']['wsAttributeAssigns']) && $results['WsGetAttributeAssignmentsResults']['wsAttributeAssigns'] != NULL) { + return $results['WsGetAttributeAssignmentsResults']['wsAttributeAssigns']; } return array(); } diff --git a/Lib/lang.php b/Lib/lang.php new file mode 100644 index 0000000..4f3f031 --- /dev/null +++ b/Lib/lang.php @@ -0,0 +1,73 @@ + 'Grouper Configuration Settings', + 'pl.grouperlite.config.edit.title' => 'Edit Grouper Configuration Settings', + 'pl.grouperlite.config.grouper-url' => 'Grouper URL', + 'pl.grouperlite.config.grouper-version' => 'Grouper Version', + 'pl.grouperlite.config.grouper-un' => 'Username', + 'pl.grouperlite.config.grouper-pw' => 'Password', + + 'pl.grouperlite.crumb.root' => 'Grouper groups', + 'pl.grouperlite.nav.groups' => 'Groups', + 'pl.grouperlite.nav.groups-presided' => 'Groups I preside over', + 'pl.grouperlite.nav.email-lists' => 'Email lists', + 'pl.grouperlite.nav.email-lists-managed' => 'Email lists I manage', + 'pl.grouperlite.nav.create-group' => 'Create group', + + 'pl.grouperlite.title.root' => 'Grouper Groups:', + 'pl.grouperlite.title.groupinfo' => 'Group configuration and attributes', + 'pl.grouperlite.title.groupowner' => 'Grouper Groups I Manage', + 'pl.grouperlite.title.groupoptin' => 'Grouper Groups I Can Join', + 'pl.grouperlite.title.emaillists' => 'Email lists', + 'pl.grouperlite.title.emaillistsmanaged' => 'Email lists I manage', + 'pl.grouperlite.title.emaillistsinfo' => 'Email list configuration and attributes', + 'pl.grouperlite.title.groupcreate' => 'Create Grouper Group', + + 'pl.grouperlite.message.flash.join-group-success' => 'You have been added to the group!', + 'pl.grouperlite.message.flash.join-group-failed' => 'You are unable to join the group!', + 'pl.grouperlite.message.flash.join-group-error' => 'An error occurred in joining the group, please try again later.', + + 'pl.grouperlite.message.flash.leave-group-success' => 'You have been deleted from the group!', + 'pl.grouperlite.message.flash.leave-group-failed' => 'You are unable to delete the group!', + 'pl.grouperlite.message.flash.leave-group-error' => 'An error occurred in leaving the group, please try again later.', + + 'pl.grouperlite.table.name' => 'Name', + 'pl.grouperlite.table.description' => 'Description', + 'pl.grouperlite.table.status' => 'Status', + 'pl.grouperlite.table.action' => 'Action', + + 'pl.grouperlite.value.descr.zerostate' => 'No Description', + 'pl.grouperlite.value.enabled' => 'Enabled', + 'pl.grouperlite.value.disabled' => 'Disabled', + + 'pl.grouperlite.action.join-group' => 'Join group', + 'pl.grouperlite.action.leave-group' => 'Leave group', + 'pl.grouperlite.action.edit-group' => 'Edit', + 'pl.grouperlite.action.disable-group' => 'Disable', + 'pl.grouperlite.action.subscribe' => 'Subscribe', + 'pl.grouperlite.action.unsubscribe' => 'Unsubscribe', + 'pl.grouperlite.action.search' => 'Search', + 'pl.grouperlite.action.remove' => 'Remove', + + 'pl.grouperlite.form.group.template.label' => 'Select a template', + 'pl.grouperlite.form.group.template.empty' => '(choose one)', + 'pl.grouperlite.form.group.name.label' => 'Display name', + 'pl.grouperlite.form.group.name.help' => 'Name is the label that identifies this group, and might change.', + 'pl.grouperlite.form.group.stem.label' => 'Create in this folder:', + 'pl.grouperlite.form.group.stem.help' => 'Enter a folder name.', + 'pl.grouperlite.form.group.description.label' => 'Description:', + 'pl.grouperlite.form.group.description.help' => 'Description contains notes about the group, which could include: what the group represents, why it was created, etc.', + 'pl.grouperlite.form.group.privs.label' => 'Privileges', + 'pl.grouperlite.form.group.privs.label.READ' => 'READ', + 'pl.grouperlite.form.group.privs.label.VIEW' => 'VIEW', + 'pl.grouperlite.form.group.privs.label.OPTIN' => 'OPTIN', + 'pl.grouperlite.form.group.privs.label.OPTOUT' => 'OPTOUT', + 'pl.grouperlite.form.group.privs.label.ATTRIBUTE_READ' => 'ATTRIBUTE READ', + 'pl.grouperlite.form.group.subs.label' => 'Subscribers:', + 'pl.grouperlite.form.group.subs.help' => 'Select subscribers to add to the group.', + 'pl.grouperlite.form.group.subs.placeholder' => 'Search subscribers', + 'pl.grouperlite.form.group.action.save' => 'Save Group', + + 'pl.grouperlite.search.tags.text' => 'Search', +); \ No newline at end of file diff --git a/Model/CoGrouperLite.php b/Model/CoGrouperLite.php index 918bb7f..62e2796 100644 --- a/Model/CoGrouperLite.php +++ b/Model/CoGrouperLite.php @@ -6,6 +6,51 @@ class CoGrouperLite extends CoDashboardWidgetBackend { // Define class name for cake public $name = "CoGrouperLite"; + // Association rules from this model to other models + public $belongsTo = array( + "CoDashboardWidget" + ); + // Add behaviors + public $actsAs = array('Containable'); + + public $hasMany = array( + ); + + public $duplicatableModels = array( + "CoGrouperLite" => array( + "parent" => "CoDashboardWidget", + "fk" => "co_dashboard_widget_id" + ) + ); + + // Validation rules for table elements + public $validate = array( + 'co_dashboard_widget_id' => array( + 'rule' => 'numeric', + 'required' => true, + 'allowEmpty' => false + )/*, + 'connUrl' => array( + 'rule' => 'alphaNumeric', + 'required' => true, + 'allowEmpty' => false + ), + 'connVer' => array( + 'rule' => 'alphaNumeric', + 'required' => true, + 'allowEmpty' => false + ), + 'connUser' => array( + 'rule' => 'alphaNumeric', + 'required' => true, + 'allowEmpty' => false + ), + 'connPass' => array( + 'rule' => 'alphaNumeric', + 'required' => true, + 'allowEmpty' => false + ),*/ + ); } \ No newline at end of file diff --git a/Model/GrouperGroup.php b/Model/GrouperGroup.php index 322899b..a69451a 100644 --- a/Model/GrouperGroup.php +++ b/Model/GrouperGroup.php @@ -32,10 +32,18 @@ class GrouperGroup extends GrouperLiteAppModel ), ); + /** + * @var string + */ + //TODO - get name of Friendly name attribute that can be used for pulling the friendly name + private $friendly = 'sandbox:testAttributeName'; + + public function __construct() { parent::__construct(); $this->grouperAPI = new GrouperApiAccess(); + } public function userGroups($userId) @@ -88,7 +96,24 @@ public function ownerGroups($userId) $args['conditions']['groupType'] = 'Owner'; $args['conditions']['userId'] = $userId; - return $this->grouperAPI->getGrouperGroups($args); + $ownGroups = $this->grouperAPI->getGrouperGroups($args); + + //Now for each group need to pull in friendly name attribute. + foreach ($ownGroups as &$ownGroup) { + $ownGroup['friendlyName'] = $ownGroup['displayName']; + $attributes = $this->grouperAPI->getGroupAttributes(array('conditions' => array('groupName' => $ownGroup['displayName']))); + foreach ($attributes as $attribute) { + if ($attribute['attributeDefNameName'] == $this->friendly) { + if (isset($attribute['wsAttributeAssignValues'][0]['valueSystem'])) { + $ownGroup['friendlyName'] = $attribute['wsAttributeAssignValues'][0]['valueSystem']; + } + break; + } + } + } + + return $ownGroups; + } public function optinGroups($userId) @@ -97,10 +122,11 @@ public function optinGroups($userId) $args['conditions']['groupType'] = 'Optins'; $args['conditions']['userId'] = $userId; - $returnsToJoinOrLeave = $this->grouperAPI->getGrouperGroups($args); + $joinOrLeave = $this->grouperAPI->getGrouperGroups($args); $userGroups = $this->userGroups($userId); - foreach ($returnsToJoinOrLeave as &$groupsJoL) { + //See if Optin group match any of the groups belong to already. + foreach ($joinOrLeave as &$groupsJoL) { foreach ($userGroups as $userGroup) { $groupsJoL['member'] = false; if ($groupsJoL['name'] == $userGroup['name']) { @@ -111,7 +137,21 @@ public function optinGroups($userId) } } - return $returnsToJoinOrLeave; + //Now for each group need to pull in friendly name attribute. + foreach ($joinOrLeave as &$jol) { + $jol['friendlyName'] = $jol['displayName']; + $attributes = $this->grouperAPI->getGroupAttributes(array('conditions' => array('groupName' => $jol['displayName']))); + foreach ($attributes as $attribute) { + if ($attribute['attributeDefNameName'] == $this->friendly) { + if (isset($attribute['wsAttributeAssignValues']['valueSystem'])) { + $jol['friendlyName'] = $attribute['wsAttributeAssignValues']['valueSystem']; + } + break; + } + } + } + + return $joinOrLeave; } public function createGroup($userId, $groupName, $stemName, $groupDesc) @@ -134,12 +174,21 @@ public function getStemGroup($userId, $stemName) { return $this->grouperAPI->getStemGroups($args); } + /** + * Search for Groups/Lists related to Search term. + * Will import all records the user can see and then do search here rather than call Grouper WS Search + * 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 $userId + * @param $searchCriteria + * @param $page + * @return array + */ public function getSearchedGroups($userId, $searchCriteria, $page) { $args = array(); $args['conditions']['userId'] = $userId; - $args['conditions']['search'] = $searchCriteria; - $searchResults = $this->grouperAPI->searchGrouperGroups($args); if($page == 'groupOptin') { $pageResults = $this->optinGroups($userId); } elseif ($page == 'groupOwner') { @@ -150,12 +199,10 @@ public function getSearchedGroups($userId, $searchCriteria, $page) { $returnResults = array(); - foreach ($pageResults as $pageGroup) { - foreach ($searchResults as $searchGroup) { - if ($pageGroup['uuid'] == $searchGroup['uuid']) { - $returnResults[] = $pageGroup; - break; - } + foreach($pageResults as $result) { + $match = preg_grep("/$searchCriteria/i", $result); + if (!empty($match)) { + $returnResults[] = $result; } } diff --git a/Model/GrouperLite.php b/Model/GrouperLite.php index 9892b1c..ef785ea 100644 --- a/Model/GrouperLite.php +++ b/Model/GrouperLite.php @@ -8,5 +8,27 @@ class GrouperLite extends AppModel { // Required by COmanage Plugins public $cmPluginType = "dashboardwidget"; + // Association rules from this model to other models + public $belongsTo = array( + ); + + public $hasMany = array( + ); + + // Validation rules for table elements + public $validate = array( + ); + + public function cmPluginMenus() { + return array( + "cogroups" => array( + 'Grouper groups' => array( + 'controller' => "groupergroups", + 'action' => "groupoptin" + ) + ) + ); + } + } \ No newline at end of file diff --git a/View/CoGrouperLites/display.ctp b/View/CoGrouperLites/display.ctp new file mode 100644 index 0000000..4a1090b --- /dev/null +++ b/View/CoGrouperLites/display.ctp @@ -0,0 +1 @@ +you are home \ No newline at end of file diff --git a/View/CoGrouperLites/edit.ctp b/View/CoGrouperLites/edit.ctp new file mode 100644 index 0000000..414142a --- /dev/null +++ b/View/CoGrouperLites/edit.ctp @@ -0,0 +1,71 @@ +name; + $req = Inflector::singularize($model); + + // Add page title & page buttons + $params = array(); + $params['title'] = $title_for_layout; + + // For Authenticators during enrollment + if(!empty($vv_co_enrollment_authenticator) + && ($vv_co_enrollment_authenticator['CoEnrollmentAuthenticator']['required'] == RequiredEnum::Optional) + && !empty($this->request->params['named']['onFinish'])) { + $params['topLinks'][] = $this->Html->link(_txt('op.skip'), + urldecode($this->request->params['named']['onFinish']), + array('class' => 'forwardbutton')); + } + + if(!empty($this->plugin)) { + if(file_exists(APP . "Plugin/" . $this->plugin . "/View/" . $model . "/buttons.inc")) { + include(APP . "Plugin/" . $this->plugin . "/View/" . $model . "/buttons.inc"); + } elseif(file_exists(LOCAL . "Plugin/" . $this->plugin . "/View/" . $model . "/buttons.inc")) { + include(LOCAL . "Plugin/" . $this->plugin . "/View/" . $model . "/buttons.inc"); + } + } else { + if(file_exists(APP . "View/" . $model . "/buttons.inc")) { + include(APP . "View/" . $model . "/buttons.inc"); + } + } + print $this->element("pageTitleAndButtons", $params); + + $submit_label = _txt('op.save'); + print $this->Form->create($req, array('inputDefaults' => array('label' => false, 'div' => false))); + if(!empty($this->plugin)) { + if(file_exists(APP . "Plugin/" . $this->plugin . "/View/" . $model . "/fields.inc")) { + include(APP . "Plugin/" . $this->plugin . "/View/" . $model . "/fields.inc"); + } elseif(file_exists(LOCAL . "Plugin/" . $this->plugin . "/View/" . $model . "/fields.inc")) { + include(LOCAL . "Plugin/" . $this->plugin . "/View/" . $model . "/fields.inc"); + } + } else { + include(APP . "View/" . $model . "/fields.inc"); + } + print $this->Form->end(); +?> diff --git a/View/CoGrouperLites/fields.inc b/View/CoGrouperLites/fields.inc new file mode 100644 index 0000000..334da52 --- /dev/null +++ b/View/CoGrouperLites/fields.inc @@ -0,0 +1,209 @@ + +action === "add" && $permissions['add']); +$editable = ($this->action === "edit" && $permissions['edit']); + +$e = (!$addable && !$editable) ? false : true; + +// We shouldn't get here if we don't have at least read permission, but check just in case + +if (!$e && !$permissions['view']) { + return false; +} + +// Add breadcrumbs +print $this->element("coCrumb"); + +$args = array(); +$args['plugin'] = null; +$args['controller'] = 'co_dashboards'; +$args['action'] = 'index'; +$args['co'] = $cur_co['Co']['id']; +$this->Html->addCrumb(_txt('ct.co_dashboards.pl'), $args); + +$args = array(); +$args['plugin'] = null; +$args['controller'] = 'co_dashboards'; +$args['action'] = 'edit'; +$args[] = $co_grouper_lites[0]['CoDashboardWidget']['co_dashboard_id']; +$this->Html->addCrumb(_txt('ct.co_dashboards.1'), $args); + +$args = array(); +$args['plugin'] = null; +$args['controller'] = 'co_dashboard_widgets'; +$args['action'] = 'index'; +$args['codashboard'] = $co_grouper_lites[0]['CoDashboardWidget']['co_dashboard_id']; +$this->Html->addCrumb(_txt('ct.co_dashboard_widgets.1'), $args); + +$crumbTxt = _txt('op.' . $this->action . '-a', array(filter_var($co_grouper_widgets[0]['CoDashboardWidget']['description'], FILTER_SANITIZE_SPECIAL_CHARS))); +$this->Html->addCrumb($crumbTxt); + +print $this->Form->hidden('co_dashboard_widget_id', array('default' => $vv_dwid)) . "\n"; + +?> + + +
+
+

+
+
\ No newline at end of file diff --git a/View/Elements/Components/navigation.ctp b/View/Elements/Components/navigation.ctp index fc5c06c..8ec8cd1 100644 --- a/View/Elements/Components/navigation.ctp +++ b/View/Elements/Components/navigation.ctp @@ -1,14 +1,9 @@ - \ No newline at end of file diff --git a/View/Elements/Components/optAction.ctp b/View/Elements/Components/optAction.ctp index 723e54d..b80be2e 100644 --- a/View/Elements/Components/optAction.ctp +++ b/View/Elements/Components/optAction.ctp @@ -1,16 +1,9 @@ -
- - Form->hidden('token', array('default' => $vv_petition_token)) . "\n"; - } - ?> +Form->create(false, array( + 'url' => array('controller' => 'groupergroups', 'action' => $action) +)); ?> +Form->hidden('GroupName', array('default' => $group)); ?> -
\ No newline at end of file +Form->end(); ?> \ No newline at end of file diff --git a/View/Elements/Components/search.ctp b/View/Elements/Components/search.ctp index 4be109f..3baffe6 100644 --- a/View/Elements/Components/search.ctp +++ b/View/Elements/Components/search.ctp @@ -1,5 +1,5 @@ - -