/src/Zf2tb/Form/View/Helper/FormRowTb.php

https://bitbucket.org/andrew_lebedenko/zf2tb · PHP · 300 lines · 176 code · 27 blank · 97 comment · 32 complexity · 2bf9dc36884acc5797ed0460411760e2 MD5 · raw file

  1. <?php
  2. namespace Zf2tb\Form\View\Helper;
  3. use Zf2tb\Form\View\Helper\FormElementTb;
  4. use Zf2tb\Form\View\Helper\FormHintTb;
  5. use Zf2tb\Form\View\Helper\FormDescriptionTb;
  6. use Zf2tb\Form\View\Helper\FormElementErrorsTb;
  7. use Zf2tb\Form\View\Helper\FormControlGroupTb;
  8. use Zf2tb\Form\View\Helper\FormControlsTb;
  9. use Zf2tb\Form\Exception\UnsupportedHelperTypeException;
  10. use Zf2tb\GenUtil;
  11. use Zf2tb\Form\FormUtil;
  12. use Zend\Form\View\Helper\FormLabel;
  13. use Zend\Form\ElementInterface;
  14. use Zend\Form\View\Helper\AbstractHelper;
  15. /**
  16. * FormRowTb
  17. *
  18. * @package Zf2tb
  19. * @author Andrew Lebedenko
  20. * @copyright Andrew Lebedenko (c)
  21. * @link https://bitbucket.org/andrew_lebedenko/zf2tb
  22. */
  23. class FormRowTb extends AbstractHelper
  24. {
  25. /**
  26. * @var FormLabel
  27. */
  28. protected $labelHelper;
  29. /**
  30. * @var FormElementTb
  31. */
  32. protected $elementHelper;
  33. /**
  34. * @var FormElementErrorsTb
  35. */
  36. protected $elementErrorsHelper;
  37. /**
  38. * @var FormHintTb
  39. */
  40. protected $hintHelper;
  41. /**
  42. * @var FormDescriptionTb
  43. */
  44. protected $descriptionHelper;
  45. /**
  46. * @var FormControlGroupTb
  47. */
  48. protected $controlGroupHelper;
  49. /**
  50. * @var FormControlsTb
  51. */
  52. protected $controlsHelper;
  53. /**
  54. * @var GenUtil
  55. */
  56. protected $genUtil;
  57. /**
  58. * @var FormUtil
  59. */
  60. protected $formUtil;
  61. /**
  62. * Constructor
  63. * @param GenUtil $genUtil
  64. * @param FormUtil $formUtil
  65. */
  66. public function __construct(GenUtil $genUtil, FormUtil $formUtil)
  67. {
  68. $this->genUtil = $genUtil;
  69. $this->formUtil = $formUtil;
  70. }
  71. /**
  72. * Utility form helper that renders a label (if it exists), an element, hint, description and errors
  73. * @param ElementInterface $element
  74. * @param string|null $formType
  75. * @param array $displayOptions
  76. * @param bool $renderErrors
  77. * @return string
  78. */
  79. public function render(ElementInterface $element,
  80. $formType = null,
  81. array $displayOptions = array(),
  82. $renderErrors = true)
  83. {
  84. $formType = $this->formUtil->filterFormType($formType);
  85. $elementHelper = $this->getElementHelper();
  86. $elementErrorsHelper = $this->getElementErrorsHelper();
  87. $hintHelper = $this->getHintHelper();
  88. $descriptionHelper = $this->getDescriptionHelper();
  89. $label = (string)$element->getLabel();
  90. $elementString = $elementHelper->render($element, $formType, $displayOptions);
  91. //Hint, description and element errors are generated only for visible elements on horizontal and vertical forms
  92. //Divs for control-group and controls are generated only for visible elements on horizontal and vertical forms,
  93. //otherwise a blank vertical space is rendered
  94. if (($formType == FormUtil::FORM_TYPE_HORIZONTAL || $formType == FormUtil::FORM_TYPE_VERTICAL)
  95. && !($element instanceof \Zend\Form\Element\Hidden)
  96. && !($element instanceof \Zend\Form\Element\Csrf)) {
  97. $controlGroupHelper = $this->getControlGroupHelper();
  98. $controlGroupOpen = $controlGroupHelper->openTag($element);
  99. $controlGroupClose = $controlGroupHelper->closeTag();
  100. $controlsHelper = $this->getControlsHelper();
  101. $controlsOpen = $controlsHelper->openTag($element);
  102. $controlsClose = $controlsHelper->closeTag();
  103. $hint = $hintHelper->render($element);
  104. $description = $descriptionHelper->render($element);
  105. if ($renderErrors) {
  106. $elementErrors = $elementErrorsHelper->render($element);
  107. } else {
  108. $elementErrors = '';
  109. }
  110. } else {
  111. $controlGroupOpen = '';
  112. $controlGroupClose = '';
  113. //We need some whitespace between label and element on inline and search forms
  114. $controlsOpen = "\n";
  115. $controlsClose = '';
  116. $hint = '';
  117. $description = '';
  118. $elementErrors = '';
  119. }
  120. if (!empty($label)) {
  121. //Element has a label
  122. $labelHelper = $this->getLabelHelper();
  123. $label = $labelHelper($element, $displayOptions);
  124. }
  125. $markup = $controlGroupOpen
  126. . $label
  127. . $controlsOpen
  128. . $elementString
  129. . $hint
  130. . $description
  131. . $elementErrors
  132. . $controlsClose
  133. . $controlGroupClose;
  134. return $markup;
  135. }
  136. /**
  137. * Invoke helper as a function
  138. * Proxies to {@link render()}.
  139. * @param null|ElementInterface $element
  140. * @param string|null $formType
  141. * @param array $displayOptions
  142. * @param bool $renderErrors
  143. * @return string|FormRowTb
  144. */
  145. public function __invoke(ElementInterface $element = null,
  146. $formType = null,
  147. array $displayOptions = array(),
  148. $renderErrors = true) {
  149. if (!$element) {
  150. return $this;
  151. }
  152. return $this->render($element, $formType, $displayOptions, $renderErrors);
  153. }
  154. /**
  155. * Retrieve the FormLabelTb helper
  156. * @return FormLabelTb
  157. * @throws \Zf2tb\Form\Exception\UnsupportedHelperTypeException
  158. */
  159. protected function getLabelHelper()
  160. {
  161. if (!$this->labelHelper) {
  162. if (method_exists($this->view, 'plugin')) {
  163. $this->labelHelper = $this->view->plugin('form_label_tb');
  164. }
  165. if (!$this->labelHelper instanceof FormLabelTb) {
  166. throw new UnsupportedHelperTypeException('Label helper (FormLabelTb) unavailable or unsupported type.');
  167. }
  168. }
  169. return $this->labelHelper;
  170. }
  171. /**
  172. * Retrieve the FormElementTb helper
  173. * @return FormElementTb
  174. * @throws \Zf2tb\Form\Exception\UnsupportedHelperTypeException
  175. */
  176. protected function getElementHelper()
  177. {
  178. if (!$this->elementHelper) {
  179. if (method_exists($this->view, 'plugin')) {
  180. $this->elementHelper = $this->view->plugin('form_element_tb');
  181. }
  182. if (!$this->elementHelper instanceof FormElementTb) {
  183. throw new UnsupportedHelperTypeException('Element helper (FormElementTb) unavailable or unsupported type.');
  184. }
  185. }
  186. return $this->elementHelper;
  187. }
  188. /**
  189. * Retrieve the FormElementErrorsTb helper
  190. * @return FormElementErrorsTb
  191. * @throws \Zf2tb\Form\Exception\UnsupportedHelperTypeException
  192. */
  193. protected function getElementErrorsHelper()
  194. {
  195. if (!$this->elementErrorsHelper) {
  196. if (method_exists($this->view, 'plugin')) {
  197. $this->elementErrorsHelper = $this->view->plugin('form_element_errors_tb');
  198. }
  199. if (!$this->elementErrorsHelper instanceof FormElementErrorsTb) {
  200. throw new UnsupportedHelperTypeException('Element errors helper (FormElementErrorsTb) unavailable or unsupported type.');
  201. }
  202. }
  203. return $this->elementErrorsHelper;
  204. }
  205. /**
  206. * Retrieve the FormHintTb helper
  207. * @return FormHintTb
  208. * @throws \Zf2tb\Form\Exception\UnsupportedHelperTypeException
  209. */
  210. protected function getHintHelper()
  211. {
  212. if (!$this->hintHelper) {
  213. if (method_exists($this->view, 'plugin')) {
  214. $this->hintHelper = $this->view->plugin('form_hint_tb');
  215. }
  216. if (!$this->hintHelper instanceof FormHintTb) {
  217. throw new UnsupportedHelperTypeException('Hint helper (FormHintTb) unavailable or unsupported type.');
  218. }
  219. }
  220. return $this->hintHelper;
  221. }
  222. /**
  223. * Retrieve the FormDescriptionTb helper
  224. * @return FormDescriptionTb
  225. * @throws \Zf2tb\Form\Exception\UnsupportedHelperTypeException
  226. */
  227. protected function getDescriptionHelper()
  228. {
  229. if (!$this->descriptionHelper) {
  230. if (method_exists($this->view, 'plugin')) {
  231. $this->descriptionHelper = $this->view->plugin('form_description_tb');
  232. }
  233. if (!$this->descriptionHelper instanceof FormDescriptionTb) {
  234. throw new UnsupportedHelperTypeException('Description helper (FormDescriptionTb) unavailable or unsupported type.');
  235. }
  236. }
  237. return $this->descriptionHelper;
  238. }
  239. /**
  240. * Retrieve the FormControlGroupTb helper
  241. * @return FormControlGroupTb
  242. * @throws \Zf2tb\Form\Exception\UnsupportedHelperTypeException
  243. */
  244. protected function getControlGroupHelper()
  245. {
  246. if (!$this->controlGroupHelper) {
  247. if (method_exists($this->view, 'plugin')) {
  248. $this->controlGroupHelper = $this->view->plugin('form_control_group_tb');
  249. }
  250. if (!$this->controlGroupHelper instanceof FormControlGroupTb) {
  251. throw new UnsupportedHelperTypeException('Control group helper (FormControlGroupTb) unavailable or unsupported type.');
  252. }
  253. }
  254. return $this->controlGroupHelper;
  255. }
  256. /**
  257. * Retrieve the FormControlsTb helper
  258. * @return FormControlsTb
  259. * @throws \Zf2tb\Form\Exception\UnsupportedHelperTypeException
  260. */
  261. protected function getControlsHelper()
  262. {
  263. if (!$this->controlsHelper) {
  264. if (method_exists($this->view, 'plugin')) {
  265. $this->controlsHelper = $this->view->plugin('form_controls_tb');
  266. }
  267. if (!$this->controlsHelper instanceof FormControlsTb) {
  268. throw new UnsupportedHelperTypeException('Controls helper (FormControlsTb) unavailable or unsupported type.');
  269. }
  270. }
  271. return $this->controlsHelper;
  272. }
  273. }