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

Source for file ArraySmarty.php

Documentation is available at ArraySmarty.php

  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. // |          Bertrand Mansion <bmansion@mamasam.com>                     |
  18. // |          Thomas Schulz <ths@4bconsult.de>                            |
  19. // +----------------------------------------------------------------------+
  20. //
  21. // $Id: ArraySmarty.php,v 1.11 2006/10/07 20:12:17 avb Exp $
  22.  
  23. require_once 'HTML/QuickForm/Renderer/Array.php';
  24.  
  25. /**
  26.  * A static renderer for HTML_QuickForm, makes an array of form content
  27.  * useful for an Smarty template
  28.  *
  29.  * Based on old toArray() code and ITStatic renderer.
  30.  *
  31.  * The form array structure is the following:
  32.  * Array (
  33.  *  [frozen]       => whether the complete form is frozen'
  34.  *  [javascript]   => javascript for client-side validation
  35.  *  [attributes]   => attributes for <form> tag
  36.  *  [hidden]       => html of all hidden elements
  37.  *  [requirednote] => note about the required elements
  38.  *  [errors] => Array
  39.  *      (
  40.  *          [1st_element_name] => Error for the 1st element
  41.  *          ...
  42.  *          [nth_element_name] => Error for the nth element
  43.  *      )
  44.  *
  45.  *  [header] => Array
  46.  *      (
  47.  *          [1st_header_name] => Header text for the 1st header
  48.  *          ...
  49.  *          [nth_header_name] => Header text for the nth header
  50.  *      )
  51.  *
  52.  *  [1st_element_name] => Array for the 1st element
  53.  *  ...
  54.  *  [nth_element_name] => Array for the nth element
  55.  *
  56.  * // where an element array has the form:
  57.  *      (
  58.  *          [name]      => element name
  59.  *          [value]     => element value,
  60.  *          [type]      => type of the element
  61.  *          [frozen]    => whether element is frozen
  62.  *          [label]     => label for the element
  63.  *          [required]  => whether element is required
  64.  * // if element is not a group:
  65.  *          [html]      => HTML for the element
  66.  * // if element is a group:
  67.  *          [separator] => separator for group elements
  68.  *          [1st_gitem_name] => Array for the 1st element in group
  69.  *          ...
  70.  *          [nth_gitem_name] => Array for the nth element in group
  71.  *      )
  72.  * )
  73.  *
  74.  * @access public
  75.  */
  76. {
  77.    /**
  78.     * The Smarty template engine instance
  79.     * @var object 
  80.     */
  81.     var $_tpl = null;
  82.  
  83.    /**
  84.     * Current element index
  85.     * @var integer 
  86.     */
  87.     var $_elementIdx = 0;
  88.  
  89.     /**
  90.     * The current element index inside a group
  91.     * @var integer 
  92.     */
  93.     var $_groupElementIdx = 0;
  94.  
  95.    /**
  96.     * How to handle the required tag for required fields
  97.     * @var string 
  98.     * @see      setRequiredTemplate()
  99.     */
  100.     var $_required '';
  101.  
  102.    /**
  103.     * How to handle error messages in form validation
  104.     * @var string 
  105.     * @see      setErrorTemplate()
  106.     */
  107.     var $_error '';
  108.  
  109.    /**
  110.     * Constructor
  111.     *
  112.     * @param  object  reference to the Smarty template engine instance
  113.     * @param  bool    true: render an array of labels to many labels, $key 0 to 'label' and the oterh to "label_$key"
  114.     * @access public
  115.     */
  116.     function HTML_QuickForm_Renderer_ArraySmarty(&$tpl$staticLabels = false)
  117.     {
  118.         $this->HTML_QuickForm_Renderer_Array(true$staticLabels);
  119.         $this->_tpl =$tpl;
  120.     // end constructor
  121.  
  122.    /**
  123.     * Called when visiting a header element
  124.     *
  125.     * @param    object     An HTML_QuickForm_header element being visited
  126.     * @access   public
  127.     * @return   void 
  128.     */
  129.     function renderHeader(&$header)
  130.     {
  131.         if ($name $header->getName()) {
  132.             $this->_ary['header'][$name$header->toHtml();
  133.         else {
  134.             $this->_ary['header'][$this->_sectionCount$header->toHtml();
  135.         }
  136.         $this->_currentSection $this->_sectionCount++;
  137.     // end func renderHeader
  138.  
  139.    /**
  140.     * Called when visiting a group, before processing any group elements
  141.     *
  142.     * @param    object     An HTML_QuickForm_group object being visited
  143.     * @param    bool       Whether a group is required
  144.     * @param    string     An error message associated with a group
  145.     * @access   public
  146.     * @return   void 
  147.     */
  148.     function startGroup(&$group$required$error)
  149.     {
  150.         parent::startGroup($group$required$error);
  151.         $this->_groupElementIdx = 1;
  152.     // end func startGroup
  153.  
  154.    /**
  155.     * Creates an array representing an element containing
  156.     * the key for storing this
  157.     *
  158.     * @access private
  159.     * @param  object    An HTML_QuickForm_element object
  160.     * @param  bool      Whether an element is required
  161.     * @param  string    Error associated with the element
  162.     * @return array 
  163.     */
  164.     function _elementToArray(&$element$required$error)
  165.     {
  166.         $ret = parent::_elementToArray($element$required$error);
  167.  
  168.         if ('group' == $ret['type']{
  169.             $ret['html'$element->toHtml();
  170.             // we don't need the elements, see the array structure
  171.             unset($ret['elements']);
  172.         }
  173.         if (($required || $error&& !empty($this->_required)){
  174.             $this->_renderRequired($ret['label']$ret['html']$required$error);
  175.         }
  176.         if ($error && !empty($this->_error)) {
  177.             $this->_renderError($ret['label']$ret['html']$error);
  178.             $ret['error'$error;
  179.         }
  180.         // create keys for elements grouped by native group or name
  181.         if (strstr($ret['name']'['or $this->_currentGroup{
  182.             // Fix for bug #8123: escape backslashes and quotes to prevent errors 
  183.             // in eval(). The code below seems to handle the case where element
  184.             // name has unbalanced square brackets. Dunno whether we really
  185.             // need this after the fix for #8123, but I'm wary of making big
  186.             // changes to this code.  
  187.             preg_match('/([^]]*)\\[([^]]*)\\]/'$ret['name']$matches);
  188.             if (isset($matches[1])) {
  189.                 $sKeysSub substr_replace($ret['name']''0strlen($matches[1]));
  190.                 $sKeysSub str_replace(
  191.                     array('\\',   '\'',   '['  ,   ']''[\'\']'),
  192.                     array('\\\\''\\\'''[\'''\']''[]'    ),
  193.                     $sKeysSub
  194.                 );
  195.                 $sKeys '[\'' str_replace(array('\\''\'')array('\\\\''\\\'')$matches[1]'\']' $sKeysSub;
  196.             else {
  197.                 $sKeys '[\'' str_replace(array('\\''\'')array('\\\\''\\\'')$ret['name']'\']';
  198.             }
  199.             // special handling for elements in native groups
  200.             if ($this->_currentGroup{
  201.                 // skip unnamed group items unless radios: no name -> no static access
  202.                 // identification: have the same key string as the parent group
  203.                 if ($this->_currentGroup['keys'== $sKeys and 'radio' != $ret['type']{
  204.                     return false;
  205.                 }
  206.                 // reduce string of keys by remove leading group keys
  207.                 if (0 === strpos($sKeys$this->_currentGroup['keys'])) {
  208.                     $sKeys substr_replace($sKeys''0strlen($this->_currentGroup['keys']));
  209.                 }
  210.             }
  211.         // element without a name
  212.         elseif ($ret['name'== ''{
  213.             $sKeys '[\'element_' $this->_elementIdx '\']';
  214.         // other elements
  215.         else {
  216.             $sKeys '[\'' str_replace(array('\\''\'')array('\\\\''\\\'')$ret['name']'\']';
  217.         }
  218.         // for radios: add extra key from value
  219.         if ('radio' == $ret['type'and substr($sKeys-2!= '[]'{
  220.             $sKeys .= '[\'' str_replace(array('\\''\'')array('\\\\''\\\'')$ret['value']'\']';
  221.         }
  222.         $this->_elementIdx++;
  223.         $ret['keys'$sKeys;
  224.         return $ret;
  225.     // end func _elementToArray
  226.  
  227.    /**
  228.     * Stores an array representation of an element in the form array
  229.     *
  230.     * @access private
  231.     * @param array  Array representation of an element
  232.     * @return void 
  233.     */
  234.     function _storeArray($elAry)
  235.     {
  236.         if ($elAry{
  237.             $sKeys $elAry['keys'];
  238.             unset($elAry['keys']);
  239.             // where should we put this element...
  240.             if (is_array($this->_currentGroup&& ('group' != $elAry['type'])) {
  241.                 $toEval '$this->_currentGroup' $sKeys ' = $elAry;';
  242.             else {
  243.                 $toEval '$this->_ary' $sKeys ' = $elAry;';
  244.             }
  245.             eval($toEval);
  246.         }
  247.         return;
  248.     }
  249.  
  250.    /**
  251.     * Called when an element is required
  252.     *
  253.     * This method will add the required tag to the element label and/or the element html
  254.     * such as defined with the method setRequiredTemplate.
  255.     *
  256.     * @param    string      The element label
  257.     * @param    string      The element html rendering
  258.     * @param    boolean     The element required
  259.     * @param    string      The element error
  260.     * @see      setRequiredTemplate()
  261.     * @access   private
  262.     * @return   void 
  263.     */
  264.     function _renderRequired(&$label&$html&$required&$error)
  265.     {
  266.         $this->_tpl->assign(array(
  267.             'label'    => $label,
  268.             'html'     => $html,
  269.             'required' => $required,
  270.             'error'    => $error
  271.         ));
  272.         if (!empty($label&& strpos($this->_required$this->_tpl->left_delimiter . '$label'!== false{
  273.             $label $this->_tplFetch($this->_required);
  274.         }
  275.         if (!empty($html&& strpos($this->_required$this->_tpl->left_delimiter . '$html'!== false{
  276.             $html $this->_tplFetch($this->_required);
  277.         }
  278.         $this->_tpl->clear_assign(array('label''html''required'));
  279.     // end func _renderRequired
  280.  
  281.    /**
  282.     * Called when an element has a validation error
  283.     *
  284.     * This method will add the error message to the element label or the element html
  285.     * such as defined with the method setErrorTemplate. If the error placeholder is not found
  286.     * in the template, the error will be displayed in the form error block.
  287.     *
  288.     * @param    string      The element label
  289.     * @param    string      The element html rendering
  290.     * @param    string      The element error
  291.     * @see      setErrorTemplate()
  292.     * @access   private
  293.     * @return   void 
  294.     */
  295.     function _renderError(&$label&$html&$error)
  296.     {
  297.         $this->_tpl->assign(array('label' => '''html' => '''error' => $error));
  298.         $error $this->_tplFetch($this->_error);
  299.         $this->_tpl->assign(array('label' => $label'html'  => $html));
  300.  
  301.         if (!empty($label&& strpos($this->_error$this->_tpl->left_delimiter . '$label'!== false{
  302.             $label $this->_tplFetch($this->_error);
  303.         elseif (!empty($html&& strpos($this->_error$this->_tpl->left_delimiter . '$html'!== false{
  304.             $html $this->_tplFetch($this->_error);
  305.         }
  306.         $this->_tpl->clear_assign(array('label''html''error'));
  307.     // end func _renderError
  308.  
  309.    /**
  310.     * Process an template sourced in a string with Smarty
  311.     *
  312.     * Smarty has no core function to render    a template given as a string.
  313.     * So we use the smarty eval plugin function    to do this.
  314.     *
  315.     * @param    string      The template source
  316.     * @access   private
  317.     * @return   void 
  318.     */
  319.     function _tplFetch($tplSource)
  320.     {
  321.         if (!function_exists('smarty_function_eval')) {
  322.             require SMARTY_DIR . '/plugins/function.eval.php';
  323.         }
  324.         return smarty_function_eval(array('var' => $tplSource)$this->_tpl);
  325.     }// end func _tplFetch
  326.  
  327.    /**
  328.     * Sets the way required elements are rendered
  329.     *
  330.     * You can use {$label} or {$html} placeholders to let the renderer know where
  331.     * where the element label or the element html are positionned according to the
  332.     * required tag. They will be replaced accordingly with the right value.    You
  333.     * can use the full smarty syntax here, especially a custom modifier for I18N.
  334.     * For example:
  335.     * {if $required}<span style="color: red;">*</span>{/if}{$label|translate}
  336.     * will put a red star in front of the label if the element is required and
  337.     * translate the label.
  338.     *
  339.     *
  340.     * @param    string      The required element template
  341.     * @access   public
  342.     * @return   void 
  343.     */
  344.     function setRequiredTemplate($template)
  345.     {
  346.         $this->_required $template;
  347.     // end func setRequiredTemplate
  348.  
  349.    /**
  350.     * Sets the way elements with validation errors are rendered
  351.     *
  352.     * You can use {$label} or {$html} placeholders to let the renderer know where
  353.     * where the element label or the element html are positionned according to the
  354.     * error message. They will be replaced accordingly with the right value.
  355.     * The error message will replace the {$error} placeholder.
  356.     * For example:
  357.     * {if $error}<span style="color: red;">{$error}</span>{/if}<br />{$html}
  358.     * will put the error message in red on top of the element html.
  359.     *
  360.     * If you want all error messages to be output in the main error block, use
  361.     * the {$form.errors} part of the rendered array that collects all raw error
  362.     * messages.
  363.     *
  364.     * If you want to place all error messages manually, do not specify {$html}
  365.     * nor {$label}.
  366.     *
  367.     * Groups can have special layouts. With this kind of groups, you have to
  368.     * place the formated error message manually. In this case, use {$form.group.error}
  369.     * where you want the formated error message to appear in the form.
  370.     *
  371.     * @param    string      The element error template
  372.     * @access   public
  373.     * @return   void 
  374.     */
  375.     function setErrorTemplate($template)
  376.     {
  377.         $this->_error $template;
  378.     // end func setErrorTemplate
  379. }
  380. ?>

Documentation generated on Mon, 11 Mar 2019 14:46:22 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.