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

Source for file ITDynamic.php

Documentation is available at ITDynamic.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
  3.  
  4. /**
  5.  * A concrete renderer for HTML_QuickForm, using Integrated Templates.
  6.  * 
  7.  * PHP versions 4 and 5
  8.  *
  9.  * LICENSE: This source file is subject to version 3.01 of the PHP license
  10.  * that is available through the world-wide-web at the following URI:
  11.  * http://www.php.net/license/3_01.txt If you did not receive a copy of
  12.  * the PHP License and are unable to obtain it through the web, please
  13.  * send a note to license@php.net so we can mail you a copy immediately.
  14.  *
  15.  * @category    HTML
  16.  * @package     HTML_QuickForm
  17.  * @author      Alexey Borzov <avb@php.net>
  18.  * @copyright   2001-2011 The PHP Group
  19.  * @license     http://www.php.net/license/3_01.txt PHP License 3.01
  20.  * @version     CVS: $Id: ITDynamic.php 317587 2011-10-01 07:55:53Z avb $
  21.  * @link        http://pear.php.net/package/HTML_QuickForm
  22.  */
  23.  
  24. /**
  25.  * An abstract base class for QuickForm renderers
  26.  */
  27. require_once 'HTML/QuickForm/Renderer.php';
  28.  
  29. /**
  30.  * A concrete renderer for HTML_QuickForm, using Integrated Templates.
  31.  * 
  32.  * This is a "dynamic" renderer, which means that concrete form look
  33.  * is defined at runtime. This also means that you can define
  34.  * <b>one</b> template file for <b>all</b> your forms. That template
  35.  * should contain a block for every element 'look' appearing in your
  36.  * forms and also some special blocks (consult the examples). If a
  37.  * special block is not set for an element, the renderer falls back to
  38.  * a default one.
  39.  * 
  40.  * @category    HTML
  41.  * @package     HTML_QuickForm
  42.  * @author      Alexey Borzov <avb@php.net>
  43.  * @version     Release: 3.2.13
  44.  * @since       3.0
  45.  */
  46. {
  47.    /**#@+
  48.     * @access private
  49.     */
  50.    /**
  51.     * A template class (HTML_Template_ITX or HTML_Template_Sigma) instance
  52.     * @var HTML_Template_ITX|HTML_Template_Sigma
  53.     */
  54.     var $_tpl = null;
  55.  
  56.    /**
  57.     * The errors that were not shown near concrete fields go here
  58.     * @var array 
  59.     */
  60.     var $_errors = array();
  61.  
  62.    /**
  63.     * Show the block with required note?
  64.     * @var bool 
  65.     */
  66.     var $_showRequired = false;
  67.  
  68.    /**
  69.     * A separator for group elements
  70.     * @var mixed 
  71.     */
  72.     var $_groupSeparator = null;
  73.  
  74.    /**
  75.     * The current element index inside a group
  76.     * @var integer 
  77.     */
  78.     var $_groupElementIdx = 0;
  79.  
  80.    /**
  81.     * Blocks to use for different elements
  82.     * @var array 
  83.     */
  84.     var $_elementBlocks = array();
  85.  
  86.    /**
  87.     * Block to use for headers
  88.     * @var string 
  89.     */
  90.     var $_headerBlock = null;
  91.    /**#@-*/
  92.  
  93.  
  94.    /**
  95.     * Constructor
  96.     *
  97.     * @param HTML_Template_ITX|HTML_Template_Sigma    Template object to use
  98.     */
  99.     function HTML_QuickForm_Renderer_ITDynamic(&$tpl)
  100.     {
  101.         $this->HTML_QuickForm_Renderer();
  102.         $this->_tpl =$tpl;
  103.         $this->_tpl->setCurrentBlock('qf_main_loop');
  104.     }
  105.  
  106.  
  107.     function finishForm(&$form)
  108.     {
  109.         // display errors above form
  110.         if (!empty($this->_errors&& $this->_tpl->blockExists('qf_error_loop')) {
  111.             foreach ($this->_errors as $error{
  112.                 $this->_tpl->setVariable('qf_error'$error);
  113.                 $this->_tpl->parse('qf_error_loop');
  114.             }
  115.         }
  116.         // show required note
  117.         if ($this->_showRequired{
  118.             $this->_tpl->setVariable('qf_required_note'$form->getRequiredNote());
  119.         }
  120.         // assign form attributes
  121.         $this->_tpl->setVariable('qf_attributes'$form->getAttributes(true));
  122.         // assign javascript validation rules
  123.         $this->_tpl->setVariable('qf_javascript'$form->getValidationScript());
  124.     }
  125.       
  126.  
  127.     function renderHeader(&$header)
  128.     {
  129.         $blockName $this->_matchBlock($header);
  130.         if ('qf_header' == $blockName && isset($this->_headerBlock)) {
  131.             $blockName $this->_headerBlock;
  132.         }
  133.         $this->_tpl->setVariable('qf_header'$header->toHtml());
  134.         $this->_tpl->parse($blockName);
  135.         $this->_tpl->parse('qf_main_loop');
  136.     }
  137.  
  138.  
  139.     function renderElement(&$element$required$error)
  140.     {
  141.         $blockName $this->_matchBlock($element);
  142.         // are we inside a group?
  143.         if ('qf_main_loop' != $this->_tpl->currentBlock{
  144.             if (0 != $this->_groupElementIdx && $this->_tpl->placeholderExists('qf_separator'$blockName)) {
  145.                 if (is_array($this->_groupSeparator)) {
  146.                     $this->_tpl->setVariable('qf_separator'$this->_groupSeparator[($this->_groupElementIdx - 1count($this->_groupSeparator)]);
  147.                 else {
  148.                     $this->_tpl->setVariable('qf_separator'(string)$this->_groupSeparator);
  149.                 }
  150.             }
  151.             $this->_groupElementIdx++;
  152.  
  153.         elseif(!empty($error)) {
  154.             // show the error message or keep it for later use
  155.             if ($this->_tpl->blockExists($blockName '_error')) {
  156.                 $this->_tpl->setVariable('qf_error'$error);
  157.             else {
  158.                 $this->_errors[$error;
  159.             }
  160.         }
  161.         // show an '*' near the required element
  162.         if ($required{
  163.             $this->_showRequired = true;
  164.             if ($this->_tpl->blockExists($blockName '_required')) {
  165.                 $this->_tpl->touchBlock($blockName '_required');
  166.             }
  167.         }
  168.         // Prepare multiple labels
  169.         $labels $element->getLabel();
  170.         if (is_array($labels)) {
  171.             $mainLabel array_shift($labels);
  172.         else {
  173.             $mainLabel $labels;
  174.         }
  175.         // render the element itself with its main label
  176.         $this->_tpl->setVariable('qf_element'$element->toHtml());
  177.         if ($this->_tpl->placeholderExists('qf_label'$blockName)) {
  178.             $this->_tpl->setVariable('qf_label'$mainLabel);
  179.         }
  180.         // render extra labels, if any
  181.         if (is_array($labels)) {
  182.             foreach($labels as $key => $label{
  183.                 $key is_int($key)$key + 2: $key;
  184.                 if ($this->_tpl->blockExists($blockName '_label_' $key)) {
  185.                     $this->_tpl->setVariable('qf_label_' $key$label);
  186.                 }
  187.             }
  188.         }
  189.         $this->_tpl->parse($blockName);
  190.         $this->_tpl->parseCurrentBlock();
  191.     }
  192.    
  193.  
  194.     function renderHidden(&$element)
  195.     {
  196.         $this->_tpl->setVariable('qf_hidden'$element->toHtml());
  197.         $this->_tpl->parse('qf_hidden_loop');
  198.     }
  199.  
  200.  
  201.     function startGroup(&$group$required$error)
  202.     {
  203.         $blockName $this->_matchBlock($group);
  204.         $this->_tpl->setCurrentBlock($blockName '_loop');
  205.         $this->_groupElementIdx = 0;
  206.         $this->_groupSeparator  is_null($group->_separator)'&nbsp;'$group->_separator;
  207.         // show an '*' near the required element
  208.         if ($required{
  209.             $this->_showRequired = true;
  210.             if ($this->_tpl->blockExists($blockName '_required')) {
  211.                 $this->_tpl->touchBlock($blockName '_required');
  212.             }
  213.         }
  214.         // show the error message or keep it for later use
  215.         if (!empty($error)) {
  216.             if ($this->_tpl->blockExists($blockName '_error')) {
  217.                 $this->_tpl->setVariable('qf_error'$error);
  218.             else {
  219.                 $this->_errors[$error;
  220.             }
  221.         }
  222.         $this->_tpl->setVariable('qf_group_label'$group->getLabel());
  223.     }
  224.  
  225.  
  226.     function finishGroup(&$group)
  227.     {
  228.         $this->_tpl->parse($this->_matchBlock($group));
  229.         $this->_tpl->setCurrentBlock('qf_main_loop');
  230.         $this->_tpl->parseCurrentBlock();
  231.     }
  232.  
  233.  
  234.    /**
  235.     * Returns the name of a block to use for element rendering
  236.     * 
  237.     * If a name was not explicitly set via setElementBlock(), it tries
  238.     * the names '{prefix}_{element type}' and '{prefix}_{element}', where
  239.     * prefix is either 'qf' or the name of the current group's block
  240.     * 
  241.     * @param HTML_QuickForm_element     form element being rendered
  242.     * @access private
  243.     * @return string    block name
  244.     */
  245.     function _matchBlock(&$element)
  246.     {
  247.         $name $element->getName();
  248.         $type $element->getType();
  249.         if (isset($this->_elementBlocks[$name]&& $this->_tpl->blockExists($this->_elementBlocks[$name])) {
  250.             if (('group' == $type|| ($this->_elementBlocks[$name'_loop' != $this->_tpl->currentBlock)) {
  251.                 return $this->_elementBlocks[$name];
  252.             }
  253.         }
  254.         if ('group' != $type && 'qf_main_loop' != $this->_tpl->currentBlock{
  255.             $prefix substr($this->_tpl->currentBlock0-5)// omit '_loop' postfix
  256.         else {
  257.             $prefix 'qf';
  258.         }
  259.         if ($this->_tpl->blockExists($prefix '_' $type)) {
  260.             return $prefix '_' $type;
  261.         elseif ($this->_tpl->blockExists($prefix '_' $name)) {
  262.             return $prefix '_' $name;
  263.         else {
  264.             return $prefix '_element';
  265.         }
  266.     }
  267.  
  268.  
  269.    /**
  270.     * Sets the block to use for element rendering
  271.     * 
  272.     * @param mixed      element name or array ('element name' => 'block name')
  273.     * @param string     block name if $elementName is not an array
  274.     * @access public
  275.     * @return void 
  276.     */
  277.     function setElementBlock($elementName$blockName = null)
  278.     {
  279.         if (is_array($elementName)) {
  280.             $this->_elementBlocks array_merge($this->_elementBlocks$elementName);
  281.         else {
  282.             $this->_elementBlocks[$elementName$blockName;
  283.         }
  284.     }
  285.  
  286.  
  287.    /**
  288.     * Sets the name of a block to use for header rendering
  289.     *
  290.     * @param string     block name
  291.     * @access public
  292.     * @return void 
  293.     */
  294.     function setHeaderBlock($blockName)
  295.     {
  296.         $this->_headerBlock $blockName;
  297.     }
  298. }
  299. ?>

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