| // | Adam Daniel | // | Bertrand Mansion | // +----------------------------------------------------------------------+ // // $Id$ require_once('HTML/QuickForm/Renderer.php'); /** * A concrete renderer for HTML_QuickForm, * based on QuickForm 2.x built-in one * * @access public */ class HTML_QuickForm_Renderer_Default extends HTML_QuickForm_Renderer { /** * The HTML of the form * @var string * @access private */ var $_html; /** * Header Template string * @var string * @access private */ var $_headerTemplate = "\n\t\n\t\t{header}\n\t"; /** * Element template string * @var string * @access private */ var $_elementTemplate = "\n\t\n\t\t*{label}\n\t\t{error}
\t{element}\n\t"; /** * Form template string * @var string * @access private */ var $_formTemplate = "\n\n
\n{hidden}\n{content}\n
\n
\n"; /** * Required Note template string * @var string * @access private */ var $_requiredNoteTemplate = "\n\t\n\t\t\n\t{requiredNote}\n\t"; /** * Array containing the templates for customised elements * @var array * @access private */ var $_templates = array(); /** * Array containing the templates for group wraps. * * These templates are wrapped around group elements and groups' own * templates wrap around them. This is set by setGroupTemplate(). * * @var array * @access private */ var $_groupWraps = array(); /** * Array containing the templates for elements within groups * @var array * @access private */ var $_groupTemplates = array(); /** * True if we are inside a group * @var bool * @access private */ var $_inGroup = false; /** * Array with HTML generated for group elements * @var array * @access private */ var $_groupElements = array(); /** * Template for an element inside a group * @var string * @access private */ var $_groupElementTemplate = ''; /** * HTML that wraps around the group elements * @var string * @access private */ var $_groupWrap = ''; /** * HTML for the current group * @var string * @access private */ var $_groupTemplate = ''; /** * Collected HTML of the hidden fields * @var string * @access private */ var $_hiddenHtml = ''; /** * Constructor * * @access public */ function HTML_QuickForm_Renderer_Default() { $this->HTML_QuickForm_Renderer(); } // end constructor /** * returns the HTML generated for the form * * @access public * @return string */ function toHtml() { // _hiddenHtml is cleared in finishForm(), so this only matters when // finishForm() was not called (e.g. group::toHtml(), bug #3511) return $this->_hiddenHtml . $this->_html; } // end func toHtml /** * Called when visiting a form, before processing any form elements * * @param object An HTML_QuickForm object being visited * @access public * @return void */ function startForm(&$form) { $this->_html = ''; $this->_hiddenHtml = ''; } // end func startForm /** * Called when visiting a form, after processing all form elements * Adds required note, form attributes, validation javascript and form content. * * @param object An HTML_QuickForm object being visited * @access public * @return void */ function finishForm(&$form) { // add a required note, if one is needed if (!empty($form->_required) && !$form->_freezeAll) { $this->_html .= str_replace('{requiredNote}', $form->getRequiredNote(), $this->_requiredNoteTemplate); } // add form attributes and content $html = str_replace('{attributes}', $form->getAttributes(true), $this->_formTemplate); if (strpos($this->_formTemplate, '{hidden}')) { $html = str_replace('{hidden}', $this->_hiddenHtml, $html); } else { $this->_html .= $this->_hiddenHtml; } $this->_hiddenHtml = ''; $this->_html = str_replace('{content}', $this->_html, $html); // add a validation script if ('' != ($script = $form->getValidationScript())) { $this->_html = $script . "\n" . $this->_html; } } // end func finishForm /** * Called when visiting a header element * * @param object An HTML_QuickForm_header element being visited * @access public * @return void */ function renderHeader(&$header) { $name = $header->getName(); if (!empty($name) && isset($this->_templates[$name])) { $this->_html .= str_replace('{header}', $header->toHtml(), $this->_templates[$name]); } else { $this->_html .= str_replace('{header}', $header->toHtml(), $this->_headerTemplate); } } // end func renderHeader /** * Helper method for renderElement * * @param string Element name * @param mixed Element label (if using an array of labels, you should set the appropriate template) * @param bool Whether an element is required * @param string Error message associated with the element * @access private * @see renderElement() * @return string Html for element */ function _prepareTemplate($name, $label, $required, $error) { if (is_array($label)) { $nameLabel = array_shift($label); } else { $nameLabel = $label; } if (isset($this->_templates[$name])) { $html = str_replace('{label}', $nameLabel, $this->_templates[$name]); } else { $html = str_replace('{label}', $nameLabel, $this->_elementTemplate); } if ($required) { $html = str_replace('', '', $html); $html = str_replace('', '', $html); } else { $html = preg_replace("/([ \t\n\r]*)?(\s|\S)*([ \t\n\r]*)?/iU", '', $html); } if (isset($error)) { $html = str_replace('{error}', $error, $html); $html = str_replace('', '', $html); $html = str_replace('', '', $html); } else { $html = preg_replace("/([ \t\n\r]*)?(\s|\S)*([ \t\n\r]*)?/iU", '', $html); } if (is_array($label)) { foreach($label as $key => $text) { $key = is_int($key)? $key + 2: $key; $html = str_replace("{label_{$key}}", $text, $html); $html = str_replace("", '', $html); $html = str_replace("", '', $html); } } if (strpos($html, '{label_')) { $html = preg_replace('/\s*.*\s*/i', '', $html); } return $html; } // end func _prepareTemplate /** * Renders an element Html * Called when visiting an element * * @param object An HTML_QuickForm_element object being visited * @param bool Whether an element is required * @param string An error message associated with an element * @access public * @return void */ function renderElement(&$element, $required, $error) { if (!$this->_inGroup) { $html = $this->_prepareTemplate($element->getName(), $element->getLabel(), $required, $error); $this->_html .= str_replace('{element}', $element->toHtml(), $html); } elseif (!empty($this->_groupElementTemplate)) { $html = str_replace('{label}', $element->getLabel(), $this->_groupElementTemplate); if ($required) { $html = str_replace('', '', $html); $html = str_replace('', '', $html); } else { $html = preg_replace("/([ \t\n\r]*)?(\s|\S)*([ \t\n\r]*)?/iU", '', $html); } $this->_groupElements[] = str_replace('{element}', $element->toHtml(), $html); } else { $this->_groupElements[] = $element->toHtml(); } } // end func renderElement /** * Renders an hidden element * Called when visiting a hidden element * * @param object An HTML_QuickForm_hidden object being visited * @access public * @return void */ function renderHidden(&$element) { $this->_hiddenHtml .= $element->toHtml() . "\n"; } // end func renderHidden /** * Called when visiting a raw HTML/text pseudo-element * * @param object An HTML_QuickForm_html element being visited * @access public * @return void */ function renderHtml(&$data) { $this->_html .= $data->toHtml(); } // end func renderHtml /** * Called when visiting a group, before processing any group elements * * @param object An HTML_QuickForm_group object being visited * @param bool Whether a group is required * @param string An error message associated with a group * @access public * @return void */ function startGroup(&$group, $required, $error) { $name = $group->getName(); $this->_groupTemplate = $this->_prepareTemplate($name, $group->getLabel(), $required, $error); $this->_groupElementTemplate = empty($this->_groupTemplates[$name])? '': $this->_groupTemplates[$name]; $this->_groupWrap = empty($this->_groupWraps[$name])? '': $this->_groupWraps[$name]; $this->_groupElements = array(); $this->_inGroup = true; } // end func startGroup /** * Called when visiting a group, after processing all group elements * * @param object An HTML_QuickForm_group object being visited * @access public * @return void */ function finishGroup(&$group) { $separator = $group->_separator; if (is_array($separator)) { $count = count($separator); $html = ''; for ($i = 0; $i < count($this->_groupElements); $i++) { $html .= (0 == $i? '': $separator[($i - 1) % $count]) . $this->_groupElements[$i]; } } else { if (is_null($separator)) { $separator = ' '; } $html = implode((string)$separator, $this->_groupElements); } if (!empty($this->_groupWrap)) { $html = str_replace('{content}', $html, $this->_groupWrap); } $this->_html .= str_replace('{element}', $html, $this->_groupTemplate); $this->_inGroup = false; } // end func finishGroup /** * Sets element template * * @param string The HTML surrounding an element * @param string (optional) Name of the element to apply template for * @access public * @return void */ function setElementTemplate($html, $element = null) { if (is_null($element)) { $this->_elementTemplate = $html; } else { $this->_templates[$element] = $html; } } // end func setElementTemplate /** * Sets template for a group wrapper * * This template is contained within a group-as-element template * set via setTemplate() and contains group's element templates, set * via setGroupElementTemplate() * * @param string The HTML surrounding group elements * @param string Name of the group to apply template for * @access public * @return void */ function setGroupTemplate($html, $group) { $this->_groupWraps[$group] = $html; } // end func setGroupTemplate /** * Sets element template for elements within a group * * @param string The HTML surrounding an element * @param string Name of the group to apply template for * @access public * @return void */ function setGroupElementTemplate($html, $group) { $this->_groupTemplates[$group] = $html; } // end func setGroupElementTemplate /** * Sets header template * * @param string The HTML surrounding the header * @access public * @return void */ function setHeaderTemplate($html) { $this->_headerTemplate = $html; } // end func setHeaderTemplate /** * Sets form template * * @param string The HTML surrounding the form tags * @access public * @return void */ function setFormTemplate($html) { $this->_formTemplate = $html; } // end func setFormTemplate /** * Sets the note indicating required fields template * * @param string The HTML surrounding the required note * @access public * @return void */ function setRequiredNoteTemplate($html) { $this->_requiredNoteTemplate = $html; } // end func setRequiredNoteTemplate /** * Clears all the HTML out of the templates that surround notes, elements, etc. * Useful when you want to use addData() to create a completely custom form look * * @access public * @return void */ function clearAllTemplates() { $this->setElementTemplate('{element}'); $this->setFormTemplate("\n\t{content}\n\t\n"); $this->setRequiredNoteTemplate(''); $this->_templates = array(); } // end func clearAllTemplates } // end class HTML_QuickForm_Renderer_Default ?>