BootstrapHelper.php 4.4 KB

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