See Release Notes
Long Term Support Release
1 <?php 2 /* vim: set expandtab tabstop=4 shiftwidth=4: */ 3 // +----------------------------------------------------------------------+ 4 // | PHP version 4.0 | 5 // +----------------------------------------------------------------------+ 6 // | Copyright (c) 1997-2003 The PHP Group | 7 // +----------------------------------------------------------------------+ 8 // | This source file is subject to version 2.0 of the PHP license, | 9 // | that is bundled with this package in the file LICENSE, and is | 10 // | available at through the world-wide-web at | 11 // | http://www.php.net/license/2_02.txt. | 12 // | If you did not receive a copy of the PHP license and are unable to | 13 // | obtain it through the world-wide-web, please send a note to | 14 // | license@php.net so we can mail you a copy immediately. | 15 // +----------------------------------------------------------------------+ 16 // | Authors: Alexey Borzov <borz_off@cs.msu.su> | 17 // | Adam Daniel <adaniel1@eesus.jnj.com> | 18 // | Bertrand Mansion <bmansion@mamasam.com> | 19 // +----------------------------------------------------------------------+ 20 // 21 // $Id$ 22 23 require_once('HTML/QuickForm/Renderer.php'); 24 25 /** 26 * A concrete renderer for HTML_QuickForm, 27 * based on QuickForm 2.x built-in one 28 * 29 * @access public 30 */ 31 class HTML_QuickForm_Renderer_Default extends HTML_QuickForm_Renderer 32 { 33 /** 34 * The HTML of the form 35 * @var string 36 * @access private 37 */ 38 var $_html; 39 40 /** 41 * Header Template string 42 * @var string 43 * @access private 44 */ 45 var $_headerTemplate = 46 "\n\t<tr>\n\t\t<td style=\"white-space: nowrap; background-color: #CCCCCC;\" align=\"left\" valign=\"top\" colspan=\"2\"><b>{header}</b></td>\n\t</tr>"; 47 48 /** 49 * Element template string 50 * @var string 51 * @access private 52 */ 53 var $_elementTemplate = 54 "\n\t<tr>\n\t\t<td align=\"right\" valign=\"top\"><!-- BEGIN required --><span style=\"color: #ff0000\">*</span><!-- END required --><b>{label}</b></td>\n\t\t<td valign=\"top\" align=\"left\"><!-- BEGIN error --><span style=\"color: #ff0000\">{error}</span><br /><!-- END error -->\t{element}</td>\n\t</tr>"; 55 56 /** 57 * Form template string 58 * @var string 59 * @access private 60 */ 61 var $_formTemplate = 62 "\n<form{attributes}>\n<div>\n{hidden}<table border=\"0\">\n{content}\n</table>\n</div>\n</form>"; 63 64 /** 65 * Required Note template string 66 * @var string 67 * @access private 68 */ 69 var $_requiredNoteTemplate = 70 "\n\t<tr>\n\t\t<td></td>\n\t<td align=\"left\" valign=\"top\">{requiredNote}</td>\n\t</tr>"; 71 72 /** 73 * Array containing the templates for customised elements 74 * @var array 75 * @access private 76 */ 77 var $_templates = array(); 78 79 /** 80 * Array containing the templates for group wraps. 81 * 82 * These templates are wrapped around group elements and groups' own 83 * templates wrap around them. This is set by setGroupTemplate(). 84 * 85 * @var array 86 * @access private 87 */ 88 var $_groupWraps = array(); 89 90 /** 91 * Array containing the templates for elements within groups 92 * @var array 93 * @access private 94 */ 95 var $_groupTemplates = array(); 96 97 /** 98 * True if we are inside a group 99 * @var bool 100 * @access private 101 */ 102 var $_inGroup = false; 103 104 /** 105 * Array with HTML generated for group elements 106 * @var array 107 * @access private 108 */ 109 var $_groupElements = array(); 110 111 /** 112 * Template for an element inside a group 113 * @var string 114 * @access private 115 */ 116 var $_groupElementTemplate = ''; 117 118 /** 119 * HTML that wraps around the group elements 120 * @var string 121 * @access private 122 */ 123 var $_groupWrap = ''; 124 125 /** 126 * HTML for the current group 127 * @var string 128 * @access private 129 */ 130 var $_groupTemplate = ''; 131 132 /** 133 * Collected HTML of the hidden fields 134 * @var string 135 * @access private 136 */ 137 var $_hiddenHtml = ''; 138 139 /** 140 * Constructor 141 * 142 * @access public 143 */ 144 public function __construct() { 145 parent::__construct(); 146 } // end constructor 147 148 /** 149 * Old syntax of class constructor. Deprecated in PHP7. 150 * 151 * @deprecated since Moodle 3.1 152 */ 153 public function HTML_QuickForm_Renderer_Default() { 154 debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); 155 self::__construct(); 156 } // end constructor 157 158 /** 159 * returns the HTML generated for the form 160 * 161 * @access public 162 * @return string 163 */ 164 function toHtml() 165 { 166 // _hiddenHtml is cleared in finishForm(), so this only matters when 167 // finishForm() was not called (e.g. group::toHtml(), bug #3511) 168 return $this->_hiddenHtml . $this->_html; 169 } // end func toHtml 170 171 /** 172 * Called when visiting a form, before processing any form elements 173 * 174 * @param object An HTML_QuickForm object being visited 175 * @access public 176 * @return void 177 */ 178 function startForm(&$form) 179 { 180 $this->_html = ''; 181 $this->_hiddenHtml = ''; 182 } // end func startForm 183 184 /** 185 * Called when visiting a form, after processing all form elements 186 * Adds required note, form attributes, validation javascript and form content. 187 * 188 * @param object An HTML_QuickForm object being visited 189 * @access public 190 * @return void 191 */ 192 function finishForm(&$form) 193 { 194 // add a required note, if one is needed 195 if (!empty($form->_required) && !$form->_freezeAll) { 196 $this->_html .= str_replace('{requiredNote}', $form->getRequiredNote(), $this->_requiredNoteTemplate); 197 } 198 // add form attributes and content 199 $html = str_replace('{attributes}', $form->getAttributes(true), $this->_formTemplate); 200 if (strpos($this->_formTemplate, '{hidden}')) { 201 $html = str_replace('{hidden}', $this->_hiddenHtml, $html); 202 } else { 203 $this->_html .= $this->_hiddenHtml; 204 } 205 $this->_hiddenHtml = ''; 206 $this->_html = str_replace('{content}', $this->_html, $html); 207 // add a validation script 208 if ('' != ($script = $form->getValidationScript())) { 209 $this->_html = $script . "\n" . $this->_html; 210 } 211 } // end func finishForm 212 213 /** 214 * Called when visiting a header element 215 * 216 * @param object An HTML_QuickForm_header element being visited 217 * @access public 218 * @return void 219 */ 220 function renderHeader(&$header) 221 { 222 $name = $header->getName(); 223 if (!empty($name) && isset($this->_templates[$name])) { 224 $this->_html .= str_replace('{header}', $header->toHtml(), $this->_templates[$name]); 225 } else { 226 $this->_html .= str_replace('{header}', $header->toHtml(), $this->_headerTemplate); 227 } 228 } // end func renderHeader 229 230 /** 231 * Helper method for renderElement 232 * 233 * @param string Element name 234 * @param mixed Element label (if using an array of labels, you should set the appropriate template) 235 * @param bool Whether an element is required 236 * @param string Error message associated with the element 237 * @access private 238 * @see renderElement() 239 * @return string Html for element 240 */ 241 function _prepareTemplate($name, $label, $required, $error) 242 { 243 if (is_array($label)) { 244 $nameLabel = array_shift($label); 245 } else { 246 $nameLabel = $label; 247 } 248 if (isset($this->_templates[$name])) { 249 $html = str_replace('{label}', $nameLabel, $this->_templates[$name]); 250 } else { 251 $html = str_replace('{label}', $nameLabel, $this->_elementTemplate); 252 } 253 if ($required) { 254 $html = str_replace('<!-- BEGIN required -->', '', $html); 255 $html = str_replace('<!-- END required -->', '', $html); 256 } else { 257 $html = preg_replace("/([ \t\n\r]*)?<!-- BEGIN required -->(\s|\S)*<!-- END required -->([ \t\n\r]*)?/iU", '', $html); 258 } 259 if (isset($error)) { 260 $html = str_replace('{error}', $error, $html); 261 $html = str_replace('<!-- BEGIN error -->', '', $html); 262 $html = str_replace('<!-- END error -->', '', $html); 263 } else { 264 $html = preg_replace("/([ \t\n\r]*)?<!-- BEGIN error -->(\s|\S)*<!-- END error -->([ \t\n\r]*)?/iU", '', $html); 265 } 266 if (is_array($label)) { 267 foreach($label as $key => $text) { 268 $key = is_int($key)? $key + 2: $key; 269 $html = str_replace("{label_{$key}}", $text, $html); 270 $html = str_replace("<!-- BEGIN label_{$key} -->", '', $html); 271 $html = str_replace("<!-- END label_{$key} -->", '', $html); 272 } 273 } 274 if (strpos($html, '{label_')) { 275 $html = preg_replace('/\s*<!-- BEGIN label_(\S+) -->.*<!-- END label_\1 -->\s*/i', '', $html); 276 } 277 return $html; 278 } // end func _prepareTemplate 279 280 /** 281 * Renders an element Html 282 * Called when visiting an element 283 * 284 * @param object An HTML_QuickForm_element object being visited 285 * @param bool Whether an element is required 286 * @param string An error message associated with an element 287 * @access public 288 * @return void 289 */ 290 function renderElement(&$element, $required, $error) 291 { 292 if (!$this->_inGroup) { 293 $html = $this->_prepareTemplate($element->getName(), $element->getLabel(), $required, $error); 294 $this->_html .= str_replace('{element}', $element->toHtml(), $html); 295 296 } elseif (!empty($this->_groupElementTemplate)) { 297 $html = str_replace('{label}', $element->getLabel(), $this->_groupElementTemplate); 298 if ($required) { 299 $html = str_replace('<!-- BEGIN required -->', '', $html); 300 $html = str_replace('<!-- END required -->', '', $html); 301 } else { 302 $html = preg_replace("/([ \t\n\r]*)?<!-- BEGIN required -->(\s|\S)*<!-- END required -->([ \t\n\r]*)?/iU", '', $html); 303 } 304 $this->_groupElements[] = str_replace('{element}', $element->toHtml(), $html); 305 306 } else { 307 $this->_groupElements[] = $element->toHtml(); 308 } 309 } // end func renderElement 310 311 /** 312 * Renders an hidden element 313 * Called when visiting a hidden element 314 * 315 * @param object An HTML_QuickForm_hidden object being visited 316 * @access public 317 * @return void 318 */ 319 function renderHidden(&$element) 320 { 321 $this->_hiddenHtml .= $element->toHtml() . "\n"; 322 } // end func renderHidden 323 324 /** 325 * Called when visiting a raw HTML/text pseudo-element 326 * 327 * @param object An HTML_QuickForm_html element being visited 328 * @access public 329 * @return void 330 */ 331 function renderHtml(&$data) 332 { 333 $this->_html .= $data->toHtml(); 334 } // end func renderHtml 335 336 /** 337 * Called when visiting a group, before processing any group elements 338 * 339 * @param object An HTML_QuickForm_group object being visited 340 * @param bool Whether a group is required 341 * @param string An error message associated with a group 342 * @access public 343 * @return void 344 */ 345 function startGroup(&$group, $required, $error) 346 { 347 $name = $group->getName(); 348 $this->_groupTemplate = $this->_prepareTemplate($name, $group->getLabel(), $required, $error); 349 $this->_groupElementTemplate = empty($this->_groupTemplates[$name])? '': $this->_groupTemplates[$name]; 350 $this->_groupWrap = empty($this->_groupWraps[$name])? '': $this->_groupWraps[$name]; 351 $this->_groupElements = array(); 352 $this->_inGroup = true; 353 } // end func startGroup 354 355 /** 356 * Called when visiting a group, after processing all group elements 357 * 358 * @param object An HTML_QuickForm_group object being visited 359 * @access public 360 * @return void 361 */ 362 function finishGroup(&$group) 363 { 364 $separator = $group->_separator; 365 if (is_array($separator)) { 366 $count = count($separator); 367 $html = ''; 368 for ($i = 0; $i < count($this->_groupElements); $i++) { 369 $html .= (0 == $i? '': $separator[($i - 1) % $count]) . $this->_groupElements[$i]; 370 } 371 } else { 372 if (is_null($separator)) { 373 $separator = ' '; 374 } 375 $html = implode((string)$separator, $this->_groupElements); 376 } 377 if (!empty($this->_groupWrap)) { 378 $html = str_replace('{content}', $html, $this->_groupWrap); 379 } 380 $this->_html .= str_replace('{element}', $html, $this->_groupTemplate); 381 $this->_inGroup = false; 382 } // end func finishGroup 383 384 /** 385 * Sets element template 386 * 387 * @param string The HTML surrounding an element 388 * @param string (optional) Name of the element to apply template for 389 * @access public 390 * @return void 391 */ 392 function setElementTemplate($html, $element = null) 393 { 394 if (is_null($element)) { 395 $this->_elementTemplate = $html; 396 } else { 397 $this->_templates[$element] = $html; 398 } 399 } // end func setElementTemplate 400 401 402 /** 403 * Sets template for a group wrapper 404 * 405 * This template is contained within a group-as-element template 406 * set via setTemplate() and contains group's element templates, set 407 * via setGroupElementTemplate() 408 * 409 * @param string The HTML surrounding group elements 410 * @param string Name of the group to apply template for 411 * @access public 412 * @return void 413 */ 414 function setGroupTemplate($html, $group) 415 { 416 $this->_groupWraps[$group] = $html; 417 } // end func setGroupTemplate 418 419 /** 420 * Sets element template for elements within a group 421 * 422 * @param string The HTML surrounding an element 423 * @param string Name of the group to apply template for 424 * @access public 425 * @return void 426 */ 427 function setGroupElementTemplate($html, $group) 428 { 429 $this->_groupTemplates[$group] = $html; 430 } // end func setGroupElementTemplate 431 432 /** 433 * Sets header template 434 * 435 * @param string The HTML surrounding the header 436 * @access public 437 * @return void 438 */ 439 function setHeaderTemplate($html) 440 { 441 $this->_headerTemplate = $html; 442 } // end func setHeaderTemplate 443 444 /** 445 * Sets form template 446 * 447 * @param string The HTML surrounding the form tags 448 * @access public 449 * @return void 450 */ 451 function setFormTemplate($html) 452 { 453 $this->_formTemplate = $html; 454 } // end func setFormTemplate 455 456 /** 457 * Sets the note indicating required fields template 458 * 459 * @param string The HTML surrounding the required note 460 * @access public 461 * @return void 462 */ 463 function setRequiredNoteTemplate($html) 464 { 465 $this->_requiredNoteTemplate = $html; 466 } // end func setRequiredNoteTemplate 467 468 /** 469 * Clears all the HTML out of the templates that surround notes, elements, etc. 470 * Useful when you want to use addData() to create a completely custom form look 471 * 472 * @access public 473 * @return void 474 */ 475 function clearAllTemplates() 476 { 477 $this->setElementTemplate('{element}'); 478 $this->setFormTemplate("\n\t<form{attributes}>{content}\n\t</form>\n"); 479 $this->setRequiredNoteTemplate(''); 480 $this->_templates = array(); 481 } // end func clearAllTemplates 482 } // end class HTML_QuickForm_Renderer_Default 483 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body