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

/vendor/knplabs/knp-paginator-bundle/Helper/Processor.php

https://gitlab.com/galaxy-pidev/AllForDealWeb
PHP | 190 lines | 108 code | 29 blank | 53 comment | 12 complexity | 40f025bd3e2e19dd931c9499bac00771 MD5 | raw file
  1. <?php
  2. namespace Knp\Bundle\PaginatorBundle\Helper;
  3. use Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination;
  4. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  5. use Symfony\Component\Translation\TranslatorInterface;
  6. /**
  7. * Pagination data processor
  8. *
  9. * Common data processor for all templating engines
  10. *
  11. * @author RafaƂ Wrzeszcz <rafal.wrzeszcz@wrzasq.pl>
  12. */
  13. class Processor
  14. {
  15. /**
  16. * @var UrlGeneratorInterface
  17. */
  18. protected $router;
  19. /**
  20. * @var TranslatorInterface
  21. */
  22. protected $translator;
  23. public function __construct(UrlGeneratorInterface $router, TranslatorInterface $translator)
  24. {
  25. $this->router = $router;
  26. $this->translator = $translator;
  27. }
  28. /**
  29. * Generates pagination template data
  30. *
  31. * @param SlidingPagination $pagination
  32. * @param array $queryParams
  33. * @param array $viewParams
  34. *
  35. * @return array
  36. */
  37. public function render(SlidingPagination $pagination, array $queryParams = array(), array $viewParams = array())
  38. {
  39. $data = $pagination->getPaginationData();
  40. $data['route'] = $pagination->getRoute();
  41. $data['query'] = array_merge($pagination->getParams(), $queryParams);
  42. return array_merge(
  43. $pagination->getPaginatorOptions(), // options given to paginator when paginated
  44. $pagination->getCustomParameters(), // all custom parameters for view
  45. $viewParams, // additional custom parameters for view
  46. $data // merging base route parameters last, to avoid broke of integrity
  47. );
  48. }
  49. /**
  50. * Create a sort url for the field named $title
  51. * and identified by $key which consists of
  52. * alias and field. $options holds all link
  53. * parameters like "alt, class" and so on.
  54. *
  55. * $key example: "article.title"
  56. *
  57. * @param SlidingPagination $pagination
  58. * @param string $title
  59. * @param string $key
  60. * @param array $options
  61. * @param array $params
  62. *
  63. * @return array
  64. */
  65. public function sortable(SlidingPagination $pagination, $title, $key, $options = array(), $params = array())
  66. {
  67. $options = array_merge(array(
  68. 'absolute' => false,
  69. 'translationParameters' => array(),
  70. 'translationDomain' => null,
  71. 'translationCount' => null,
  72. ), $options);
  73. $params = array_merge($pagination->getParams(), $params);
  74. $direction = isset($options[$pagination->getPaginatorOption('sortDirectionParameterName')])
  75. ? $options[$pagination->getPaginatorOption('sortDirectionParameterName')]
  76. : (isset($options['defaultDirection']) ? $options['defaultDirection'] : 'asc')
  77. ;
  78. $sorted = $pagination->isSorted($key, $params);
  79. if ($sorted) {
  80. $direction = $params[$pagination->getPaginatorOption('sortDirectionParameterName')];
  81. $direction = (strtolower($direction) == 'asc') ? 'desc' : 'asc';
  82. $class = $direction == 'asc' ? 'desc' : 'asc';
  83. } else {
  84. $class = 'sortable';
  85. }
  86. if (isset($options['class'])) {
  87. $options['class'] .= ' ' . $class;
  88. } else {
  89. $options['class'] = $class;
  90. }
  91. if (is_array($title) && array_key_exists($direction, $title)) {
  92. $title = $title[$direction];
  93. }
  94. $params = array_merge(
  95. $params,
  96. array(
  97. $pagination->getPaginatorOption('sortFieldParameterName') => $key,
  98. $pagination->getPaginatorOption('sortDirectionParameterName') => $direction,
  99. $pagination->getPaginatorOption('pageParameterName') => 1 // reset to 1 on sort
  100. )
  101. );
  102. $options['href'] = $this->router->generate($pagination->getRoute(), $params, $options['absolute']);
  103. if (null !== $options['translationDomain']) {
  104. if (null !== $options['translationCount']) {
  105. $title = $this->translator->transChoice($title, $options['translationCount'], $options['translationParameters'], $options['translationDomain']);
  106. } else {
  107. $title = $this->translator->trans($title, $options['translationParameters'], $options['translationDomain']);
  108. }
  109. }
  110. if (!isset($options['title'])) {
  111. $options['title'] = $title;
  112. }
  113. unset($options['absolute'], $options['translationDomain'], $options['translationParameters']);
  114. return array_merge(
  115. $pagination->getPaginatorOptions(),
  116. $pagination->getCustomParameters(),
  117. compact('options', 'title', 'direction', 'sorted', 'key')
  118. );
  119. }
  120. /**
  121. * Create a filter url for the field named $title
  122. * and identified by $key which consists of
  123. * alias and field. $options holds all link
  124. * parameters like "alt, class" and so on.
  125. *
  126. * $key example: "article.title"
  127. *
  128. * @param SlidingPagination $pagination
  129. * @param array $fields
  130. * @param array $options
  131. * @param array $params
  132. *
  133. * @return array
  134. */
  135. public function filter(SlidingPagination $pagination, array $fields, $options = array(), $params = array())
  136. {
  137. $options = array_merge(array(
  138. 'absolute' => false,
  139. 'translationParameters' => array(),
  140. 'translationDomain' => null,
  141. 'button' => 'Filter',
  142. ), $options);
  143. $params = array_merge($pagination->getParams(), $params);
  144. $params[$pagination->getPaginatorOption('pageParameterName')] = 1; // reset to 1 on filter
  145. $filterFieldName = $pagination->getPaginatorOption('filterFieldParameterName');
  146. $filterValueName = $pagination->getPaginatorOption('filterValueParameterName');
  147. $selectedField = isset($params[$filterFieldName]) ? $params[$filterFieldName] : null;
  148. $selectedValue = isset($params[$filterValueName]) ? $params[$filterValueName] : null;
  149. $action = $this->router->generate($pagination->getRoute(), $params, $options['absolute']);
  150. foreach ($fields as $field => $title) {
  151. $fields[$field] = $this->translator->trans($title, $options['translationParameters'], $options['translationDomain']);
  152. }
  153. $options['button'] = $this->translator->trans($options['button'], $options['translationParameters'], $options['translationDomain']);
  154. unset($options['absolute'], $options['translationDomain'], $options['translationParameters']);
  155. return array_merge(
  156. $pagination->getPaginatorOptions(),
  157. $pagination->getCustomParameters(),
  158. compact('fields', 'action', 'filterFieldName', 'filterValueName', 'selectedField', 'selectedValue', 'options')
  159. );
  160. }
  161. }