HTML_QuickForm
[ class tree: HTML_QuickForm ] [ index: HTML_QuickForm ] [ all elements ]

Source for file ITStatic.php

Documentation is available at ITStatic.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
  3.  
  4. /**
  5.  * A static renderer for HTML_QuickForm compatible
  6.  * with HTML_Template_IT and HTML_Template_Sigma.
  7.  * 
  8.  * PHP versions 4 and 5
  9.  *
  10.  * LICENSE: This source file is subject to version 3.01 of the PHP license
  11.  * that is available through the world-wide-web at the following URI:
  12.  * http://www.php.net/license/3_01.txt If you did not receive a copy of
  13.  * the PHP License and are unable to obtain it through the web, please
  14.  * send a note to license@php.net so we can mail you a copy immediately.
  15.  *
  16.  * @category    HTML
  17.  * @package     HTML_QuickForm
  18.  * @author      Bertrand Mansion <bmansion@mamasam.com>
  19.  * @copyright   2001-2011 The PHP Group
  20.  * @license     http://www.php.net/license/3_01.txt PHP License 3.01
  21.  * @version     CVS: $Id: ITStatic.php 317587 2011-10-01 07:55:53Z avb $
  22.  * @link        http://pear.php.net/package/HTML_QuickForm
  23.  */
  24.  
  25. /**
  26.  * An abstract base class for QuickForm renderers
  27.  */
  28. require_once 'HTML/QuickForm/Renderer.php';
  29.  
  30. /**
  31.  * A static renderer for HTML_QuickForm compatible
  32.  * with HTML_Template_IT and HTML_Template_Sigma.
  33.  *
  34.  * As opposed to the dynamic renderer, this renderer needs
  35.  * every elements and labels in the form to be specified by
  36.  * placeholders at the position you want them to be displayed.
  37.  * 
  38.  * @category    HTML
  39.  * @package     HTML_QuickForm
  40.  * @author      Bertrand Mansion <bmansion@mamasam.com>
  41.  * @version     Release: 3.2.13
  42.  * @since       3.0
  43.  */
  44. {
  45.    /**#@+
  46.     * @access private
  47.     */
  48.    /**
  49.     * An HTML_Template_IT or some other API compatible Template instance
  50.     * @var object 
  51.     */
  52.     var $_tpl = null;
  53.  
  54.    /**
  55.     * Rendered form name
  56.     * @var string 
  57.     */
  58.     var $_formName 'form';
  59.  
  60.    /**
  61.     * The errors that were not shown near concrete fields go here
  62.     * @var array 
  63.     */
  64.     var $_errors = array();
  65.  
  66.    /**
  67.     * Show the block with required note?
  68.     * @var bool 
  69.     */
  70.     var $_showRequired = false;
  71.  
  72.    /**
  73.     * Which group are we currently parsing ?
  74.     * @var string 
  75.     */
  76.     var $_inGroup;
  77.  
  78.    /**
  79.     * Index of the element in its group
  80.     * @var int 
  81.     */
  82.     var $_elementIndex = 0;
  83.  
  84.    /**
  85.     * If elements have been added with the same name
  86.     * @var array 
  87.     */
  88.     var $_duplicateElements = array();
  89.  
  90.    /**
  91.     * How to handle the required tag for required fields
  92.     * @var string 
  93.     */
  94.     var $_required '{label}<font size="1" color="red">*</font>';
  95.  
  96.    /**
  97.     * How to handle error messages in form validation
  98.     * @var string 
  99.     */
  100.     var $_error '<font color="red">{error}</font><br />{html}';
  101.  
  102.    /**
  103.     * Collected HTML for hidden elements, if needed
  104.     * @var string 
  105.     */
  106.     var $_hidden '';
  107.    /**#@-*/
  108.  
  109.    /**
  110.     * Constructor
  111.     *
  112.     * @param HTML_Template_IT|HTML_Template_Sigma  Template object to use
  113.     */
  114.     function HTML_QuickForm_Renderer_ITStatic(&$tpl)
  115.     {
  116.         $this->HTML_QuickForm_Renderer();
  117.         $this->_tpl =$tpl;
  118.     // end constructor
  119.  
  120.    /**
  121.     * Called when visiting a form, before processing any form elements
  122.     *
  123.     * @param    HTML_QuickForm  form object being visited
  124.     * @access   public
  125.     * @return   void 
  126.     */
  127.     function startForm(&$form)
  128.     {
  129.         $this->_formName $form->getAttribute('id');
  130.  
  131.         if (count($form->_duplicateIndex> 0{
  132.             // Take care of duplicate elements
  133.             foreach ($form->_duplicateIndex as $elementName => $indexes{
  134.                 $this->_duplicateElements[$elementName= 0;
  135.             }
  136.         }
  137.     // end func startForm
  138.  
  139.    /**
  140.     * Called when visiting a form, after processing all form elements
  141.     * 
  142.     * @param    HTML_QuickForm  form object being visited
  143.     * @access   public
  144.     * @return   void 
  145.     */
  146.     function finishForm(&$form)
  147.     {
  148.         // display errors above form
  149.         if (!empty($this->_errors&& $this->_tpl->blockExists($this->_formName.'_error_loop')) {
  150.             foreach ($this->_errors as $error{
  151.                 $this->_tpl->setVariable($this->_formName.'_error'$error);
  152.                 $this->_tpl->parse($this->_formName.'_error_loop');
  153.             }
  154.         }
  155.         // show required note
  156.         if ($this->_showRequired{
  157.             $this->_tpl->setVariable($this->_formName.'_required_note'$form->getRequiredNote());
  158.         }
  159.         // add hidden elements, if collected
  160.         if (!empty($this->_hidden)) {
  161.             $this->_tpl->setVariable($this->_formName '_hidden'$this->_hidden);
  162.         }
  163.         // assign form attributes
  164.         $this->_tpl->setVariable($this->_formName.'_attributes'$form->getAttributes(true));
  165.         // assign javascript validation rules
  166.         $this->_tpl->setVariable($this->_formName.'_javascript'$form->getValidationScript());
  167.     // end func finishForm
  168.  
  169.    /**
  170.     * Called when visiting a header element
  171.     *
  172.     * @param    HTML_QuickForm_header   header element being visited
  173.     * @access   public
  174.     * @return   void 
  175.     */
  176.     function renderHeader(&$header)
  177.     {
  178.         $name $header->getName();
  179.         $varName $this->_formName.'_header';
  180.  
  181.         // Find placeHolder
  182.         if (!empty($name&& $this->_tpl->placeHolderExists($this->_formName.'_header_'.$name)) {
  183.             $varName $this->_formName.'_header_'.$name;
  184.         }
  185.         $this->_tpl->setVariable($varName$header->toHtml());
  186.     // end func renderHeader
  187.  
  188.    /**
  189.     * Called when visiting an element
  190.     *
  191.     * @param    HTML_QuickForm_element  form element being visited
  192.     * @param    bool                    Whether an element is required
  193.     * @param    string                  An error message associated with an element
  194.     * @access   public
  195.     * @return   void 
  196.     */
  197.     function renderElement(&$element$required$error)
  198.     {
  199.         $name $element->getName();
  200.  
  201.         // are we inside a group?
  202.         if (!empty($this->_inGroup)) {
  203.             $varName $this->_formName.'_'.str_replace(array('['']')'_'$name);
  204.             if (substr($varName-2== '__'{
  205.                 // element name is of type : group[]
  206.                 $varName $this->_inGroup.'_'.$this->_elementIndex.'_';
  207.                 $this->_elementIndex++;
  208.             }
  209.             if ($varName != $this->_inGroup{
  210.                 $varName .= '_' == substr($varName-1)'''_';
  211.                 // element name is of type : group[name]
  212.                 $label $element->getLabel();
  213.                 $html $element->toHtml();
  214.  
  215.                 if ($required && !$element->isFrozen()) {
  216.                     $this->_renderRequired($label$html);
  217.                     $this->_showRequired = true;
  218.                 }
  219.                 if (!empty($label)) {
  220.                     if (is_array($label)) {
  221.                         foreach ($label as $key => $value{
  222.                             $this->_tpl->setVariable($varName.'label_'.$key$value);
  223.                         }
  224.                     else {
  225.                         $this->_tpl->setVariable($varName.'label'$label);
  226.                     }
  227.                 }
  228.                 $this->_tpl->setVariable($varName.'html'$html);
  229.             }
  230.  
  231.         else {
  232.  
  233.             $name str_replace(array('['']')array('_''')$name);
  234.  
  235.             if (isset($this->_duplicateElements[$name])) {
  236.                 // Element is a duplicate
  237.                 $varName $this->_formName.'_'.$name.'_'.$this->_duplicateElements[$name];
  238.                 $this->_duplicateElements[$name]++;
  239.             else {
  240.                 $varName $this->_formName.'_'.$name;
  241.             }
  242.  
  243.             $label $element->getLabel();
  244.             $html $element->toHtml();
  245.  
  246.             if ($required{
  247.                 $this->_showRequired = true;
  248.                 $this->_renderRequired($label$html);
  249.             }
  250.             if (!empty($error)) {
  251.                 $this->_renderError($label$html$error);
  252.             }
  253.             if (is_array($label)) {
  254.                 foreach ($label as $key => $value{
  255.                     $this->_tpl->setVariable($varName.'_label_'.$key$value);
  256.                 }
  257.             else {
  258.                 $this->_tpl->setVariable($varName.'_label'$label);
  259.             }
  260.             $this->_tpl->setVariable($varName.'_html'$html);
  261.         }
  262.     // end func renderElement
  263.  
  264.    /**
  265.     * Called when visiting a hidden element
  266.     * 
  267.     * @param    HTML_QuickForm_element  hidden element being visited
  268.     * @access   public
  269.     * @return   void 
  270.     */
  271.     function renderHidden(&$element)
  272.     {
  273.         if ($this->_tpl->placeholderExists($this->_formName '_hidden')) {
  274.             $this->_hidden .= $element->toHtml();
  275.         else {
  276.             $name $element->getName();
  277.             $name str_replace(array('['']')array('_''')$name);
  278.             $this->_tpl->setVariable($this->_formName.'_'.$name.'_html'$element->toHtml());
  279.         }
  280.     // end func renderHidden
  281.  
  282.    /**
  283.     * Called when visiting a group, before processing any group elements
  284.     *
  285.     * @param    HTML_QuickForm_group    group being visited
  286.     * @param    bool                    Whether a group is required
  287.     * @param    string                  An error message associated with a group
  288.     * @access   public
  289.     * @return   void 
  290.     */
  291.     function startGroup(&$group$required$error)
  292.     {
  293.         $name $group->getName();
  294.         $varName $this->_formName.'_'.$name;
  295.  
  296.         $this->_elementIndex = 0;
  297.  
  298.         $html $this->_tpl->placeholderExists($varName.'_html'$group->toHtml('';
  299.         $label $group->getLabel();
  300.  
  301.         if ($required{
  302.             $this->_renderRequired($label$html);
  303.         }
  304.         if (!empty($error)) {
  305.             $this->_renderError($label$html$error);
  306.         }
  307.         if (!empty($html)) {
  308.             $this->_tpl->setVariable($varName.'_html'$html);
  309.         else {
  310.             // Uses error blocks to set the special groups layout error
  311.             // <!-- BEGIN form_group_error -->{form_group_error}<!-- END form_group_error -->
  312.             if (!empty($error)) {
  313.                 if ($this->_tpl->placeholderExists($varName.'_error')) {
  314.                     if ($this->_tpl->blockExists($this->_formName '_error_block')) {
  315.                         $this->_tpl->setVariable($this->_formName '_error'$error);
  316.                         $error $this->_getTplBlock($this->_formName '_error_block');
  317.                     elseif (strpos($this->_error'{html}'!== false || strpos($this->_error'{label}'!== false{
  318.                         $error str_replace('{error}'$error$this->_error);
  319.                     }
  320.                 }
  321.                 $this->_tpl->setVariable($varName '_error'$error);
  322.                 array_pop($this->_errors);
  323.             }
  324.         }
  325.         if (is_array($label)) {
  326.             foreach ($label as $key => $value{
  327.                 $this->_tpl->setVariable($varName.'_label_'.$key$value);
  328.             }
  329.         else {
  330.             $this->_tpl->setVariable($varName.'_label'$label);
  331.         }
  332.         $this->_inGroup $varName;
  333.     // end func startGroup
  334.  
  335.    /**
  336.     * Called when visiting a group, after processing all group elements
  337.     *
  338.     * @param    HTML_QuickForm_group    group being visited
  339.     * @access   public
  340.     * @return   void 
  341.     */
  342.     function finishGroup(&$group)
  343.     {
  344.         $this->_inGroup '';
  345.     // end func finishGroup
  346.  
  347.    /**
  348.     * Sets the way required elements are rendered
  349.     *
  350.     * You can use {label} or {html} placeholders to let the renderer know where
  351.     * where the element label or the element html are positionned according to the
  352.     * required tag. They will be replaced accordingly with the right value.
  353.     * For example:
  354.     * <font color="red">*</font>{label}
  355.     * will put a red star in front of the label if the element is required.
  356.     *
  357.     * @param    string      The required element template
  358.     * @access   public
  359.     * @return   void 
  360.     */
  361.     function setRequiredTemplate($template)
  362.     {
  363.         $this->_required $template;
  364.     // end func setRequiredTemplate
  365.  
  366.    /**
  367.     * Sets the way elements with validation errors are rendered
  368.     *
  369.     * You can use {label} or {html} placeholders to let the renderer know where
  370.     * where the element label or the element html are positionned according to the
  371.     * error message. They will be replaced accordingly with the right value.
  372.     * The error message will replace the {error} place holder.
  373.     * For example:
  374.     * <font color="red">{error}</font><br />{html}
  375.     * will put the error message in red on top of the element html.
  376.     *
  377.     * If you want all error messages to be output in the main error block, do not specify
  378.     * {html} nor {label}.
  379.     *
  380.     * Groups can have special layouts. With this kind of groups, the renderer will need
  381.     * to know where to place the error message. In this case, use error blocks like:
  382.     * <!-- BEGIN form_group_error -->{form_group_error}<!-- END form_group_error -->
  383.     * where you want the error message to appear in the form.
  384.     *
  385.     * @param    string      The element error template
  386.     * @access   public
  387.     * @return   void 
  388.     */
  389.     function setErrorTemplate($template)
  390.     {
  391.         $this->_error $template;
  392.     // end func setErrorTemplate
  393.  
  394.    /**
  395.     * Called when an element is required
  396.     *
  397.     * This method will add the required tag to the element label and/or the element html
  398.     * such as defined with the method setRequiredTemplate
  399.     *
  400.     * @param    string      The element label
  401.     * @param    string      The element html rendering
  402.     * @see      setRequiredTemplate()
  403.     * @access   private
  404.     * @return   void 
  405.     */
  406.     function _renderRequired(&$label&$html)
  407.     {
  408.         if ($this->_tpl->blockExists($tplBlock $this->_formName '_required_block')) {
  409.             if (!empty($label&& $this->_tpl->placeholderExists($this->_formName '_label'$tplBlock)) {
  410.                 $this->_tpl->setVariable($this->_formName '_label'is_array($label)$label[0]$label);
  411.                 if (is_array($label)) {
  412.                     $label[0$this->_getTplBlock($tplBlock);
  413.                 else {
  414.                     $label    $this->_getTplBlock($tplBlock);
  415.                 }
  416.             }
  417.             if (!empty($html&& $this->_tpl->placeholderExists($this->_formName '_html'$tplBlock)) {
  418.                 $this->_tpl->setVariable($this->_formName '_html'$html);
  419.                 $html $this->_getTplBlock($tplBlock);
  420.             }
  421.         else {
  422.             if (!empty($label&& strpos($this->_required'{label}'!== false{
  423.                 if (is_array($label)) {
  424.                     $label[0str_replace('{label}'$label[0]$this->_required);
  425.                 else {
  426.                     $label str_replace('{label}'$label$this->_required);
  427.                 }
  428.             }
  429.             if (!empty($html&& strpos($this->_required'{html}'!== false{
  430.                 $html str_replace('{html}'$html$this->_required);
  431.             }
  432.         }
  433.     // end func _renderRequired
  434.  
  435.    /**
  436.     * Called when an element has a validation error
  437.     *
  438.     * This method will add the error message to the element label or the element html
  439.     * such as defined with the method setErrorTemplate. If the error placeholder is not found
  440.     * in the template, the error will be displayed in the form error block.
  441.     *
  442.     * @param    string      The element label
  443.     * @param    string      The element html rendering
  444.     * @param    string      The element error
  445.     * @see      setErrorTemplate()
  446.     * @access   private
  447.     * @return   void 
  448.     */
  449.     function _renderError(&$label&$html$error)
  450.     {
  451.         if ($this->_tpl->blockExists($tplBlock $this->_formName '_error_block')) {
  452.             $this->_tpl->setVariable($this->_formName '_error'$error);
  453.             if (!empty($label&& $this->_tpl->placeholderExists($this->_formName '_label'$tplBlock)) {
  454.                 $this->_tpl->setVariable($this->_formName '_label'is_array($label)$label[0]$label);
  455.                 if (is_array($label)) {
  456.                     $label[0$this->_getTplBlock($tplBlock);
  457.                 else {
  458.                     $label    $this->_getTplBlock($tplBlock);
  459.                 }
  460.             elseif (!empty($html&& $this->_tpl->placeholderExists($this->_formName '_html'$tplBlock)) {
  461.                 $this->_tpl->setVariable($this->_formName '_html'$html);
  462.                 $html $this->_getTplBlock($tplBlock);
  463.             }
  464.             // clean up after ourselves
  465.             $this->_tpl->setVariable($this->_formName '_error'null);
  466.         elseif (!empty($label&& strpos($this->_error'{label}'!== false{
  467.             if (is_array($label)) {
  468.                 $label[0str_replace(array('{label}''{error}')array($label[0]$error)$this->_error);
  469.             else {
  470.                 $label str_replace(array('{label}''{error}')array($label$error)$this->_error);
  471.             }
  472.         elseif (!empty($html&& strpos($this->_error'{html}'!== false{
  473.             $html str_replace(array('{html}''{error}')array($html$error)$this->_error);
  474.         else {
  475.             $this->_errors[$error;
  476.         }
  477.     }// end func _renderError
  478.  
  479.  
  480.    /**
  481.     * Returns the block's contents
  482.     *
  483.     * The method is needed because ITX and Sigma implement clearing
  484.     * the block contents on get() a bit differently
  485.     *
  486.     * @param    string  Block name
  487.     * @return   string  Block contents
  488.     */
  489.     function _getTplBlock($block)
  490.     {
  491.         $this->_tpl->parse($block);
  492.         if (is_a($this->_tpl'html_template_sigma')) {
  493.             $ret $this->_tpl->get($blocktrue);
  494.         else {
  495.             $oldClear $this->_tpl->clearCache;
  496.             $this->_tpl->clearCache = true;
  497.             $ret $this->_tpl->get($block);
  498.             $this->_tpl->clearCache = $oldClear;
  499.         }
  500.         return $ret;
  501.     }
  502. // end class HTML_QuickForm_Renderer_ITStatic
  503. ?>

Documentation generated on Sat, 01 Oct 2011 09:00:14 +0000 by phpDocumentor 1.4.3. PEAR Logo Copyright © PHP Group 2004.