Manager.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. namespace AdminAddonUserManager\Groups;
  3. use Grav\Common\Grav;
  4. use Grav\Plugin\AdminAddonUserManagerPlugin;
  5. use Grav\Common\Assets;
  6. use RocketTheme\Toolbox\Event\Event;
  7. use AdminAddonUserManager\Manager as IManager;
  8. use AdminAddonUserManager\Pagination\ArrayPagination;
  9. use \Grav\Common\Utils;
  10. use AdminAddonUserManager\Group;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use \Grav\Common\User\User;
  13. use \AdminAddonUserManager\Users\Manager as UsersManager;
  14. use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
  15. use Symfony\Component\ExpressionLanguage\ExpressionFunction;
  16. class Manager implements IManager, EventSubscriberInterface {
  17. private $grav;
  18. private $plugin;
  19. private $adminController;
  20. public function __construct(Grav $grav, AdminAddonUserManagerPlugin $plugin) {
  21. $this->grav = $grav;
  22. $this->plugin = $plugin;
  23. $this->grav['events']->addSubscriber($this);
  24. }
  25. public static function getSubscribedEvents() {
  26. return [
  27. 'onAdminControllerInit' => ['onAdminControllerInit', 0],
  28. 'onAdminData' => ['onAdminData', 0]
  29. ];
  30. }
  31. public function onAdminControllerInit($e) {
  32. $controller = $e['controller'];
  33. $this->adminController = $controller;
  34. }
  35. public function onAdminData($e) {
  36. $type = $e['type'];
  37. if (preg_match('|group-manager|', $type) && ($group = $this->grav['uri']->param('name', false))) {
  38. $obj = Group::load($group);
  39. $post = $this->adminController->data;
  40. if (isset($post['users'])) {
  41. $usersInGroup = $post['users'];
  42. unset($post['users']);
  43. } else {
  44. $usersInGroup = [];
  45. }
  46. $obj->merge($post);
  47. $e['data_type'] = $obj;
  48. foreach (UsersManager::$instance->users() as $u) {
  49. $groups = $u->get('groups', []);
  50. if (in_array($u['username'], $usersInGroup)) {
  51. if (!in_array($obj['groupname'], $groups)) {
  52. $u['groups'] = array_merge($groups, [$obj['groupname']]);
  53. $u->save();
  54. }
  55. } else {
  56. if (in_array($obj['groupname'], $groups)) {
  57. $u['groups'] = array_diff($groups, [$obj['groupname']]);
  58. if (empty($u['groups'])) {
  59. unset($u['groups']);
  60. }
  61. $u->save();
  62. }
  63. }
  64. }
  65. }
  66. }
  67. /**
  68. * Returns the required permission to access the manager
  69. *
  70. * @return string
  71. */
  72. public function getRequiredPermission() {
  73. return $this->plugin->name . '.groups';
  74. }
  75. /**
  76. * Returns the location of the manager
  77. * It will be accessible at this path
  78. *
  79. * @return string
  80. */
  81. public function getLocation() {
  82. return 'group-manager';
  83. }
  84. /**
  85. * Returns the plugin hooked nav array
  86. *
  87. * @return array
  88. */
  89. public function getNav() {
  90. return [
  91. 'label' => 'PLUGIN_ADMIN_ADDON_USER_MANAGER.GROUP_MANAGER',
  92. 'location' => $this->getLocation(),
  93. 'icon' => 'fa-group',
  94. 'authorize' => $this->getRequiredPermission(),
  95. 'badge' => [
  96. 'count' => count($this->groups())
  97. ]
  98. ];
  99. }
  100. /**
  101. * Initialiaze required assets
  102. *
  103. * @param \Grav\Common\Assets $assets
  104. * @return void
  105. */
  106. public function initializeAssets(Assets $assets) {
  107. $this->grav['assets']->addCss('plugin://' . $this->plugin->name . '/assets/groups/style.css');
  108. }
  109. /**
  110. * Handle task requests
  111. *
  112. * @param \RocketTheme\Toolbox\Event\Event $event
  113. * @return boolean
  114. */
  115. public function handleTask(Event $event) {
  116. $method = $event['method'];
  117. if ($method === 'taskGroupDelete' && ($group = $this->grav['uri']->param('name', false))) {
  118. Group::remove($group);
  119. $this->grav->redirect($this->grav['uri']->url($this->getLocation()));
  120. return true;
  121. }
  122. return false;
  123. }
  124. /**
  125. * Logic of the manager goes here
  126. *
  127. * @return array The array to be merged to Twig vars
  128. */
  129. public function handleRequest() {
  130. $vars = [];
  131. $twig = $this->grav['twig'];
  132. $uri = $this->grav['uri'];
  133. // Bulk actions
  134. if (isset($_POST['selected'])) {
  135. $groupnames = $_POST['selected'];
  136. if (isset($_POST['bulk_delete'])) {
  137. // Bulk delete groups
  138. foreach ($groupnames as $groupname) {
  139. Group::remove($groupname);
  140. }
  141. $this->grav->redirect($this->plugin->getPreviousUrl());
  142. }
  143. }
  144. $group = $this->grav['uri']->param('name', false);
  145. if ($group) {
  146. $vars['exists'] = Group::groupExists($group);
  147. $vars['group'] = $group = Group::load($group);
  148. $users = [];
  149. foreach (UsersManager::$instance->users() as $u) {
  150. if (in_array($group['groupname'], $u->get('groups', []))) {
  151. $users[] = $u->username;
  152. }
  153. }
  154. $group['users'] = $users;
  155. } else {
  156. $vars['fields'] = $this->plugin->getModalsConfiguration()['add_group']['fields'];
  157. $vars['bulkFields'] = $this->plugin->getModalsConfiguration()['bulk_group']['fields'];
  158. $groups = $this->groups();
  159. foreach ($groups as &$group) {
  160. $group['users'] = 0;
  161. foreach (UsersManager::$instance->users() as $u) {
  162. if (in_array($group['groupname'], $u->get('groups', []))) {
  163. $group['users'] += 1;
  164. }
  165. }
  166. }
  167. // Filtering
  168. $filterException = false;
  169. $filter = (empty($_GET['filter'])) ? '' : $_GET['filter'];
  170. $vars['filter'] = $filter;
  171. if ($filter) {
  172. try {
  173. $language = new ExpressionLanguage();
  174. $language->addFunction(ExpressionFunction::fromPhp('count'));
  175. foreach ($groups as $k => $group) {
  176. if (!$language->evaluate($_GET['filter'], ['group' => $group])) {
  177. unset($groups[$k]);
  178. }
  179. }
  180. } catch (\Exception $exception) {
  181. $vars['filterException'] = $exception;
  182. $filterException = true;
  183. }
  184. }
  185. if ($filterException) {
  186. $groups = [];
  187. }
  188. // Pagination
  189. $perPage = $this->plugin->getPluginConfigValue('pagination.per_page', 10);
  190. $pagination = new ArrayPagination($groups, $perPage);
  191. $pagination->paginate($uri->param('page'));
  192. $vars['pagination'] = [
  193. 'current' => $pagination->getCurrentPage(),
  194. 'count' => $pagination->getPagesCount(),
  195. 'total' => $pagination->getRowsCount(),
  196. 'perPage' => $pagination->getRowsPerPage(),
  197. 'startOffset' => $pagination->getStartOffset(),
  198. 'endOffset' => $pagination->getEndOffset()
  199. ];
  200. $groups = $pagination->getPaginatedRows();
  201. $vars['groups'] = $groups;
  202. }
  203. return $vars;
  204. }
  205. public function groups() {
  206. return Group::groups();
  207. }
  208. }