PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/library/XenForo/ViewAdmin/Helper/Option.php

https://github.com/hanguyenhuu/DTUI_201105
PHP | 337 lines | 157 code | 28 blank | 152 comment | 2 complexity | 65679f72545486c3bb3d0b240ee456c3 MD5 | raw file
Possible License(s): LGPL-2.1, GPL-2.0, BSD-3-Clause
  1. <?php
  2. /**
  3. * Helpers for displaying a list of options.
  4. *
  5. * @package XenForo_Options
  6. */
  7. class XenForo_ViewAdmin_Helper_Option
  8. {
  9. /**
  10. * Private constructor. Use statically.
  11. */
  12. private function __construct()
  13. {
  14. }
  15. /**
  16. * Renders a collection of options in the standard way. See {@link renderPreparedOptionHtml()}
  17. * for more specifics on the arguments.
  18. *
  19. * @param XenForo_View $view
  20. * @param array $preparedOptions
  21. * @param boolean $canEdit
  22. * @param string $fieldPrefix
  23. *
  24. * @return array Array of XenForo_Template_Abstract objects
  25. */
  26. public static function renderPreparedOptionsHtml(XenForo_View $view, array $preparedOptions, $canEdit, $fieldPrefix = 'options')
  27. {
  28. $renderedOptions = array();
  29. foreach ($preparedOptions AS $preparedOption)
  30. {
  31. $renderedOptions[] = XenForo_ViewAdmin_Helper_Option::renderPreparedOptionHtml($view, $preparedOption, $canEdit, $fieldPrefix);
  32. }
  33. return $renderedOptions;
  34. }
  35. /**
  36. * Renders a {@link XenForo_Model_Option::preparedOption() prepared option}
  37. * in the standard way. Note that this doesn't actually render the prepared
  38. * template, but the next usage in a string context will.
  39. *
  40. * @param XenForo_View $view View object that this is being called from.
  41. * @param array $preparedOption Prepared option info
  42. * @param boolean $canEdit True if the user should see an "edit" link with the option
  43. * @param string $fieldPrefix Prefix for the name of the field the options will be written into. Must be a-z0-9_ only.
  44. *
  45. * @return XenForo_Template_Abstract Yet-to-be-rendered template
  46. */
  47. public static function renderPreparedOptionHtml(XenForo_View $view, array $preparedOption, $canEdit, $fieldPrefix = 'options')
  48. {
  49. switch ($preparedOption['edit_format'])
  50. {
  51. case 'textbox': $callbackMethod = '_renderTextBoxOptionHtml'; break;
  52. case 'spinbox': $callbackMethod = '_renderSpinBoxOptionHtml'; break;
  53. case 'onoff': $callbackMethod = '_renderOnOffOptionHtml'; break;
  54. case 'radio': $callbackMethod = '_renderRadioOptionHtml'; break;
  55. case 'select': $callbackMethod = '_renderSelectOptionHtml'; break;
  56. case 'checkbox': $callbackMethod = '_renderCheckBoxOptionHtml'; break;
  57. case 'template': $callbackMethod = '_renderTemplateOptionHtml'; break;
  58. case 'callback': $callbackMethod = '_renderCallbackOptionHtml'; break;
  59. default:
  60. return self::_renderInvalidOptionHtml($view, $preparedOption, $canEdit);
  61. }
  62. $preparedOption['formatParams'] = self::_replacePhrasedText($preparedOption['formatParams']);
  63. return self::$callbackMethod($view, $fieldPrefix, $preparedOption, $canEdit);
  64. }
  65. /**
  66. * Renders a text box option.
  67. *
  68. * @param XenForo_View $view View object
  69. * @param string $fieldPrefix Prefix for the HTML form field name
  70. * @param array $preparedOption Prepared option info
  71. * @param boolean $canEdit True if an "edit" link should appear
  72. *
  73. * @return XenForo_Template_Abstract Template object
  74. */
  75. protected static function _renderTextBoxOptionHtml(XenForo_View $view, $fieldPrefix, array $preparedOption, $canEdit)
  76. {
  77. return self::renderOptionTemplateInternal('option_list_option_textbox',
  78. $view, $fieldPrefix, $preparedOption, $canEdit
  79. );
  80. }
  81. /**
  82. * Renders a spin box option.
  83. *
  84. * @param XenForo_View $view View object
  85. * @param string $fieldPrefix Prefix for the HTML form field name
  86. * @param array $preparedOption Prepared option info
  87. * @param boolean $canEdit True if an "edit" link should appear
  88. *
  89. * @return XenForo_Template_Abstract Template object
  90. */
  91. protected static function _renderSpinBoxOptionHtml(XenForo_View $view, $fieldPrefix, array $preparedOption, $canEdit)
  92. {
  93. return self::renderOptionTemplateInternal('option_list_option_spinbox',
  94. $view, $fieldPrefix, $preparedOption, $canEdit
  95. );
  96. }
  97. /**
  98. * Renders a single on-off check box option.
  99. *
  100. * @param XenForo_View $view View object
  101. * @param string $fieldPrefix Prefix for the HTML form field name
  102. * @param array $preparedOption Prepared option info
  103. * @param boolean $canEdit True if an "edit" link should appear
  104. *
  105. * @return XenForo_Template_Abstract Template object
  106. */
  107. protected static function _renderOnOffOptionHtml(XenForo_View $view, $fieldPrefix, array $preparedOption, $canEdit)
  108. {
  109. return self::renderOptionTemplateInternal('option_list_option_onoff',
  110. $view, $fieldPrefix, $preparedOption, $canEdit
  111. );
  112. }
  113. /**
  114. * Renders a radio option.
  115. *
  116. * @param XenForo_View $view View object
  117. * @param string $fieldPrefix Prefix for the HTML form field name
  118. * @param array $preparedOption Prepared option info
  119. * @param boolean $canEdit True if an "edit" link should appear
  120. *
  121. * @return XenForo_Template_Abstract Template object
  122. */
  123. protected static function _renderRadioOptionHtml(XenForo_View $view, $fieldPrefix, array $preparedOption, $canEdit)
  124. {
  125. return self::renderOptionTemplateInternal('option_list_option_radio',
  126. $view, $fieldPrefix, $preparedOption, $canEdit
  127. );
  128. }
  129. /**
  130. * Renders a select option.
  131. *
  132. * @param XenForo_View $view View object
  133. * @param string $fieldPrefix Prefix for the HTML form field name
  134. * @param array $preparedOption Prepared option info
  135. * @param boolean $canEdit True if an "edit" link should appear
  136. *
  137. * @return XenForo_Template_Abstract Template object
  138. */
  139. protected static function _renderSelectOptionHtml(XenForo_View $view, $fieldPrefix, array $preparedOption, $canEdit)
  140. {
  141. return self::renderOptionTemplateInternal('option_list_option_select',
  142. $view, $fieldPrefix, $preparedOption, $canEdit
  143. );
  144. }
  145. /**
  146. * Prepares to display a multi-choice option (checkbox) by manipulating
  147. * the formatting params into the expected format. They come out in
  148. * [name] => selected format. This is manipulated to maintain a checkbox
  149. * output that will keep them this way.
  150. *
  151. * @param string $fieldPrefix HTML form field prefix
  152. * @param array $preparedOption Prepared option info
  153. *
  154. * @return array Updated format params
  155. */
  156. public static function prepareMultiChoiceOptions($fieldPrefix, array $preparedOption)
  157. {
  158. $formatParams = array();
  159. $selected = $preparedOption['option_value'];
  160. foreach ($preparedOption['formatParams'] AS $name => $label)
  161. {
  162. $formatParams[] = array(
  163. 'name' => htmlspecialchars($fieldPrefix . "[$preparedOption[option_id]][$name]"),
  164. 'label' => $label,
  165. 'selected' => !empty($selected[$name])
  166. );
  167. }
  168. return $formatParams;
  169. }
  170. /**
  171. * Renders a check box option.
  172. *
  173. * @param XenForo_View $view View object
  174. * @param string $fieldPrefix Prefix for the HTML form field name
  175. * @param array $preparedOption Prepared option info
  176. * @param boolean $canEdit True if an "edit" link should appear
  177. *
  178. * @return XenForo_Template_Abstract Template object
  179. */
  180. protected static function _renderCheckBoxOptionHtml(XenForo_View $view, $fieldPrefix, array $preparedOption, $canEdit)
  181. {
  182. $preparedOption['formatParams'] = self::prepareMultiChoiceOptions($fieldPrefix, $preparedOption);
  183. return self::renderOptionTemplateInternal('option_list_option_checkbox',
  184. $view, $fieldPrefix, $preparedOption, $canEdit
  185. );
  186. }
  187. /**
  188. * Replaces {xen:phrase x} references in a formatting params list for an option.
  189. *
  190. * @param array $formatParams List of format params ([name] => label string)
  191. *
  192. * @return array Format params with phrases replaced
  193. */
  194. protected static function _replacePhrasedText(array $formatParams)
  195. {
  196. foreach ($formatParams AS $name => &$label)
  197. {
  198. $label = preg_replace_callback(
  199. '#\{xen:phrase ("|\'|)([a-z0-9-_]+)\\1\}#i',
  200. array('self', '_replacePhrasedTextCallback'),
  201. $label
  202. );
  203. }
  204. return $formatParams;
  205. }
  206. protected static function _replacePhrasedTextCallback(array $match)
  207. {
  208. // This will cause extra queries, but it shouldn't be a particularly big deal. It's pretty rare.
  209. $phrase = new XenForo_Phrase($match[2]);
  210. return $phrase->render();
  211. }
  212. /**
  213. * Renders a template-based option.
  214. *
  215. * @param XenForo_View $view View object
  216. * @param string $fieldPrefix Prefix for the HTML form field name
  217. * @param array $preparedOption Prepared option info
  218. * @param boolean $canEdit True if an "edit" link should appear
  219. *
  220. * @return XenForo_Template_Abstract Template object
  221. */
  222. protected static function _renderTemplateOptionHtml(XenForo_View $view, $fieldPrefix, array $preparedOption, $canEdit)
  223. {
  224. return self::renderOptionTemplateInternal($preparedOption['formatParams']['template'],
  225. $view, $fieldPrefix, $preparedOption, $canEdit
  226. );
  227. }
  228. /**
  229. * Internal function to prepare and render a generic option template.
  230. *
  231. * @param string $template Name of the template that should be rendered
  232. * @param XenForo_View $view View object
  233. * @param string $fieldPrefix Prefix for the HTML form field name
  234. * @param array $preparedOption Prepared option info
  235. * @param boolean $canEdit True if an "edit" link should appear
  236. *
  237. * @return XenForo_Template_Abstract Template object
  238. */
  239. public static function renderOptionTemplateInternal($template, XenForo_View $view, $fieldPrefix, array $preparedOption, $canEdit)
  240. {
  241. $editLink = $view->createTemplateObject('option_list_option_editlink', array(
  242. 'preparedOption' => $preparedOption,
  243. 'canEditOptionDefinition' => $canEdit
  244. ));
  245. return $view->createTemplateObject($template, array(
  246. 'fieldPrefix' => $fieldPrefix,
  247. 'listedFieldName' => $fieldPrefix . '_listed[]',
  248. 'preparedOption' => $preparedOption,
  249. 'value' => isset($preparedOption['option_value']) ? $preparedOption['option_value'] : '',
  250. 'formatParams' => $preparedOption['formatParams'],
  251. 'editLink' => $editLink
  252. ));
  253. }
  254. /**
  255. * Renders a callback-based option. The callback is responsible for all processing
  256. * and layout.
  257. *
  258. * @param XenForo_View $view View object
  259. * @param string $fieldPrefix Prefix for the HTML form field name
  260. * @param array $preparedOption Prepared option info
  261. * @param boolean $canEdit True if an "edit" link should appear
  262. *
  263. * @return XenForo_Template_Abstract Template object
  264. */
  265. protected static function _renderCallbackOptionHtml(XenForo_View $view, $fieldPrefix, array $preparedOption, $canEdit)
  266. {
  267. $callback = array(
  268. (empty($preparedOption['formatParams']['class']) ? '(undefined)' : $preparedOption['formatParams']['class']),
  269. (empty($preparedOption['formatParams']['method']) ? '(undefined)' : $preparedOption['formatParams']['method']),
  270. );
  271. if (is_callable($callback))
  272. {
  273. return call_user_func($callback, $view, $fieldPrefix, $preparedOption, $canEdit);
  274. }
  275. else
  276. {
  277. // something went wrong
  278. $editLink = $view->createTemplateObject('option_list_option_editlink', array(
  279. 'preparedOption' => $preparedOption,
  280. 'canEditOptionDefinition' => $canEdit
  281. ));
  282. return $view->createTemplateObject('option_list_option_invalid_callback', array(
  283. 'callbackClass' => $callback[0],
  284. 'callbackMethod' => $callback[1],
  285. 'preparedOption' => $preparedOption,
  286. 'value' => isset($preparedOption['option_value']) ? $preparedOption['option_value'] : '',
  287. 'canEditOptionDefinition' => $canEdit,
  288. 'editLink' => $editLink
  289. ));
  290. }
  291. }
  292. /**
  293. * Renders HTML for an invalid option type. Legitimately, this should never happen. :)
  294. *
  295. * @param XenForo_View $view View object
  296. * @param array $preparedOption Prepared option info
  297. * @param boolean $canEdit True if an "edit" link should appear
  298. *
  299. * @return XenForo_Template_Abstract Template object
  300. */
  301. protected static function _renderInvalidOptionHtml(XenForo_View $view, array $preparedOption, $canEdit)
  302. {
  303. return $view->createTemplateObject('option_list_option_invalid', array(
  304. 'preparedOption' => $preparedOption,
  305. 'value' => isset($preparedOption['option_value']) ? $preparedOption['option_value'] : '',
  306. 'canEditOptionDefinition' => $canEdit
  307. ));
  308. }
  309. }