PageRenderTime 25ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/concrete/src/Search/ItemList/ItemList.php

http://github.com/concrete5/concrete5
PHP | 249 lines | 182 code | 38 blank | 29 comment | 23 complexity | b77dc51b2f4bd3133dbe9f52b63d289d MD5 | raw file
Possible License(s): MIT, LGPL-2.1, MPL-2.0-no-copyleft-exception, BSD-3-Clause
  1. <?php
  2. namespace Concrete\Core\Search\ItemList;
  3. use Concrete\Core\Search\Column\Column;
  4. use Concrete\Core\Search\Pagination\PaginationFactory;
  5. use Concrete\Core\Search\StickyRequest;
  6. use Pagerfanta\Exception\OutOfRangeCurrentPageException;
  7. use Pagerfanta\Exception\LessThan1CurrentPageException;
  8. abstract class ItemList
  9. {
  10. protected $sortColumnParameter = 'ccm_order_by';
  11. protected $sortDirectionParameter = 'ccm_order_by_direction';
  12. protected $paginationPageParameter = 'ccm_paging_p';
  13. protected $sortBy;
  14. protected $sortByDirection;
  15. protected $sortBySearchColumn;
  16. // This still checks the auto sort columns if set to true –
  17. // we just turn it off to save processing in the attributed item list (so it doesn't have to instantiate
  18. // all those objects if it's not necessary)
  19. protected $enableAutomaticSorting = true;
  20. protected $autoSortColumns = array();
  21. protected $itemsPerPage = -1; // determined by the pagination object.
  22. protected $debug = false;
  23. abstract protected function executeSortBy($field, $direction = 'asc');
  24. protected function executeSanitizedSortBy($field, $direction)
  25. {
  26. $this->executeSortBy($field, $direction);
  27. }
  28. abstract public function executeGetResults();
  29. abstract public function getResult($mixed);
  30. abstract public function debugStart();
  31. abstract public function debugStop();
  32. public function debug()
  33. {
  34. $this->debug = true;
  35. }
  36. public function isDebugged()
  37. {
  38. return $this->debug;
  39. }
  40. public function sortBy($field, $direction = 'asc')
  41. {
  42. $this->sortBy = $field;
  43. $this->sortByDirection = $direction;
  44. $this->executeSortBy($field, $direction);
  45. }
  46. public function sortBySearchColumn(Column $column, $direction = null)
  47. {
  48. if ($direction != 'asc' && $direction != 'desc') {
  49. $direction = $column->getColumnSortDirection();
  50. }
  51. $this->sortByDirection = $direction;
  52. $this->sortBySearchColumn = $column;
  53. $this->sanitizedSortBy($column->getColumnKey(), $direction);
  54. }
  55. public function getSearchByColumn()
  56. {
  57. return $this->sortBySearchColumn;
  58. }
  59. public function sanitizedSortBy($field, $direction = 'asc')
  60. {
  61. $this->sortBy = $field;
  62. $this->sortByDirection = $direction;
  63. $this->executeSanitizedSortBy($field, $direction);
  64. }
  65. /** Returns a full array of results. */
  66. public function getResults()
  67. {
  68. $results = array();
  69. $this->debugStart();
  70. $executeResults = $this->executeGetResults();
  71. $this->debugStop();
  72. foreach ($executeResults as $result) {
  73. $r = $this->getResult($result);
  74. if ($r != null) {
  75. $results[] = $r;
  76. }
  77. }
  78. return $results;
  79. }
  80. public function getActiveSortColumn()
  81. {
  82. return $this->sortBy;
  83. }
  84. public function isActiveSortColumn($field)
  85. {
  86. return $this->sortBy == $field;
  87. }
  88. public function disableAutomaticSorting()
  89. {
  90. $this->enableAutomaticSorting = false;
  91. }
  92. public function getSortClassName($column)
  93. {
  94. $class = false;
  95. if ($this->isActiveSortColumn($column)) {
  96. $class = 'ccm-results-list-active-sort-';
  97. if ($this->getActiveSortDirection() == 'desc') {
  98. $class .= 'desc';
  99. } else {
  100. $class .= 'asc';
  101. }
  102. }
  103. return $class;
  104. }
  105. public function getSortURL($column, $dir = 'asc', $url = false)
  106. {
  107. $uh = \Core::make("helper/url");
  108. if ($this->isActiveSortColumn($column) && $this->getActiveSortDirection() == $dir) {
  109. $dir = ($dir == 'asc') ? 'desc' : 'asc';
  110. }
  111. $args = array(
  112. $this->getQuerySortColumnParameter() => $column,
  113. $this->getQuerySortDirectionParameter() => $dir,
  114. 'ccm_cursor' => '',
  115. );
  116. $url = $uh->setVariable($args, false, $url);
  117. return strip_tags($url);
  118. }
  119. /** @var \Concrete\Core\Search\Pagination\Pagination */
  120. protected $pagination;
  121. public function getActiveSortDirection()
  122. {
  123. return $this->sortByDirection;
  124. }
  125. public function getQuerySortColumnParameter()
  126. {
  127. return $this->sortColumnParameter;
  128. }
  129. public function getQueryPaginationPageParameter()
  130. {
  131. return $this->paginationPageParameter;
  132. }
  133. public function getQuerySortDirectionParameter()
  134. {
  135. return $this->sortDirectionParameter;
  136. }
  137. public function setItemsPerPage($itemsPerPage)
  138. {
  139. $this->itemsPerPage = $itemsPerPage;
  140. }
  141. /**
  142. * @return int
  143. */
  144. public function getItemsPerPage()
  145. {
  146. return $this->itemsPerPage;
  147. }
  148. /**
  149. * Returns the total results in this item list.
  150. *
  151. * @return int
  152. */
  153. abstract public function getTotalResults();
  154. /**
  155. * Deprecated – call the pagination factory directly.
  156. * @deprecated
  157. * @return \Concrete\Core\Search\Pagination\Pagination
  158. */
  159. public function getPagination()
  160. {
  161. $factory = new PaginationFactory(\Request::getInstance());
  162. if (method_exists($this, 'createPaginationObject')) {
  163. $pagination = $this->createPaginationObject();
  164. $pagination = $factory->deliverPaginationObject($this, $pagination);
  165. } else {
  166. $pagination = $factory->createPaginationObject($this);
  167. }
  168. return $pagination;
  169. }
  170. /**
  171. * @param StickyRequest $request
  172. */
  173. public function setupAutomaticSorting(StickyRequest $request = null)
  174. {
  175. if ($this->enableAutomaticSorting) {
  176. if ($request) {
  177. $data = $request->getSearchRequest();
  178. } else {
  179. $data = \Request::getInstance()->query->all();
  180. }
  181. $direction = 'asc';
  182. if (isset($data[$this->getQuerySortDirectionParameter()])) {
  183. $direction = $data[$this->getQuerySortDirectionParameter()];
  184. }
  185. if (isset($data[$this->getQuerySortColumnParameter()])) {
  186. $value = $data[$this->getQuerySortColumnParameter()];
  187. if (in_array($value, $this->autoSortColumns)) {
  188. $this->sanitizedSortBy($value, $direction);
  189. }
  190. }
  191. }
  192. }
  193. /**
  194. * @deprecated
  195. */
  196. public function get()
  197. {
  198. return $this->getResults();
  199. }
  200. /**
  201. * Allow to modify the auto-pagination parameters and the auto-sorting parameters
  202. *
  203. * @param mixed $nameSpace Content that will be added to the parameters
  204. */
  205. public function setNameSpace($nameSpace)
  206. {
  207. $this->paginationPageParameter .= '_' . $nameSpace;
  208. $this->sortColumnParameter .= '_' . $nameSpace;
  209. $this->sortDirectionParameter .= '_' . $nameSpace;
  210. }
  211. }