BootstrapHelper.php 4.4 KB

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