BootstrapHelper.php 4.4 KB

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