BootstrapHelper.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. App::uses('AppHelper', 'View/Helper');
  3. /**
  4. * Generic html snippets to display some specific widgets like accordion
  5. *
  6. * Note:
  7. * This is meant to work with TwitterBootstrap (Layout and Script), but
  8. * should also work with other custom solutions (if they use the same selectors).
  9. *
  10. * Dependencies:
  11. * The respective JS plugins for the widgets.
  12. *
  13. * @license http://opensource.org/licenses/mit-license.php MIT
  14. * @author Mark Scherer
  15. * @php 5
  16. * @version 1.0
  17. */
  18. class BootstrapHelper extends AppHelper {
  19. public $helpers = ['Html', 'Form'];
  20. protected $_count = 1;
  21. protected $_items = [];
  22. public function xx() {
  23. //
  24. }
  25. /**
  26. * Complete typeahead form input element
  27. *
  28. * @param fieldName
  29. * @param options:
  30. * - data (array of strings)
  31. * - items (defaults to 8)
  32. * @return string html
  33. */
  34. public function typeahead($fieldName, $options = [], $inputOptions = []) {
  35. $inputOptions['data-provide'] = 'typeahead';
  36. //$inputOptions['data-source'] = $this->_formatSource($options['data']);
  37. if (!empty($options['items'])) {
  38. $inputOptions['data-items'] = (int)$options['items'];
  39. }
  40. $class = 'typeahead_' . strtolower(Inflector::slug($fieldName)); // str_replace('.', '_', $fieldName);
  41. $inputOptions['class'] = empty($inputOptions['class']) ? $class : $inputOptions['class'] . ' ' . $class;
  42. $script = '
  43. $(\'.' . $class . '\').typeahead({
  44. source: ' . $this->_formatSource($options['data']) . '
  45. })
  46. ';
  47. $script = PHP_EOL . '<script>' . $script . '</script>';
  48. return $this->Form->input($fieldName, $inputOptions) . $script;
  49. }
  50. public function _formatSource($elements) {
  51. //$res = array();
  52. //return '[\''.implode('\',\'', $elements).'\']';
  53. return json_encode($elements);
  54. }
  55. /**
  56. * Complete carousel container
  57. *
  58. * @param array $items (heading, content, active)
  59. * @param id
  60. * @param array $options
  61. * @return string html
  62. */
  63. public function carousel($items, $id = null, $globalOptions = []) {
  64. $res = '<div id="myCarousel" class="carousel">
  65. <div class="carousel-inner">
  66. ' . $this->carouselItems($items, $globalOptions) . '
  67. </div>
  68. ' . $this->carouselControl() . '
  69. </div>';
  70. return $res;
  71. }
  72. public function carouselControl() {
  73. $res = '<a class="carousel-control left" href="#myCarousel" data-slide="prev">&lsaquo;</a>
  74. <a class="carousel-control right" href="#myCarousel" data-slide="next">&rsaquo;</a>';
  75. return $res;
  76. }
  77. /**
  78. * Items of a carousel container
  79. *
  80. * @param array $items (heading, content, active)
  81. * - active (visible, true/false)
  82. * @return string html
  83. */
  84. public function carouselItems($items, $options = []) {
  85. $res = [];
  86. foreach ($items as $key => $item) {
  87. $active = '';
  88. if ($key == 0 && !isset($item['active']) || !empty($item['active'])) {
  89. $active = ' active';
  90. }
  91. $tmp = $item['content'];
  92. if (!empty($item['heading'])) {
  93. $tmp .= '<div class="carousel-caption">' . $item['heading'] . '</div>';
  94. }
  95. $tmp = '<div class="item' . $active . '">' . $tmp . '</div>';
  96. $res[] = $tmp;
  97. }
  98. $res = implode(PHP_EOL, $res);
  99. return $res;
  100. }
  101. /**
  102. * Complete accordion container
  103. *
  104. * @param array $records (heading, content, options)
  105. * @param id
  106. * @param array $options
  107. * @return string html
  108. */
  109. public function accordion($records, $id = null, $globalOptions = []) {
  110. $res = '<div class="accordion" id="accordion' . $id . '">';
  111. foreach ($records as $record) {
  112. $options = $globalOptions;
  113. extract($record);
  114. $res .= $this->accordionGroup($heading, $content, $options);
  115. }
  116. $res .= '</div>';
  117. return $res;
  118. }
  119. /**
  120. * A single group of an accordion container
  121. *
  122. * @param string $heading
  123. * @param string $content
  124. * @param array $options
  125. * - active (collapsed, true/false)
  126. * @return string html
  127. */
  128. public function accordionGroup($heading, $content, $options = []) {
  129. $i = $this->_count;
  130. $this->_count++;
  131. $in = '';
  132. if ($i == 1 && !isset($options['active']) || !empty($options['active'])) {
  133. $in = ' in';
  134. }
  135. $res = '<div class="accordion-group">';
  136. $res .= ' <div class="accordion-heading">';
  137. $res .= ' <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#collapse' . $i . '">';
  138. $res .= $heading;
  139. $res .= ' </a>';
  140. $res .= ' </div>';
  141. $res .= ' <div id="collapse' . $i . '" class="accordion-body collapse' . $in . '">';
  142. $res .= ' <div class="accordion-inner">';
  143. $res .= $content;
  144. $res .= ' </div>';
  145. $res .= ' </div>';
  146. $res .= '</div>';
  147. return $res;
  148. }
  149. }