Keine Beschreibung

Handler.php 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php
  2. namespace MailPoet\Listing;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoetVendor\Paris\Model;
  5. use MailPoetVendor\Paris\ORMWrapper;
  6. class Handler {
  7. const DEFAULT_LIMIT_PER_PAGE = 20;
  8. public function getSelection($modelClass, array $data) {
  9. $data = $this->processData($data);
  10. $tableName = $modelClass::$_table;
  11. $model = Model::factory($modelClass);
  12. $callback = [$modelClass, 'listingQuery'];
  13. if (method_exists($modelClass, 'listingQuery') && is_callable($callback)) {
  14. $customQuery = call_user_func_array(
  15. $callback,
  16. [$data]
  17. );
  18. if (!empty($data['selection'])) {
  19. $customQuery->whereIn($tableName . '.id', $data['selection']);
  20. }
  21. return $customQuery;
  22. } else {
  23. $model = $this->setFilter($model, $data);
  24. $this->setGroup($model, $data);
  25. $this->setSearch($model, $data);
  26. if (!empty($data['selection'])) {
  27. $model->whereIn($tableName . '.id', $data['selection']);
  28. }
  29. return $model;
  30. }
  31. }
  32. public function get($modelClass, array $data) {
  33. $data = $this->processData($data);
  34. $tableName = $modelClass::$_table;
  35. $model = Model::factory($modelClass);
  36. // get groups
  37. $groups = [];
  38. $groupsCallback = [$modelClass, 'groups'];
  39. if (method_exists($modelClass, 'groups') && is_callable($groupsCallback)) {
  40. $groups = call_user_func_array(
  41. $groupsCallback,
  42. [$data]
  43. );
  44. }
  45. // get filters
  46. $filters = [];
  47. $filtersCallback = [$modelClass, 'filters'];
  48. if (method_exists($modelClass, 'filters') && is_callable($filtersCallback)) {
  49. $filters = call_user_func_array(
  50. $filtersCallback,
  51. [$data]
  52. );
  53. }
  54. // get items and total count
  55. $listingCallback = [$modelClass, 'listingQuery'];
  56. if (method_exists($modelClass, 'listingQuery') && is_callable($listingCallback)) {
  57. $customQuery = call_user_func_array(
  58. $listingCallback,
  59. [$data]
  60. );
  61. $count = $customQuery->count();
  62. $items = $customQuery
  63. ->offset($data['offset'])
  64. ->limit($data['limit'])
  65. ->{'order_by_' . $data['sort_order']}(
  66. $tableName . '.' . $data['sort_by']
  67. )
  68. ->findMany();
  69. } else {
  70. $model = $this->setFilter($model, $data);
  71. $this->setGroup($model, $data);
  72. $this->setSearch($model, $data);
  73. $this->setOrder($model, $data, $tableName);
  74. $count = $model->count();
  75. $items = $model
  76. ->offset($data['offset'])
  77. ->limit($data['limit'])
  78. ->findMany();
  79. }
  80. return [
  81. 'count' => $count,
  82. 'filters' => $filters,
  83. 'groups' => $groups,
  84. 'items' => $items,
  85. ];
  86. }
  87. public function getListingDefinition(array $data): ListingDefinition {
  88. $data = $this->processData($data);
  89. return new ListingDefinition(
  90. $data['group'],
  91. $data['filter'] ?? [],
  92. $data['search'],
  93. $data['params'] ?? [],
  94. $data['sort_by'],
  95. $data['sort_order'],
  96. $data['offset'],
  97. $data['limit'],
  98. $data['selection'] ?? []
  99. );
  100. }
  101. private function setSearch(ORMWrapper $model, array $data) {
  102. if (empty($data['search'])) {
  103. return;
  104. }
  105. return $model->filter('search', $data['search']);
  106. }
  107. private function setOrder(ORMWrapper $model, array $data, $tableName) {
  108. return $model
  109. ->{'order_by_' . $data['sort_order']}(
  110. $tableName . '.' . $data['sort_by']);
  111. }
  112. private function setGroup(ORMWrapper $model, array $data) {
  113. if ($data['group'] === null) {
  114. return;
  115. }
  116. $model->filter('groupBy', $data['group']);
  117. }
  118. private function setFilter(ORMWrapper $model, array $data) {
  119. if ($data['filter'] === null) {
  120. return $model;
  121. }
  122. return $model->filter('filterBy', $data['filter']);
  123. }
  124. private function processData(array $data) {
  125. // check if sort order was specified or default to "asc"
  126. $sortOrder = (!empty($data['sort_order'])) ? $data['sort_order'] : 'asc';
  127. // constrain sort order value to either be "asc" or "desc"
  128. $sortOrder = ($sortOrder === 'asc') ? 'asc' : 'desc';
  129. // sanitize sort by
  130. $sortBy = (!empty($data['sort_by']))
  131. ? filter_var($data['sort_by'], FILTER_SANITIZE_STRING)
  132. : '';
  133. if (empty($sortBy)) {
  134. $sortBy = 'id';
  135. }
  136. $data = [
  137. // extra parameters
  138. 'params' => (isset($data['params']) ? $data['params'] : []),
  139. // pagination
  140. 'offset' => (isset($data['offset']) ? (int)$data['offset'] : 0),
  141. 'limit' => (isset($data['limit'])
  142. ? (int)$data['limit']
  143. : PageLimit::DEFAULT_LIMIT_PER_PAGE
  144. ),
  145. // searching
  146. 'search' => (isset($data['search']) ? $data['search'] : null),
  147. // sorting
  148. 'sort_by' => $sortBy,
  149. 'sort_order' => $sortOrder,
  150. // grouping
  151. 'group' => (isset($data['group']) ? $data['group'] : null),
  152. // filters
  153. 'filter' => (isset($data['filter']) ? $data['filter'] : null),
  154. // selection
  155. 'selection' => (isset($data['selection']) ? $data['selection'] : null),
  156. ];
  157. return $data;
  158. }
  159. }