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.10 2005/04/26 07:58:55 ths 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.             preg_match('/([^]]*)\\[([^]]*)\\]/'$ret['name']$matches);
  183.             if (isset($matches[1])) {
  184.                 $sKeysSub substr_replace($ret['name']''0strlen($matches[1]));
  185.                 $sKeysSub str_replace(
  186.                     array('['  ,   ']''[\'\']'),
  187.                     array('[\'''\']''[]'    ),
  188.                     $sKeysSub
  189.                 );
  190.                 $sKeys '[\'' $matches[1]  '\']' $sKeysSub;
  191.             else {
  192.                 $sKeys '[\'' $ret['name''\']';
  193.             }
  194.             // special handling for elements in native groups
  195.             if ($this->_currentGroup{
  196.                 // skip unnamed group items unless radios: no name -> no static access
  197.                 // identification: have the same key string as the parent group
  198.                 if ($this->_currentGroup['keys'== $sKeys and 'radio' != $ret['type']{
  199.                     return false;
  200.                 }
  201.                 // reduce string of keys by remove leading group keys
  202.                 if (0 === strpos($sKeys$this->_currentGroup['keys'])) {
  203.                     $sKeys substr_replace($sKeys''0strlen($this->_currentGroup['keys']));
  204.                 }
  205.             }
  206.         // element without a name
  207.         elseif ($ret['name'== ''{
  208.             $sKeys '[\'element_' $this->_elementIdx '\']';
  209.         // other elements
  210.         else {
  211.             $sKeys '[\'' $ret['name''\']';
  212.         }
  213.         // for radios: add extra key from value
  214.         if ('radio' == $ret['type'and substr($sKeys-2!= '[]'{
  215.             $sKeys .= '[\'' $ret['value''\']';
  216.         }
  217.         $this->_elementIdx++;
  218.         $ret['keys'$sKeys;
  219.         return $ret;
  220.     // end func _elementToArray
  221.  
  222.    /**
  223.     * Stores an array representation of an element in the form array
  224.     *
  225.     * @access private
  226.     * @param array  Array representation of an element
  227.     * @return void 
  228.     */
  229.     function _storeArray($elAry)
  230.     {
  231.         if ($elAry{
  232.             $sKeys $elAry['keys'];
  233.             unset($elAry['keys']);
  234.             // where should we put this element...
  235.             if (is_array($this->_currentGroup&& ('group' != $elAry['type'])) {
  236.                 $toEval '$this->_currentGroup' $sKeys ' = $elAry;';
  237.             else {
  238.                 $toEval '$this->_ary' $sKeys ' = $elAry;';
  239.             }
  240.             eval($toEval);
  241.         }
  242.         return;
  243.     }
  244.  
  245.    /**
  246.     * Called when an element is required
  247.     *
  248.     * This method will add the required tag to the element label and/or the element html
  249.     * such as defined with the method setRequiredTemplate.
  250.     *
  251.     * @param    string      The element label
  252.     * @param    string      The element html rendering
  253.     * @param    boolean     The element required
  254.     * @param    string      The element error
  255.     * @see      setRequiredTemplate()
  256.     * @access   private
  257.     * @return   void 
  258.     */
  259.     function _renderRequired(&$label&$html&$required&$error)
  260.     {
  261.         $this->_tpl->assign(array(
  262.             'label'    => $label,
  263.             'html'     => $html,
  264.             'required' => $required,
  265.             'error'    => $error
  266.         ));
  267.         if (!empty($label&& strpos($this->_required$this->_tpl->left_delimiter . '$label'!== false{
  268.             $label $this->_tplFetch($this->_required);
  269.         }
  270.         if (!empty($html&& strpos($this->_required$this->_tpl->left_delimiter . '$html'!== false{
  271.             $html $this->_tplFetch($this->_required);
  272.         }
  273.         $this->_tpl->clear_assign(array('label''html''required'));
  274.     // end func _renderRequired
  275.  
  276.    /**
  277.     * Called when an element has a validation error
  278.     *
  279.     * This method will add the error message to the element label or the element html
  280.     * such as defined with the method setErrorTemplate. If the error placeholder is not found
  281.     * in the template, the error will be displayed in the form error block.
  282.     *
  283.     * @param    string      The element label
  284.     * @param    string      The element html rendering
  285.     * @param    string      The element error
  286.     * @see      setErrorTemplate()
  287.     * @access   private
  288.     * @return   void 
  289.     */
  290.     function _renderError(&$label&$html&$error)
  291.     {
  292.         $this->_tpl->assign(array('label' => '''html' => '''error' => $error));
  293.         $error $this->_tplFetch($this->_error);
  294.         $this->_tpl->assign(array('label' => $label'html'  => $html));
  295.  
  296.         if (!empty($label&& strpos($this->_error$this->_tpl->left_delimiter . '$label'!== false{
  297.             $label $this->_tplFetch($this->_error);
  298.         elseif (!empty($html&& strpos($this->_error$this->_tpl->left_delimiter . '$html'!== false{
  299.             $html $this->_tplFetch($this->_error);
  300.         }
  301.         $this->_tpl->clear_assign(array('label''html''error'));
  302.     // end func _renderError
  303.  
  304.    /**
  305.     * Process an template sourced in a string with Smarty
  306.     *
  307.     * Smarty has no core function to render    a template given as a string.
  308.     * So we use the smarty eval plugin function    to do this.
  309.     *
  310.     * @param    string      The template source
  311.     * @access   private
  312.     * @return   void 
  313.     */
  314.     function _tplFetch($tplSource)
  315.     {
  316.         if (!function_exists('smarty_function_eval')) {
  317.             require SMARTY_DIR . '/plugins/function.eval.php';
  318.         }
  319.         return smarty_function_eval(array('var' => $tplSource)$this->_tpl);
  320.     }// end func _tplFetch
  321.  
  322.    /**
  323.     * Sets the way required elements are rendered
  324.     *
  325.     * You can use {$label} or {$html} placeholders to let the renderer know where
  326.     * where the element label or the element html are positionned according to the
  327.     * required tag. They will be replaced accordingly with the right value.    You
  328.     * can use the full smarty syntax here, especially a custom modifier for I18N.
  329.     * For example:
  330.     * {if $required}<span style="color: red;">*</span>{/if}{$label|translate}
  331.     * will put a red star in front of the label if the element is required and
  332.     * translate the label.
  333.     *
  334.     *
  335.     * @param    string      The required element template
  336.     * @access   public
  337.     * @return   void 
  338.     */
  339.     function setRequiredTemplate($template)
  340.     {
  341.         $this->_required $template;
  342.     // end func setRequiredTemplate
  343.  
  344.    /**
  345.     * Sets the way elements with validation errors are rendered
  346.     *
  347.     * You can use {$label} or {$html} placeholders to let the renderer know where
  348.     * where the element label or the element html are positionned according to the
  349.     * error message. They will be replaced accordingly with the right value.
  350.     * The error message will replace the {$error} placeholder.
  351.     * For example:
  352.     * {if $error}<span style="color: red;">{$error}</span>{/if}<br />{$html}
  353.     * will put the error message in red on top of the element html.
  354.     *
  355.     * If you want all error messages to be output in the main error block, use
  356.     * the {$form.errors} part of the rendered array that collects all raw error
  357.     * messages.
  358.     *
  359.     * If you want to place all error messages manually, do not specify {$html}
  360.     * nor {$label}.
  361.     *
  362.     * Groups can have special layouts. With this kind of groups, you have to
  363.     * place the formated error message manually. In this case, use {$form.group.error}
  364.     * where you want the formated error message to appear in the form.
  365.     *
  366.     * @param    string      The element error template
  367.     * @access   public
  368.     * @return   void 
  369.     */
  370.     function setErrorTemplate($template)
  371.     {
  372.         $this->_error $template;
  373.     // end func setErrorTemplate
  374. }
  375. ?>

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