Rev 1688 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/* vim: set expandtab tabstop=4 shiftwidth=4: */// +----------------------------------------------------------------------+// | PHP version 4.0 |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2003 The PHP Group |// +----------------------------------------------------------------------+// | This source file is subject to version 2.0 of the PHP license, |// | that is bundled with this package in the file LICENSE, and is |// | available at through the world-wide-web at |// | http://www.php.net/license/2_02.txt. |// | If you did not receive a copy of the PHP license and are unable to |// | obtain it through the world-wide-web, please send a note to |// | license@php.net so we can mail you a copy immediately. |// +----------------------------------------------------------------------+// | Author: Bertrand Mansion <bmansion@mamasam.com> |// +----------------------------------------------------------------------+//// $Id: ITStatic.php,v 1.2 2005-09-20 17:01:22 ddelon Exp $require_once('HTML/QuickForm/Renderer.php');/*** A static renderer for HTML_QuickForm compatible* with HTML_Template_IT and HTML_Template_Sigma.** As opposed to the dynamic renderer, this renderer needs* every elements and labels in the form to be specified by* placeholders at the position you want them to be displayed.** @author Bertrand Mansion <bmansion@mamasam.com>* @access public*/class HTML_QuickForm_Renderer_ITStatic extends HTML_QuickForm_Renderer{/*** An HTML_Template_IT or some other API compatible Template instance* @var object*/var $_tpl = null;/*** Rendered form name* @var string*/var $_formName = 'form';/*** The errors that were not shown near concrete fields go here* @var array*/var $_errors = array();/*** Show the block with required note?* @var bool*/var $_showRequired = false;/*** Which group are we currently parsing ?* @var string*/var $_inGroup;/*** Index of the element in its group* @var int*/var $_elementIndex = 0;/*** If elements have been added with the same name* @var array*/var $_duplicateElements = array();/*** How to handle the required tag for required fields* @var string*/var $_required = '{label}<font size="1" color="red">*</font>';/*** How to handle error messages in form validation* @var string*/var $_error = '<font color="red">{error}</font><br />{html}';/*** Collected HTML for hidden elements, if needed* @var string*/var $_hidden = '';/*** Constructor** @param object An HTML_Template_IT or other compatible Template object to use*/function HTML_QuickForm_Renderer_ITStatic(&$tpl){$this->HTML_QuickForm_Renderer();$this->_tpl =& $tpl;} // end constructor/*** 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->_formName = $form->getAttribute('id');if (count($form->_duplicateIndex) > 0) {// Take care of duplicate elementsforeach ($form->_duplicateIndex as $elementName => $indexes) {$this->_duplicateElements[$elementName] = 0;}}} // end func startForm/*** Called when visiting a form, after processing all form elements** @param object An HTML_QuickForm object being visited* @access public* @return void*/function finishForm(&$form){// display errors above formif (!empty($this->_errors) && $this->_tpl->blockExists($this->_formName.'_error_loop')) {foreach ($this->_errors as $error) {$this->_tpl->setVariable($this->_formName.'_error', $error);$this->_tpl->parse($this->_formName.'_error_loop');}}// show required noteif ($this->_showRequired) {$this->_tpl->setVariable($this->_formName.'_required_note', $form->getRequiredNote());}// add hidden elements, if collectedif (!empty($this->_hidden)) {$this->_tpl->setVariable($this->_formName . '_hidden', $this->_hidden);}// assign form attributes$this->_tpl->setVariable($this->_formName.'_attributes', $form->getAttributes(true));// assign javascript validation rules$this->_tpl->setVariable($this->_formName.'_javascript', $form->getValidationScript());} // 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();$varName = $this->_formName.'_header';// Find placeHolderif (!empty($name) && $this->_tpl->placeHolderExists($this->_formName.'_header_'.$name)) {$varName = $this->_formName.'_header_'.$name;}$this->_tpl->setVariable($varName, $header->toHtml());} // end func renderHeader/*** 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){$name = $element->getName();// are we inside a group?if (!empty($this->_inGroup)) {$varName = $this->_formName.'_'.str_replace(array('[', ']'), '_', $name);if (substr($varName, -2) == '__') {// element name is of type : group[]$varName = $this->_inGroup.'_'.$this->_elementIndex.'_';$this->_elementIndex++;}if ($varName != $this->_inGroup) {$varName .= '_' == substr($varName, -1)? '': '_';// element name is of type : group[name]$label = $element->getLabel();$html = $element->toHtml();if ($required && !$element->isFrozen()) {$this->_renderRequired($label, $html);$this->_showRequired = true;}if (!empty($label)) {if (is_array($label)) {foreach ($label as $key => $value) {$this->_tpl->setVariable($varName.'label_'.$key, $value);}} else {$this->_tpl->setVariable($varName.'label', $label);}}$this->_tpl->setVariable($varName.'html', $html);}} else {$name = str_replace(array('[', ']'), array('_', ''), $name);if (isset($this->_duplicateElements[$name])) {// Element is a duplicate$varName = $this->_formName.'_'.$name.'_'.$this->_duplicateElements[$name];$this->_duplicateElements[$name]++;} else {$varName = $this->_formName.'_'.$name;}$label = $element->getLabel();$html = $element->toHtml();if ($required) {$this->_showRequired = true;$this->_renderRequired($label, $html);}if (!empty($error)) {$this->_renderError($label, $html, $error);}if (is_array($label)) {foreach ($label as $key => $value) {$this->_tpl->setVariable($varName.'_label_'.$key, $value);}} else {$this->_tpl->setVariable($varName.'_label', $label);}$this->_tpl->setVariable($varName.'_html', $html);}} // end func renderElement/*** Called when visiting a hidden element** @param object An HTML_QuickForm_hidden object being visited* @access public* @return void*/function renderHidden(&$element){if ($this->_tpl->placeholderExists($this->_formName . '_hidden')) {$this->_hidden .= $element->toHtml();} else {$name = $element->getName();$name = str_replace(array('[', ']'), array('_', ''), $name);$this->_tpl->setVariable($this->_formName.'_'.$name.'_html', $element->toHtml());}} // end func renderHidden/*** 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();$varName = $this->_formName.'_'.$name;$this->_elementIndex = 0;$html = $this->_tpl->placeholderExists($varName.'_html') ? $group->toHtml() : '';$label = $group->getLabel();if ($required) {$this->_renderRequired($label, $html);}if (!empty($error)) {$this->_renderError($label, $html, $error);}if (!empty($html)) {$this->_tpl->setVariable($varName.'_html', $html);} else {// Uses error blocks to set the special groups layout error// <!-- BEGIN form_group_error -->{form_group_error}<!-- END form_group_error -->if (!empty($error)) {if ($this->_tpl->placeholderExists($varName.'_error')) {if ($this->_tpl->blockExists($this->_formName . '_error_block')) {$this->_tpl->setVariable($this->_formName . '_error', $error);$error = $this->_getTplBlock($this->_formName . '_error_block');} elseif (strpos($this->_error, '{html}') !== false || strpos($this->_error, '{label}') !== false) {$error = str_replace('{error}', $error, $this->_error);}}$this->_tpl->setVariable($varName . '_error', $error);array_pop($this->_errors);}}if (is_array($label)) {foreach ($label as $key => $value) {$this->_tpl->setVariable($varName.'_label_'.$key, $value);}} else {$this->_tpl->setVariable($varName.'_label', $label);}$this->_inGroup = $varName;} // 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){$this->_inGroup = '';} // end func finishGroup/*** Sets the way required elements are rendered** You can use {label} or {html} placeholders to let the renderer know where* where the element label or the element html are positionned according to the* required tag. They will be replaced accordingly with the right value.* For example:* <font color="red">*</font>{label}* will put a red star in front of the label if the element is required.** @param string The required element template* @access public* @return void*/function setRequiredTemplate($template){$this->_required = $template;} // end func setRequiredTemplate/*** Sets the way elements with validation errors are rendered** You can use {label} or {html} placeholders to let the renderer know where* where the element label or the element html are positionned according to the* error message. They will be replaced accordingly with the right value.* The error message will replace the {error} place holder.* For example:* <font color="red">{error}</font><br />{html}* will put the error message in red on top of the element html.** If you want all error messages to be output in the main error block, do not specify* {html} nor {label}.** Groups can have special layouts. With this kind of groups, the renderer will need* to know where to place the error message. In this case, use error blocks like:* <!-- BEGIN form_group_error -->{form_group_error}<!-- END form_group_error -->* where you want the error message to appear in the form.** @param string The element error template* @access public* @return void*/function setErrorTemplate($template){$this->_error = $template;} // end func setErrorTemplate/*** Called when an element is required** This method will add the required tag to the element label and/or the element html* such as defined with the method setRequiredTemplate** @param string The element label* @param string The element html rendering* @see setRequiredTemplate()* @access private* @return void*/function _renderRequired(&$label, &$html){if ($this->_tpl->blockExists($tplBlock = $this->_formName . '_required_block')) {if (!empty($label) && $this->_tpl->placeholderExists($this->_formName . '_label', $tplBlock)) {$this->_tpl->setVariable($this->_formName . '_label', is_array($label)? $label[0]: $label);if (is_array($label)) {$label[0] = $this->_getTplBlock($tplBlock);} else {$label = $this->_getTplBlock($tplBlock);}}if (!empty($html) && $this->_tpl->placeholderExists($this->_formName . '_html', $tplBlock)) {$this->_tpl->setVariable($this->_formName . '_html', $html);$html = $this->_getTplBlock($tplBlock);}} else {if (!empty($label) && strpos($this->_required, '{label}') !== false) {if (is_array($label)) {$label[0] = str_replace('{label}', $label[0], $this->_required);} else {$label = str_replace('{label}', $label, $this->_required);}}if (!empty($html) && strpos($this->_required, '{html}') !== false) {$html = str_replace('{html}', $html, $this->_required);}}} // end func _renderRequired/*** Called when an element has a validation error** This method will add the error message to the element label or the element html* such as defined with the method setErrorTemplate. If the error placeholder is not found* in the template, the error will be displayed in the form error block.** @param string The element label* @param string The element html rendering* @param string The element error* @see setErrorTemplate()* @access private* @return void*/function _renderError(&$label, &$html, $error){if ($this->_tpl->blockExists($tplBlock = $this->_formName . '_error_block')) {$this->_tpl->setVariable($this->_formName . '_error', $error);if (!empty($label) && $this->_tpl->placeholderExists($this->_formName . '_label', $tplBlock)) {$this->_tpl->setVariable($this->_formName . '_label', is_array($label)? $label[0]: $label);if (is_array($label)) {$label[0] = $this->_getTplBlock($tplBlock);} else {$label = $this->_getTplBlock($tplBlock);}} elseif (!empty($html) && $this->_tpl->placeholderExists($this->_formName . '_html', $tplBlock)) {$this->_tpl->setVariable($this->_formName . '_html', $html);$html = $this->_getTplBlock($tplBlock);}// clean up after ourselves$this->_tpl->setVariable($this->_formName . '_error', null);} elseif (!empty($label) && strpos($this->_error, '{label}') !== false) {if (is_array($label)) {$label[0] = str_replace(array('{label}', '{error}'), array($label[0], $error), $this->_error);} else {$label = str_replace(array('{label}', '{error}'), array($label, $error), $this->_error);}} elseif (!empty($html) && strpos($this->_error, '{html}') !== false) {$html = str_replace(array('{html}', '{error}'), array($html, $error), $this->_error);} else {$this->_errors[] = $error;}}// end func _renderError/*** Returns the block's contents** The method is needed because ITX and Sigma implement clearing* the block contents on get() a bit differently** @param string Block name* @return string Block contents*/function _getTplBlock($block){$this->_tpl->parse($block);if (is_a($this->_tpl, 'html_template_sigma')) {$ret = $this->_tpl->get($block, true);} else {$oldClear = $this->_tpl->clearCache;$this->_tpl->clearCache = true;$ret = $this->_tpl->get($block);$this->_tpl->clearCache = $oldClear;}return $ret;}} // end class HTML_QuickForm_Renderer_ITStatic?>