View.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. <?php
  2. namespace ForkBB\Models\Pages\Admin\Users;
  3. use ForkBB\Core\Validator;
  4. use ForkBB\Models\Page;
  5. use ForkBB\Models\Pages\Admin\Users;
  6. class View extends Users
  7. {
  8. /**
  9. * Генерирует список доступных групп пользователей
  10. *
  11. * @param bool $onlyKeys
  12. *
  13. * @return array
  14. */
  15. protected function groups(bool $onlyKeys = false): array
  16. {
  17. $groups = [
  18. -1 => \ForkBB\__('All groups'),
  19. 0 => \ForkBB\__('Unverified users'),
  20. ];
  21. foreach ($this->c->groups->getList() as $group) {
  22. if (! $group->groupGuest) {
  23. $groups[$group->g_id] = $group->g_title;
  24. }
  25. }
  26. return $onlyKeys ? \array_keys($groups) : $groups;
  27. }
  28. /**
  29. * Подготавливает данные для шаблона поиска пользователей
  30. *
  31. * @param array $args
  32. * @param string $method
  33. * @param array $data
  34. *
  35. * @return Page
  36. */
  37. public function view(array $args, string $method, array $data = []): Page
  38. {
  39. if ('POST' === $method) {
  40. $v = $this->c->Validator->reset()
  41. ->addRules([
  42. 'token' => 'token:AdminUsers',
  43. 'ip' => 'required',
  44. ]);
  45. if ($v->validation($_POST)) {
  46. $ip = \filter_var($v->ip, \FILTER_VALIDATE_IP);
  47. if (false === $ip) {
  48. $this->fIswev = ['v', \ForkBB\__('Bad IP message')];
  49. $data = $v->getData();
  50. } else {
  51. return $this->c->Redirect->page('AdminUsersResult', ['data' => $this->encodeData($ip)]);
  52. }
  53. } else {
  54. $v = $this->c->Validator->reset()
  55. ->addValidators([
  56. ])->addRules([
  57. 'token' => 'token:AdminUsers',
  58. 'username' => 'string|max:25',
  59. 'email' => 'string|max:80',
  60. 'title' => 'string|max:50',
  61. 'realname' => 'string|max:40',
  62. 'gender' => 'integer|in:0,1,2',
  63. 'url' => 'string|max:100',
  64. 'location' => 'string|max:30',
  65. 'signature' => 'string|max:512',
  66. 'admin_note' => 'string|max:30',
  67. 'num_posts_1' => 'integer|min:0|max:9999999999',
  68. 'num_posts_2' => 'integer|min:0|max:9999999999',
  69. 'last_post_1' => 'date',
  70. 'last_post_2' => 'date',
  71. 'last_visit_1' => 'date',
  72. 'last_visit_2' => 'date',
  73. 'registered_1' => 'date',
  74. 'registered_2' => 'date',
  75. 'order_by' => 'required|string|in:username,email,num_posts,last_post,last_visit,registered',
  76. 'direction' => 'required|string|in:ASC,DESC',
  77. 'user_group' => 'required|integer|in:' . \implode(',', $this->groups(true)),
  78. ])->addAliases([
  79. 'username' => 'Username label',
  80. 'email' => 'E-mail address label',
  81. 'title' => 'Title label',
  82. 'realname' => 'Real name label',
  83. 'gender' => 'Gender label',
  84. 'url' => 'Website label',
  85. 'location' => 'Location label',
  86. 'signature' => 'Signature label',
  87. 'admin_note' => 'Admin note label',
  88. 'num_posts_1' => 'Posts label',
  89. 'num_posts_2' => 'Posts label',
  90. 'last_post_1' => 'Last post label',
  91. 'last_post_2' => 'Last post label',
  92. 'last_visit_1' => 'Last visit label',
  93. 'last_visit_2' => 'Last visit label',
  94. 'registered_1' => 'Registered label',
  95. 'registered_2' => 'Registered label',
  96. 'order_by' => 'Order by label',
  97. # 'direction' => ,
  98. 'user_group' => 'User group label',
  99. ])->addArguments([
  100. ])->addMessages([
  101. ]);
  102. if ($v->validation($_POST)) {
  103. return $this->c->Redirect->page('AdminUsersResult', ['data' => $this->encodeData($v->getData())]);
  104. }
  105. $this->fIswev = $v->getErrors();
  106. $data = $v->getData();
  107. }
  108. }
  109. $this->nameTpl = 'admin/users';
  110. $this->formSearch = $this->form($data);
  111. if ($this->c->userRules->viewIP) {
  112. $this->formIP = $this->formIP($data);
  113. }
  114. return $this;
  115. }
  116. /**
  117. * Создает массив данных для формы поиска
  118. *
  119. * @param array $data
  120. *
  121. * @return array
  122. */
  123. protected function form(array $data): array
  124. {
  125. $form = [
  126. 'action' => $this->c->Router->link('AdminUsers'),
  127. 'hidden' => [
  128. 'token' => $this->c->Csrf->create('AdminUsers'),
  129. ],
  130. 'sets' => [],
  131. 'btns' => [
  132. 'search' => [
  133. 'type' => 'submit',
  134. 'value' => \ForkBB\__('Submit search'),
  135. 'accesskey' => 's',
  136. ],
  137. ],
  138. ];
  139. $form['sets']['search-info'] = [
  140. 'info' => [
  141. 'info1' => [
  142. 'type' => '', //????
  143. 'value' => \ForkBB\__('User search info'),
  144. ],
  145. ],
  146. ];
  147. $fields = [];
  148. $fields['username'] = [
  149. 'type' => 'text',
  150. 'maxlength' => 25,
  151. 'caption' => \ForkBB\__('Username label'),
  152. 'value' => isset($data['username']) ? $data['username'] : null,
  153. ];
  154. $fields['email'] = [
  155. 'type' => 'text',
  156. 'maxlength' => 80,
  157. 'caption' => \ForkBB\__('E-mail address label'),
  158. 'value' => isset($data['email']) ? $data['email'] : null,
  159. ];
  160. $fields['title'] = [
  161. 'type' => 'text',
  162. 'maxlength' => 50,
  163. 'caption' => \ForkBB\__('Title label'),
  164. 'value' => isset($data['title']) ? $data['title'] : null,
  165. ];
  166. $fields['realname'] = [
  167. 'type' => 'text',
  168. 'maxlength' => 40,
  169. 'caption' => \ForkBB\__('Real name label'),
  170. 'value' => isset($data['realname']) ? $data['realname'] : null,
  171. ];
  172. $genders = [
  173. 0 => \ForkBB\__('Do not display'),
  174. 1 => \ForkBB\__('Male'),
  175. 2 => \ForkBB\__('Female'),
  176. ];
  177. $fields['gender'] = [
  178. # 'class' => 'block',
  179. 'type' => 'radio',
  180. 'value' => isset($data['gender']) ? $data['gender'] : -1,
  181. 'values' => $genders,
  182. 'caption' => \ForkBB\__('Gender label'),
  183. ];
  184. $fields['url'] = [
  185. 'id' => 'website',
  186. 'type' => 'text',
  187. 'maxlength' => 100,
  188. 'caption' => \ForkBB\__('Website label'),
  189. 'value' => isset($data['url']) ? $data['url'] : null,
  190. ];
  191. $fields['location'] = [
  192. 'type' => 'text',
  193. 'maxlength' => 30,
  194. 'caption' => \ForkBB\__('Location label'),
  195. 'value' => isset($data['location']) ? $data['location'] : null,
  196. ];
  197. $fields['signature'] = [
  198. 'type' => 'text',
  199. 'maxlength' => 512,
  200. 'caption' => \ForkBB\__('Signature label'),
  201. 'value' => isset($data['signature']) ? $data['signature'] : null,
  202. ];
  203. $fields['admin_note'] = [
  204. 'type' => 'text',
  205. 'maxlength' => 30,
  206. 'caption' => \ForkBB\__('Admin note label'),
  207. 'value' => isset($data['admin_note']) ? $data['admin_note'] : null,
  208. ];
  209. $fields['between1'] = [
  210. 'class' => 'between',
  211. 'type' => 'wrap',
  212. ];
  213. $fields['num_posts_1'] = [
  214. 'type' => 'number',
  215. 'class' => 'bstart',
  216. 'min' => 0,
  217. 'max' => 9999999999,
  218. 'value' => isset($data['num_posts_1']) ? $data['num_posts_1'] : null,
  219. 'caption' => \ForkBB\__('Posts label'),
  220. ];
  221. $fields['num_posts_2'] = [
  222. 'type' => 'number',
  223. 'class' => 'bend',
  224. 'min' => 0,
  225. 'max' => 9999999999,
  226. 'value' => isset($data['num_posts_2']) ? $data['num_posts_2'] : null,
  227. ];
  228. $fields[] = [
  229. 'type' => 'endwrap',
  230. ];
  231. $fields['between2'] = [
  232. 'class' => 'between',
  233. 'type' => 'wrap',
  234. ];
  235. $fields['last_post_1'] = [
  236. 'class' => 'bstart',
  237. 'type' => 'text',
  238. 'maxlength' => 100,
  239. 'value' => isset($data['last_post_1']) ? $data['last_post_1'] : null,
  240. 'caption' => \ForkBB\__('Last post label'),
  241. ];
  242. $fields['last_post_2'] = [
  243. 'class' => 'bend',
  244. 'type' => 'text',
  245. 'maxlength' => 100,
  246. 'value' => isset($data['last_post_2']) ? $data['last_post_2'] : null,
  247. ];
  248. $fields[] = [
  249. 'type' => 'endwrap',
  250. ];
  251. $fields['between3'] = [
  252. 'class' => 'between',
  253. 'type' => 'wrap',
  254. ];
  255. $fields['last_visit_1'] = [
  256. 'class' => 'bstart',
  257. 'type' => 'text',
  258. 'maxlength' => 100,
  259. 'value' => isset($data['last_visit_1']) ? $data['last_visit_1'] : null,
  260. 'caption' => \ForkBB\__('Last visit label'),
  261. ];
  262. $fields['last_visit_2'] = [
  263. 'class' => 'bend',
  264. 'type' => 'text',
  265. 'maxlength' => 100,
  266. 'value' => isset($data['last_visit_2']) ? $data['last_visit_2'] : null,
  267. ];
  268. $fields[] = [
  269. 'type' => 'endwrap',
  270. ];
  271. $fields['between4'] = [
  272. 'class' => 'between',
  273. 'type' => 'wrap',
  274. ];
  275. $fields['registered_1'] = [
  276. 'class' => 'bstart',
  277. 'type' => 'text',
  278. 'maxlength' => 100,
  279. 'value' => isset($data['registered_1']) ? $data['registered_1'] : null,
  280. 'caption' => \ForkBB\__('Registered label'),
  281. ];
  282. $fields['registered_2'] = [
  283. 'class' => 'bend',
  284. 'type' => 'text',
  285. 'maxlength' => 100,
  286. 'value' => isset($data['registered_2']) ? $data['registered_2'] : null,
  287. ];
  288. $fields[] = [
  289. 'type' => 'endwrap',
  290. ];
  291. $form['sets']['filters'] = [
  292. 'legend' => \ForkBB\__('User search subhead'),
  293. 'fields' => $fields,
  294. ];
  295. $fields = [];
  296. $fields['between5'] = [
  297. 'class' => 'between',
  298. 'type' => 'wrap',
  299. ];
  300. $fields['order_by'] = [
  301. 'class' => 'bstart',
  302. 'type' => 'select',
  303. 'options' => [
  304. 'username' => \ForkBB\__('Order by username'),
  305. 'email' => \ForkBB\__('Order by e-mail'),
  306. 'num_posts' => \ForkBB\__('Order by posts'),
  307. 'last_post' => \ForkBB\__('Order by last post'),
  308. 'last_visit' => \ForkBB\__('Order by last visit'),
  309. 'registered' => \ForkBB\__('Order by registered'),
  310. ],
  311. 'value' => isset($data['order_by']) ? $data['order_by'] : 'registered',
  312. 'caption' => \ForkBB\__('Order by label'),
  313. ];
  314. $fields['direction'] = [
  315. 'class' => 'bend',
  316. 'type' => 'select',
  317. 'options' => [
  318. 'ASC' => \ForkBB\__('Ascending'),
  319. 'DESC' => \ForkBB\__('Descending'),
  320. ],
  321. 'value' => isset($data['direction']) ? $data['direction'] : 'DESC',
  322. ];
  323. $fields[] = [
  324. 'type' => 'endwrap',
  325. ];
  326. $fields['user_group'] = [
  327. 'type' => 'select',
  328. 'options' => $this->groups(),
  329. 'value' => isset($data['user_group']) ? $data['user_group'] : -1,
  330. 'caption' => \ForkBB\__('User group label'),
  331. ];
  332. $form['sets']['sorting'] = [
  333. 'legend' => \ForkBB\__('Search results legend'),
  334. 'fields' => $fields,
  335. ];
  336. return $form;
  337. }
  338. /**
  339. * Создает массив данных для формы поиска по IP
  340. *
  341. * @param array $data
  342. *
  343. * @return array
  344. */
  345. protected function formIP(array $data): array
  346. {
  347. $form = [
  348. 'action' => $this->c->Router->link('AdminUsers'),
  349. 'hidden' => [
  350. 'token' => $this->c->Csrf->create('AdminUsers'),
  351. ],
  352. 'sets' => [],
  353. 'btns' => [
  354. 'find' => [
  355. 'type' => 'submit',
  356. 'value' => \ForkBB\__('Find IP address'),
  357. 'accesskey' => 'f',
  358. ],
  359. ],
  360. ];
  361. $fields = [];
  362. $fields['ip'] = [
  363. 'type' => 'text',
  364. 'maxlength' => 49,
  365. 'caption' => \ForkBB\__('IP address label'),
  366. 'value' => isset($data['ip']) ? $data['ip'] : null,
  367. 'required' => true,
  368. ];
  369. $form['sets']['ip'] = [
  370. 'legend' => \ForkBB\__('IP search subhead'),
  371. 'fields' => $fields,
  372. ];
  373. return $form;
  374. }
  375. }