Groups.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879
  1. <?php
  2. /**
  3. * This file is part of the ForkBB <https://github.com/forkbb>.
  4. *
  5. * @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
  6. * @license The MIT License (MIT)
  7. */
  8. declare(strict_types=1);
  9. namespace ForkBB\Models\Pages\Admin;
  10. use ForkBB\Core\Container;
  11. use ForkBB\Models\Page;
  12. use ForkBB\Models\Group\Group;
  13. use ForkBB\Models\Pages\Admin;
  14. use function \ForkBB\__;
  15. class Groups extends Admin
  16. {
  17. public function __construct(Container $container)
  18. {
  19. parent::__construct($container);
  20. $this->c->Lang->load('validator');
  21. $this->c->Lang->load('admin_groups');
  22. $this->c->Lang->load('profile');
  23. $groupsList = [];
  24. $groupsNew = [];
  25. $groupsDefault = [];
  26. $notForNew = [FORK_GROUP_ADMIN];
  27. $notForDefault = [FORK_GROUP_ADMIN, FORK_GROUP_MOD, FORK_GROUP_GUEST];
  28. foreach ($this->c->groups->getList() as $key => $group) {
  29. $groupsList[$key] = [$group->g_title, $group->linkEdit, $group->linkDelete];
  30. if (! \in_array($group->g_id, $notForNew, true)) {
  31. $groupsNew[$key] = $group->g_title;
  32. }
  33. if (
  34. ! \in_array($group->g_id, $notForDefault, true)
  35. && 0 === $group->g_moderator
  36. ) {
  37. $groupsDefault[$key] = $group->g_title;
  38. }
  39. }
  40. $this->aIndex = 'groups';
  41. $this->groupsList = $groupsList;
  42. $this->groupsNew = $groupsNew;
  43. $this->groupsDefault = $groupsDefault;
  44. }
  45. /**
  46. * Подготавливает данные для шаблона
  47. */
  48. public function view(): Page
  49. {
  50. $this->nameTpl = 'admin/groups';
  51. $this->formNew = $this->formNew();
  52. $this->formDefault = $this->formDefault();
  53. return $this;
  54. }
  55. /**
  56. * Подготавливает массив данных для формы
  57. */
  58. protected function formNew(): array
  59. {
  60. return [
  61. 'action' => $this->c->Router->link('AdminGroupsNew'),
  62. 'hidden' => [
  63. 'token' => $this->c->Csrf->create('AdminGroupsNew'),
  64. ],
  65. 'sets' => [
  66. 'base' => [
  67. 'legend' => 'Add group subhead',
  68. 'fields' => [
  69. 'basegroup' => [
  70. 'type' => 'select',
  71. 'options' => $this->groupsNew,
  72. 'value' => $this->c->config->i_default_user_group,
  73. 'caption' => 'New group label',
  74. 'help' => 'New group help',
  75. # 'autofocus' => true,
  76. ],
  77. ],
  78. ],
  79. ],
  80. 'btns' => [
  81. 'submit' => [
  82. 'type' => 'submit',
  83. 'value' => __('Add'),
  84. ],
  85. ],
  86. ];
  87. }
  88. /**
  89. * Подготавливает массив данных для формы
  90. */
  91. protected function formDefault(): array
  92. {
  93. return [
  94. 'action' => $this->c->Router->link('AdminGroupsDefault'),
  95. 'hidden' => [
  96. 'token' => $this->c->Csrf->create('AdminGroupsDefault'),
  97. ],
  98. 'sets' => [
  99. 'del' => [
  100. 'legend' => 'Default group subhead',
  101. 'fields' => [
  102. 'defaultgroup' => [
  103. 'type' => 'select',
  104. 'options' => $this->groupsDefault,
  105. 'value' => $this->c->config->i_default_user_group,
  106. 'caption' => 'Default group label',
  107. 'help' => 'Default group help',
  108. ],
  109. ],
  110. ],
  111. ],
  112. 'btns' => [
  113. 'submit' => [
  114. 'type' => 'submit',
  115. 'value' => __('Update'),
  116. ],
  117. ],
  118. ];
  119. }
  120. /**
  121. * Устанавливает группу по умолчанию
  122. */
  123. public function defaultSet(): Page
  124. {
  125. $v = $this->c->Validator->reset()
  126. ->addRules([
  127. 'token' => 'token:AdminGroupsDefault',
  128. 'defaultgroup' => 'required|integer|in:' . \implode(',', \array_keys($this->groupsDefault)),
  129. ])->addAliases([
  130. ])->addMessages([
  131. 'defaultgroup.in' => 'Invalid default group',
  132. ]);
  133. if (! $v->validation($_POST)) {
  134. $this->fIswev = $v->getErrors();
  135. return $this->view();
  136. }
  137. $this->c->config->i_default_user_group = $v->defaultgroup;
  138. $this->c->config->save();
  139. return $this->c->Redirect->page('AdminGroups')->message('Default group redirect');
  140. }
  141. /**
  142. * Редактирование группы
  143. * Создание новой группы
  144. */
  145. public function edit(array $args, string $method): Page
  146. {
  147. // начало создания новой группы
  148. if (
  149. empty($args['id'])
  150. && empty($args['base'])
  151. ) {
  152. $v = $this->c->Validator->reset()
  153. ->addRules([
  154. 'token' => 'token:AdminGroupsNew',
  155. 'basegroup' => 'required|integer|in:' . \implode(',', \array_keys($this->groupsNew)),
  156. ])->addAliases([
  157. ])->addMessages([
  158. 'basegroup.in' => 'Invalid group to create on base',
  159. ]);
  160. if (! $v->validation($_POST)) {
  161. $this->fIswev = $v->getErrors();
  162. return $this->view();
  163. }
  164. $gid = $v->basegroup;
  165. $next = false;
  166. // продолжение редактирования/создания
  167. } else {
  168. $gid = $args['id'] ?? $args['base'];
  169. $next = true;
  170. }
  171. $baseGroup = $this->c->groups->get($gid);
  172. if (! $baseGroup instanceof Group) {
  173. return $this->c->Message->message('Bad request');
  174. }
  175. $group = clone $baseGroup;
  176. $notNext = FORK_GROUP_ADMIN . ',' . FORK_GROUP_GUEST;
  177. if (isset($args['id'])) {
  178. $marker = 'AdminGroupsEdit';
  179. $vars = ['id' => $group->g_id];
  180. $notNext .= ',' . $group->g_id;
  181. $this->aCrumbs[] = [$this->c->Router->link($marker, $vars), 'Edit group'];
  182. $this->aCrumbs[] = [null, ['"%s"', $group->g_title]];
  183. $this->titleForm = 'Edit group';
  184. $this->classForm = ['editgroup'];
  185. } else {
  186. $marker = 'AdminGroupsNew';
  187. $vars = ['base' => $group->g_id];
  188. $group->g_title = '';
  189. $group->g_id = null;
  190. $this->aCrumbs[] = 'Create new group';
  191. $this->titleForm = 'Create new group';
  192. $this->classForm = ['creategroup'];
  193. }
  194. if (
  195. 'POST' === $method
  196. && $next
  197. ) {
  198. $reserve = [];
  199. foreach ($this->groupsList as $key => $cur) {
  200. if ($group->g_id !== $key) {
  201. $reserve[] = $cur[0];
  202. }
  203. }
  204. $v = $this->c->Validator->reset()
  205. ->addRules([
  206. 'token' => 'token:' . $marker,
  207. 'g_title' => 'required|string:trim|max:50|not_in:' . \implode(',', $reserve),
  208. 'g_user_title' => 'exist|string:trim|max:50',
  209. ])->addAliases([
  210. ])->addArguments([
  211. 'token' => $vars,
  212. ])->addMessages([
  213. 'g_title.required' => 'You must enter a group title',
  214. 'g_title.not_in' => 'Title already exists',
  215. ]);
  216. if (! $group->groupAdmin) {
  217. $v->addRules([
  218. 'g_read_board' => 'required|integer|in:0,1',
  219. 'g_view_users' => 'required|integer|in:0,1',
  220. 'g_post_replies' => 'required|integer|in:0,1',
  221. 'g_post_topics' => 'required|integer|in:0,1',
  222. 'g_post_links' => 'required|integer|in:0,1',
  223. 'g_search' => 'required|integer|in:0,1',
  224. 'g_search_users' => 'required|integer|in:0,1',
  225. 'g_post_flood' => 'required|integer|min:0|max:32767',
  226. 'g_search_flood' => 'required|integer|min:0|max:32767',
  227. ]);
  228. if (
  229. ! $group->groupGuest
  230. && ! $group->groupMember
  231. && $group->g_id !== $this->c->config->i_default_user_group
  232. ) {
  233. $v->addRules([
  234. 'g_moderator' => 'required|integer|in:0,1',
  235. 'g_mod_edit_users' => 'required|integer|in:0,1',
  236. 'g_mod_rename_users' => 'required|integer|in:0,1',
  237. 'g_mod_change_passwords' => 'required|integer|in:0,1',
  238. 'g_mod_promote_users' => 'required|integer|in:0,1',
  239. 'g_mod_ban_users' => 'required|integer|in:0,1',
  240. ]);
  241. }
  242. if ($group->groupGuest) {
  243. $v->addRules([
  244. 'a_guest_set.show_smilies' => 'required|integer|in:0,1',
  245. 'a_guest_set.show_sig' => 'required|integer|in:0,1',
  246. 'a_guest_set.show_avatars' => 'required|integer|in:0,1',
  247. 'a_guest_set.show_img' => 'required|integer|in:0,1',
  248. 'a_guest_set.show_img_sig' => 'required|integer|in:0,1',
  249. ]);
  250. } else {
  251. $v->addRules([
  252. 'g_promote_next_group' => 'required|integer|min:0|not_in:' . $notNext,
  253. 'g_promote_min_posts' => 'required|integer|min:0|max:9999999999',
  254. 'g_edit_posts' => 'required|integer|in:0,1',
  255. 'g_delete_posts' => 'required|integer|in:0,1',
  256. 'g_delete_topics' => 'required|integer|in:0,1',
  257. 'g_deledit_interval' => 'required|integer|min:0|max:999999',
  258. 'g_set_title' => 'required|integer|in:0,1',
  259. 'g_send_email' => 'required|integer|in:0,1',
  260. 'g_email_flood' => 'required|integer|min:0|max:32767',
  261. 'g_report_flood' => 'required|integer|min:0|max:32767',
  262. 'g_sig_length' => 'required|integer|min:0|max:16000',
  263. 'g_sig_lines' => 'required|integer|min:0|max:255',
  264. 'g_pm' => 'required|integer|in:0,1',
  265. 'g_pm_limit' => 'required|integer|min:0|max:999999',
  266. ]);
  267. }
  268. }
  269. if ($v->validation($_POST)) {
  270. return $this->save($group, $baseGroup, $v->getData());
  271. }
  272. $this->fIswev = $v->getErrors();
  273. $group->replAttrs($v->getData());
  274. }
  275. $this->nameTpl = 'admin/form';
  276. $this->form = $this->formEdit($vars, $group, $marker);
  277. return $this;
  278. }
  279. /**
  280. * Запись данных по новой/измененной группе
  281. */
  282. public function save(Group $group, Group $baseGroup, array $data): Page
  283. {
  284. if (
  285. ! $group->groupAdmin
  286. && isset($data['g_moderator'])
  287. && 0 === $data['g_moderator']
  288. ) {
  289. $data['g_mod_edit_users'] = 0;
  290. $data['g_mod_rename_users'] = 0;
  291. $data['g_mod_change_passwords'] = 0;
  292. $data['g_mod_promote_users'] = 0;
  293. $data['g_mod_ban_users'] = 0;
  294. }
  295. if (
  296. isset($data['g_promote_next_group'])
  297. && 0 == $data['g_promote_next_group'] * $data['g_promote_min_posts']
  298. ) {
  299. $data['g_promote_next_group'] = 0;
  300. $data['g_promote_min_posts'] = 0;
  301. }
  302. foreach ($data as $attr => $value) {
  303. if ('a_guest_set' === $attr) {
  304. $this->c->config->a_guest_set = $value;
  305. $this->c->config->save();
  306. } else {
  307. $group->$attr = $value;
  308. }
  309. }
  310. if (null === $group->g_id) {
  311. $message = 'Group added redirect';
  312. $this->c->groups->insert($group);
  313. $this->c->groups->Perm->copy($baseGroup, $group);
  314. } else {
  315. $message = 'Group edited redirect';
  316. $this->c->groups->update($group);
  317. if ($group->g_promote_min_posts) {
  318. $this->c->users->promote($group);
  319. }
  320. }
  321. $this->c->forums->reset();
  322. return $this->c->Redirect->page('AdminGroupsEdit', ['id' => $group->g_id])->message($message);
  323. }
  324. /**
  325. * Формирует данные для формы редактирования группы
  326. */
  327. protected function formEdit(array $args, Group $group, string $marker): array
  328. {
  329. $form = [
  330. 'action' => $this->c->Router->link($marker, $args),
  331. 'hidden' => [
  332. 'token' => $this->c->Csrf->create($marker, $args),
  333. ],
  334. 'sets' => [],
  335. 'btns' => [
  336. 'submit' => [
  337. 'type' => 'submit',
  338. 'value' => null === $group->g_id ? __('Add') : __('Update'),
  339. ],
  340. ],
  341. ];
  342. $fieldset = [];
  343. $fieldset['g_title'] = [
  344. 'type' => 'text',
  345. 'maxlength' => '50',
  346. 'value' => $group->g_title,
  347. 'caption' => 'Group title label',
  348. 'required' => true,
  349. # 'autofocus' => true,
  350. ];
  351. $fieldset['g_user_title'] = [
  352. 'type' => 'text',
  353. 'maxlength' => '50',
  354. 'value' => $group->g_user_title,
  355. 'caption' => 'User title label',
  356. 'help' => ['User title help', $group->groupGuest ? __('Guest') : __('Member')],
  357. ];
  358. $form['sets']['group-titles'] = [
  359. 'legend' => 'Titles subhead',
  360. 'fields' => $fieldset,
  361. ];
  362. if ($group->groupAdmin) {
  363. return $form;
  364. }
  365. if (! $group->groupGuest) {
  366. $fieldset = [];
  367. $options = [0 => __('Disable promotion')];
  368. foreach ($this->groupsNew as $key => $title) {
  369. if (
  370. $key !== $group->g_id
  371. && $key !== FORK_GROUP_GUEST
  372. ) {
  373. $options[$key] = $title;
  374. }
  375. }
  376. $fieldset['g_promote_next_group'] = [
  377. 'type' => 'select',
  378. 'options' => $options,
  379. 'value' => $group->g_promote_next_group,
  380. 'caption' => 'Promote users label',
  381. 'help' => ['Promote users help', __('Disable promotion')],
  382. ];
  383. $fieldset['g_promote_min_posts'] = [
  384. 'type' => 'number',
  385. 'min' => '0',
  386. 'max' => '9999999999',
  387. 'value' => $group->g_promote_min_posts,
  388. 'caption' => 'Number for promotion label',
  389. 'help' => 'Number for promotion help',
  390. ];
  391. $form['sets']['group-promote'] = [
  392. 'legend' => 'Promotion subhead',
  393. 'fields' => $fieldset,
  394. ];
  395. }
  396. $yn = [1 => __('Yes'), 0 => __('No')];
  397. if (
  398. ! $group->groupGuest
  399. && ! $group->groupMember
  400. && $group->g_id !== $this->c->config->i_default_user_group
  401. ) {
  402. $fieldset = [];
  403. $fieldset['g_moderator'] = [
  404. 'type' => 'radio',
  405. 'value' => $group->g_moderator,
  406. 'values' => $yn,
  407. 'caption' => 'Mod privileges label',
  408. 'help' => 'Mod privileges help',
  409. ];
  410. $fieldset['g_mod_edit_users'] = [
  411. 'type' => 'radio',
  412. 'value' => $group->g_mod_edit_users,
  413. 'values' => $yn,
  414. 'caption' => 'Edit profile label',
  415. 'help' => 'Edit profile help',
  416. ];
  417. $fieldset['g_mod_rename_users'] = [
  418. 'type' => 'radio',
  419. 'value' => $group->g_mod_rename_users,
  420. 'values' => $yn,
  421. 'caption' => 'Rename users label',
  422. 'help' => 'Rename users help',
  423. ];
  424. $fieldset['g_mod_change_passwords'] = [
  425. 'type' => 'radio',
  426. 'value' => $group->g_mod_change_passwords,
  427. 'values' => $yn,
  428. 'caption' => 'Change passwords label',
  429. 'help' => 'Change passwords help',
  430. ];
  431. $fieldset['g_mod_promote_users'] = [
  432. 'type' => 'radio',
  433. 'value' => $group->g_mod_promote_users,
  434. 'values' => $yn,
  435. 'caption' => 'Mod promote users label',
  436. 'help' => 'Mod promote users help',
  437. ];
  438. $fieldset['g_mod_ban_users'] = [
  439. 'type' => 'radio',
  440. 'value' => $group->g_mod_ban_users,
  441. 'values' => $yn,
  442. 'caption' => 'Ban users label',
  443. 'help' => 'Ban users help',
  444. ];
  445. $form['sets']['group-mod'] = [
  446. 'legend' => 'Moderation subhead',
  447. 'fields' => $fieldset,
  448. ];
  449. $form['sets']['mod-info'] = [
  450. 'info' => [
  451. [
  452. 'value' => __('Moderator info'),
  453. ],
  454. ],
  455. ];
  456. }
  457. $fieldset = [];
  458. $fieldset['g_read_board'] = [
  459. 'type' => 'radio',
  460. 'value' => $group->g_read_board,
  461. 'values' => $yn,
  462. 'caption' => 'Read board label',
  463. 'help' => 'Read board help',
  464. ];
  465. $fieldset['g_view_users'] = [
  466. 'type' => 'radio',
  467. 'value' => $group->g_view_users,
  468. 'values' => $yn,
  469. 'caption' => 'View user info label',
  470. 'help' => 'View user info help',
  471. ];
  472. $fieldset['g_post_replies'] = [
  473. 'type' => 'radio',
  474. 'value' => $group->g_post_replies,
  475. 'values' => $yn,
  476. 'caption' => 'Post replies label',
  477. 'help' => 'Post replies help',
  478. ];
  479. $fieldset['g_post_topics'] = [
  480. 'type' => 'radio',
  481. 'value' => $group->g_post_topics,
  482. 'values' => $yn,
  483. 'caption' => 'Post topics label',
  484. 'help' => 'Post topics help',
  485. ];
  486. if (! $group->groupGuest) {
  487. $fieldset['g_edit_posts'] = [
  488. 'type' => 'radio',
  489. 'value' => $group->g_edit_posts,
  490. 'values' => $yn,
  491. 'caption' => 'Edit posts label',
  492. 'help' => 'Edit posts help',
  493. ];
  494. $fieldset['g_delete_posts'] = [
  495. 'type' => 'radio',
  496. 'value' => $group->g_delete_posts,
  497. 'values' => $yn,
  498. 'caption' => 'Delete posts label',
  499. 'help' => 'Delete posts help',
  500. ];
  501. $fieldset['g_delete_topics'] = [
  502. 'type' => 'radio',
  503. 'value' => $group->g_delete_topics,
  504. 'values' => $yn,
  505. 'caption' => 'Delete topics label',
  506. 'help' => 'Delete topics help',
  507. ];
  508. $fieldset['g_set_title'] = [
  509. 'type' => 'radio',
  510. 'value' => $group->g_set_title,
  511. 'values' => $yn,
  512. 'caption' => 'Set own title label',
  513. 'help' => 'Set own title help',
  514. ];
  515. }
  516. $fieldset['g_post_links'] = [
  517. 'type' => 'radio',
  518. 'value' => $group->g_post_links,
  519. 'values' => $yn,
  520. 'caption' => 'Post links label',
  521. 'help' => 'Post links help',
  522. ];
  523. $fieldset['g_search'] = [
  524. 'type' => 'radio',
  525. 'value' => $group->g_search,
  526. 'values' => $yn,
  527. 'caption' => 'User search label',
  528. 'help' => 'User search help',
  529. ];
  530. $fieldset['g_search_users'] = [
  531. 'type' => 'radio',
  532. 'value' => $group->g_search_users,
  533. 'values' => $yn,
  534. 'caption' => 'User list search label',
  535. 'help' => 'User list search help',
  536. ];
  537. if ($group->groupGuest) {
  538. $fieldset['a_guest_set[show_smilies]'] = [
  539. 'type' => 'radio',
  540. 'value' => $this->c->config->a_guest_set['show_smilies'] ?? 0,
  541. 'values' => $yn,
  542. 'caption' => 'Smilies label',
  543. 'help' => 'Smilies info',
  544. ];
  545. $fieldset['a_guest_set[show_sig]'] = [
  546. 'type' => 'radio',
  547. 'value' => $this->c->config->a_guest_set['show_sig'] ?? 0,
  548. 'values' => $yn,
  549. 'caption' => 'Sigs label',
  550. 'help' => 'Sigs info',
  551. ];
  552. $fieldset['a_guest_set[show_avatars]'] = [
  553. 'type' => 'radio',
  554. 'value' => $this->c->config->a_guest_set['show_avatars'] ?? 0,
  555. 'values' => $yn,
  556. 'caption' => 'Avatars label',
  557. 'help' => 'Avatars info',
  558. ];
  559. $fieldset['a_guest_set[show_img]'] = [
  560. 'type' => 'radio',
  561. 'value' => $this->c->config->a_guest_set['show_img'] ?? 0,
  562. 'values' => $yn,
  563. 'caption' => 'Images label',
  564. 'help' => 'Images info',
  565. ];
  566. $fieldset['a_guest_set[show_img_sig]'] = [
  567. 'type' => 'radio',
  568. 'value' => $this->c->config->a_guest_set['show_img_sig'] ?? 0,
  569. 'values' => $yn,
  570. 'caption' => 'Images sigs label',
  571. 'help' => 'Images sigs info',
  572. ];
  573. } else {
  574. $fieldset['g_send_email'] = [
  575. 'type' => 'radio',
  576. 'value' => $group->g_send_email,
  577. 'values' => $yn,
  578. 'caption' => 'Send e-mails label',
  579. 'help' => 'Send e-mails help',
  580. ];
  581. }
  582. $form['sets']['group-permissions'] = [
  583. 'legend' => 'Permissions subhead',
  584. 'fields' => $fieldset,
  585. ];
  586. $form['sets']['def-info'] = [
  587. 'info' => [
  588. [
  589. 'value' => __('Group settings info'),
  590. ],
  591. ],
  592. ];
  593. $fieldset = [];
  594. $fieldset['g_post_flood'] = [
  595. 'type' => 'number',
  596. 'min' => '0',
  597. 'max' => '32767',
  598. 'value' => $group->g_post_flood,
  599. 'caption' => 'Post flood label',
  600. 'help' => 'Post flood help',
  601. ];
  602. $fieldset['g_search_flood'] = [
  603. 'type' => 'number',
  604. 'min' => '0',
  605. 'max' => '32767',
  606. 'value' => $group->g_search_flood,
  607. 'caption' => 'Search flood label',
  608. 'help' => 'Search flood help',
  609. ];
  610. if (! $group->groupGuest) {
  611. $fieldset['g_deledit_interval'] = [
  612. 'type' => 'number',
  613. 'min' => '0',
  614. 'max' => '999999',
  615. 'value' => $group->g_deledit_interval,
  616. 'caption' => 'Delete-edit interval label',
  617. 'help' => 'Delete-edit interval help',
  618. ];
  619. $fieldset['g_email_flood'] = [
  620. 'type' => 'number',
  621. 'min' => '0',
  622. 'max' => '32767',
  623. 'value' => $group->g_email_flood,
  624. 'caption' => 'E-mail flood label',
  625. 'help' => 'E-mail flood help',
  626. ];
  627. $fieldset['g_report_flood'] = [
  628. 'type' => 'number',
  629. 'min' => '0',
  630. 'max' => '32767',
  631. 'value' => $group->g_report_flood,
  632. 'caption' => 'Report flood label',
  633. 'help' => 'Report flood help',
  634. ];
  635. }
  636. $form['sets']['group-intervals'] = [
  637. 'legend' => 'Intervals subhead',
  638. 'fields' => $fieldset,
  639. ];
  640. if (! $group->groupGuest) {
  641. $fieldset = [];
  642. $fieldset['g_sig_length'] = [
  643. 'type' => 'number',
  644. 'min' => '0',
  645. 'max' => '16000',
  646. 'value' => $group->g_sig_length,
  647. 'caption' => 'Max sig length label',
  648. 'help' => 'Max sig length help',
  649. ];
  650. $fieldset['g_sig_lines'] = [
  651. 'type' => 'number',
  652. 'min' => '0',
  653. 'max' => '100',
  654. 'value' => $group->g_sig_lines,
  655. 'caption' => 'Max sig lines label',
  656. 'help' => 'Max sig lines help',
  657. ];
  658. $form['sets']['group-signature'] = [
  659. 'legend' => 'Signature subhead',
  660. 'fields' => $fieldset,
  661. ];
  662. $fieldset = [];
  663. $fieldset['g_pm'] = [
  664. 'type' => 'radio',
  665. 'value' => $group->g_pm,
  666. 'values' => $yn,
  667. 'caption' => 'Allow PM label',
  668. ];
  669. $fieldset['g_pm_limit'] = [
  670. 'type' => 'number',
  671. 'min' => '0',
  672. 'max' => '999999',
  673. 'value' => $group->g_pm_limit,
  674. 'caption' => 'PM limit label',
  675. 'help' => 'PM limit help',
  676. ];
  677. $form['sets']['group-pm'] = [
  678. 'legend' => 'PM subhead',
  679. 'fields' => $fieldset,
  680. ];
  681. }
  682. return $form;
  683. }
  684. /**
  685. * Удаление группы
  686. */
  687. public function delete(array $args, string $method): Page
  688. {
  689. $group = $this->c->groups->get($args['id']);
  690. if (
  691. null === $group
  692. || ! $group->canDelete
  693. ) {
  694. return $this->c->Message->message('Bad request');
  695. }
  696. $count = $this->c->users->usersNumber($group);
  697. $groups = [];
  698. if ($count) {
  699. $move = 'required|integer|in:';
  700. foreach ($this->groupsList as $key => $cur) {
  701. if (
  702. $key === FORK_GROUP_GUEST
  703. || $key === $group->g_id
  704. ) {
  705. continue;
  706. }
  707. $groups[$key] = $cur[0];
  708. }
  709. $move .= \implode(',', \array_keys($groups));
  710. } else {
  711. $move = 'absent';
  712. }
  713. if ('POST' === $method) {
  714. $v = $this->c->Validator->reset()
  715. ->addRules([
  716. 'token' => 'token:AdminGroupsDelete',
  717. 'movegroup' => $move,
  718. 'confirm' => 'checkbox',
  719. 'delete' => 'required|string',
  720. ])->addAliases([
  721. ])->addArguments([
  722. 'token' => $args,
  723. ]);
  724. if (
  725. ! $v->validation($_POST)
  726. || '1' !== $v->confirm
  727. ) {
  728. return $this->c->Redirect->page('AdminGroups')->message('No confirm redirect');
  729. }
  730. if ($v->movegroup) {
  731. $this->c->groups->delete($group, $this->c->groups->get($v->movegroup));
  732. } else {
  733. $this->c->groups->delete($group);
  734. }
  735. return $this->c->Redirect->page('AdminGroups')->message('Group removed redirect');
  736. }
  737. $this->nameTpl = 'admin/form';
  738. $this->aCrumbs[] = [$this->c->Router->link('AdminGroupsDelete', $args), 'Group delete'];
  739. $this->aCrumbs[] = [null, ['"%s"', $group->g_title]];
  740. $this->form = $this->formDelete($args, $group, $count, $groups);
  741. $this->titleForm = 'Group delete';
  742. $this->classForm = ['deletegroup'];
  743. return $this;
  744. }
  745. /**
  746. * Подготавливает массив данных для формы
  747. */
  748. protected function formDelete(array $args, Group $group, int $count, array $groups): array
  749. {
  750. $form = [
  751. 'action' => $this->c->Router->link('AdminGroupsDelete', $args),
  752. 'hidden' => [
  753. 'token' => $this->c->Csrf->create('AdminGroupsDelete', $args),
  754. ],
  755. 'sets' => [],
  756. 'btns' => [
  757. 'delete' => [
  758. 'type' => 'submit',
  759. 'value' => __('Delete group'),
  760. ],
  761. 'cancel' => [
  762. 'type' => 'btn',
  763. 'value' => __('Cancel'),
  764. 'link' => $this->c->Router->link('AdminGroups'),
  765. ],
  766. ],
  767. ];
  768. if ($count) {
  769. $form['sets']['move'] = [
  770. 'fields' => [
  771. 'movegroup' => [
  772. 'type' => 'select',
  773. 'options' => $groups,
  774. 'value' => $this->c->config->i_default_user_group,
  775. 'caption' => 'Move users label',
  776. 'help' => ['Move users info', $group->g_title, $count],
  777. ],
  778. ],
  779. ];
  780. }
  781. $form['sets']['conf'] = [
  782. 'fields' => [
  783. 'confirm' => [
  784. 'caption' => 'Confirm delete',
  785. 'type' => 'checkbox',
  786. 'label' => ['I want to delete this group', $group->g_title],
  787. 'checked' => false,
  788. ],
  789. ],
  790. ];
  791. $form['sets']['conf-info'] = [
  792. 'info' => [
  793. [
  794. 'value' => __('Confirm delete warn'),
  795. 'html' => true,
  796. ],
  797. ],
  798. ];
  799. return $form;
  800. }
  801. }