Source for file jFormsBuilderBase.class.php

Documentation is available at jFormsBuilderBase.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  forms
  5. @author      Laurent Jouanneau
  6. @contributor Loic Mathaud, Dominique Papin, Julien Issler
  7. @copyright   2006-2007 Laurent Jouanneau, 2007 Dominique Papin
  8. @copyright   2007 Loic Mathaud
  9. @copyright   2008 Julien Issler
  10. @link        http://www.jelix.org
  11. @licence     http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  12. */
  13.  
  14. /**
  15.  * base class of all builder form classes generated by the jform compiler.
  16.  *
  17.  * a builder form class is a class which help to generate a form for the output
  18.  * (html form for example)
  19.  * @package     jelix
  20.  * @subpackage  forms
  21.  */
  22. abstract class jFormsBuilderBase {
  23.     /**
  24.      * a form object
  25.      * @var jFormsBase 
  26.      */
  27.     protected $_form;
  28.  
  29.     /**
  30.      * the action selector
  31.      * @var string 
  32.      */
  33.     protected $_action;
  34.  
  35.     /**
  36.      * params for the action
  37.      * @var array 
  38.      */
  39.     protected $_actionParams = array();
  40.  
  41.     /**
  42.      * form name
  43.      */
  44.     protected $_name;
  45.  
  46.     protected $_endt = '/>';
  47.     /**
  48.      * @param jFormsBase $form a form object
  49.      * @param string $action action selector where form will be submit
  50.      * @param array $actionParams  parameters for the action
  51.      */
  52.     public function __construct($form$action$actionParams){
  53.         $this->_form = $form;
  54.         $this->_action = $action;
  55.         $this->_actionParams = $actionParams;
  56.         $this->_name = jFormsBuilderBase::generateFormName();
  57.         if($GLOBALS['gJCoord']->response!= null && $GLOBALS['gJCoord']->response->getType(== 'html'){
  58.             $this->_endt = ($GLOBALS['gJCoord']->response->isXhtml()?'/>':'>');
  59.         }
  60.     }
  61.  
  62.     public function getName()return  $this->_name}
  63.  
  64.     /**
  65.      * output the header content of the form
  66.      * @param array $params some parameters, depending of the type of builder
  67.      */
  68.     abstract public function outputHeader($params);
  69.  
  70.     /**
  71.      * output the footer content of the form
  72.      */
  73.     abstract public function outputFooter();
  74.  
  75.     /**
  76.      * displays the content corresponding of the given control
  77.      * @param jFormsControl $ctrl the control to display
  78.      */
  79.     abstract public function outputControl($ctrl);
  80.  
  81.     /**
  82.      * displays the label corresponding of the given control
  83.      * @param jFormsControl $ctrl the control to display
  84.      */
  85.     abstract public function outputControlLabel($ctrl);
  86.  
  87.     /**
  88.      * generates a name for the form
  89.      */
  90.     public static function generateFormName(){
  91.         static $number 0;
  92.         $number++;
  93.         return 'jform'.$number;
  94.     }
  95. }
  96.  
  97.  
  98. /**
  99.  * HTML form builder
  100.  * @package     jelix
  101.  * @subpackage  forms
  102.  */
  103. abstract class jFormsHtmlBuilderBase extends jFormsBuilderBase {
  104.  
  105.     /**
  106.      * output the header content of the form
  107.      * @param array $params some parameters 0=>name of the javascript error decorator
  108.      *     1=> name of the javascript help decorator
  109.      *     2=> name of method
  110.      */
  111.     public function outputHeader($params){
  112.         $url jUrl::get($this->_action$this->_actionParams2)// retourne le jurl correspondant
  113.         $method (strtolower($params[2])=='get')?'get':'post';
  114.         echo '<form action="',$url->getPath(),'" method="'.$method.'" id="'$this->_name,'" onsubmit="return jForms.verifyForm(this)"';
  115.         if($this->_form->hasUpload())
  116.             echo ' enctype="multipart/form-data">';
  117.         else
  118.             echo '>';
  119.  
  120.         if(count($url->params)){
  121.             echo '<div>';
  122.             foreach ($url->params as $p_name => $p_value{
  123.                 echo '<input type="hidden" name="'$p_name ,'" value="'htmlspecialchars($p_value)'"',$this->_endt"\n";
  124.             }
  125.             echo '</div>';
  126.         }
  127.         echo '<script type="text/javascript">
  128. //<![CDATA[
  129. '$this->getJavascriptCheck($params[0],$params[1]),'
  130. //]]>
  131. </script>';
  132.         $errors $this->_form->getContainer()->errors;
  133.         if(count($errors)){
  134.             $ctrls $this->_form->getControls();
  135.             echo '<ul class="jforms-error-list">';
  136.             $errRequired='';
  137.             foreach($errors as $cname => $err){
  138.                 if($err == jForms::ERRDATA_REQUIRED{
  139.                     if($ctrls[$cname]->alertRequired){
  140.                         echo '<li>'$ctrls[$cname]->alertRequired,'</li>';
  141.                     }else{
  142.                         echo '<li>'jLocale::get('jelix~formserr.js.err.required'$ctrls[$cname]->label),'</li>';
  143.                     }
  144.                 }elseif ($err != '' && $err != jForms::ERRDATA_INVALID{
  145.                     echo '<li>'$err,'</li>';
  146.                 }else{
  147.                     if($ctrls[$cname]->alertInvalid){
  148.                         echo '<li>'$ctrls[$cname]->alertInvalid,'</li>';
  149.                     }else{
  150.                         echo '<li>'jLocale::get('jelix~formserr.js.err.invalid'$ctrls[$cname]->label),'</li>';
  151.                     }
  152.                 }
  153.  
  154.             }
  155.             echo '</ul>';
  156.         }
  157.     }
  158.  
  159.     public function outputFooter(){
  160.         echo '</form>';
  161.     }
  162.  
  163.     public function outputControlLabel($ctrl){
  164.         $required ($ctrl->required == ''?'':' jforms-required');
  165.         $inError (isset($this->_form->getContainer()->errors[$ctrl->ref]?' jforms-error':'');
  166.         $hint ($ctrl->hint == ''?'':' title="'.htmlspecialchars($ctrl->hint).'"');
  167.         if($ctrl->type == 'output' || $ctrl->type == 'checkboxes' || $ctrl->type == 'radiobuttons'){
  168.             echo '<span class="jforms-label',$required,$inError,'"',$hint,'>',htmlspecialchars($ctrl->label),'</span>';
  169.         }else if($ctrl->type != 'submit' && $ctrl->type != 'reset'){
  170.             $id $this->_name.'_'.$ctrl->ref;
  171.             echo '<label class="jforms-label',$required,$inError,'" for="'.$id.'"',$hint,'>'.htmlspecialchars($ctrl->label).'</label>';
  172.         }
  173.     }
  174.  
  175.     public function outputControl($ctrl){
  176.         $id ' name="'.$ctrl->ref.'" id="'.$this->_name.'_'.$ctrl->ref.'"';
  177.         $readonly ($ctrl->readonly?' readonly="readonly"':'');
  178.         $hint ($ctrl->hint == ''?'':' title="'.htmlspecialchars($ctrl->hint).'"');
  179.         $class (isset($this->_form->getContainer()->errors[$ctrl->ref]?' class="jforms-error"':'');
  180.         switch($ctrl->type){
  181.         case 'input':
  182.             $value $this->_form->getData($ctrl->ref);
  183.             $size ($ctrl->size == 0?'' ' size="'.$ctrl->size.'"');
  184.             echo '<input type="text"',$id,$readonly,$hint,$class,$size,' value="',htmlspecialchars($value),'"',$this->_endt;
  185.             break;
  186.         case 'checkbox':
  187.             $value $this->_form->getData($ctrl->ref);
  188.  
  189.             if($ctrl->valueOnCheck == $value){
  190.                 $v=' checked="checked"';
  191.             }else{
  192.                 $v='';
  193.             }
  194.             echo '<input type="checkbox"',$id,$readonly,$hint,$class,$v,' value="',$ctrl->valueOnCheck,'"',$this->_endt;
  195.             break;
  196.         case 'checkboxes':
  197.             $i=0;
  198.             $id=$this->_name.'_'.$ctrl->ref.'_';
  199.             $attrs=' name="'.$ctrl->ref.'[]" id="'.$id;
  200.             $value $this->_form->getData($ctrl->ref);
  201.  
  202.             if(is_array($value&& count($value== 1)
  203.                 $value $value[0];
  204.             $span ='<span class="jforms-chkbox jforms-ctl-'.$ctrl->ref.'"><input type="checkbox"';
  205.  
  206.             if(is_array($value)){
  207.                 $value array_map(create_function('$v''return (string) $v;'),$value);
  208.                 foreach($ctrl->datasource->getDatas(as $v=>$label){
  209.                     echo $span,$attrs,$i,'" value="',htmlspecialchars($v),'"';
  210.                     if(in_array((string) $v,$value,true))
  211.                         echo ' checked="checked"';
  212.                     echo $readonly,$class,$this->_endt,'<label for="',$id,$i,'">',htmlspecialchars($label),'</label></span>';
  213.                     $i++;
  214.                 }
  215.             }else{
  216.                 $value = (string) $value;
  217.                 foreach($ctrl->datasource->getDatas(as $v=>$label){
  218.                     echo $span,$attrs,$i,'" value="',htmlspecialchars($v),'"';
  219.                     if((string) $v === $value)
  220.                         echo ' checked="checked"';
  221.                     echo $readonly,$class,$this->_endt,'<label for="',$id,$i,'">',htmlspecialchars($label),'</label></span>';
  222.                     $i++;
  223.                 }
  224.             }
  225.             break;
  226.         case 'radiobuttons':
  227.             $i=0;
  228.             $id=' name="'.$ctrl->ref.'" id="'.$this->_name.'_'.$ctrl->ref.'_';
  229.             $value $this->_form->getData($ctrl->ref);
  230.             if(is_array($value)){
  231.                 if(isset($value[0]))
  232.                     $value $value[0];
  233.                 else
  234.                     $value='';
  235.             }
  236.             $value = (string) $value;
  237.             $span ='<span class="jforms-radio jforms-ctl-'.$ctrl->ref.'"><input type="radio"';
  238.             foreach($ctrl->datasource->getDatas(as $v=>$label){
  239.                 echo $span,$id,$i,'" value="',htmlspecialchars($v),'"',((string) $v===$value?' checked="checked"':''),$readonly,$class,$this->_endt;
  240.                 echo '<label for="',$this->_name,'_',$ctrl->ref,'_',$i,'">',htmlspecialchars($label),'</label></span>';
  241.                 $i++;
  242.             }
  243.             break;
  244.         case 'menulist':
  245.             echo '<select',$id,$hint,$class,' size="1">';
  246.             $value $this->_form->getData($ctrl->ref);
  247.             if(is_array($value)){
  248.                 if(isset($value[0]))
  249.                     $value $value[0];
  250.                 else
  251.                     $value='';
  252.             }
  253.             $value = (string) $value;
  254.             if (!$ctrl->required{
  255.                 echo '<option value=""',($value===''?' selected="selected"':''),'></option>';
  256.             }
  257.             foreach($ctrl->datasource->getDatas(as $v=>$label){
  258.                 echo '<option value="',htmlspecialchars($v),'"',((string) $v===$value?' selected="selected"':''),'>',htmlspecialchars($label),'</option>';
  259.             }
  260.             echo '</select>';
  261.             break;
  262.         case 'listbox':
  263.             if($ctrl->multiple){
  264.                 echo '<select name="',$ctrl->ref,'[]" id="',$this->_name,'_',$ctrl->ref,'"',$hint,$class,' size="',$ctrl->size,'" multiple="multiple">';
  265.                 $value $this->_form->getData($ctrl->ref);
  266.  
  267.                 if(is_array($value&& count($value== 1)
  268.                     $value $value[0];
  269.  
  270.                 if(is_array($value)){
  271.                     $value array_map(create_function('$v''return (string) $v;'),$value);
  272.                     foreach($ctrl->datasource->getDatas(as $v=>$label){
  273.                         echo '<option value="',htmlspecialchars($v),'"',(in_array((string) $v,$value,true)?' selected="selected"':''),'>',htmlspecialchars($label),'</option>';
  274.                     }
  275.                 }else{
  276.                     $value = (string) $value;
  277.                     foreach($ctrl->datasource->getDatas(as $v=>$label){
  278.                         echo '<option value="',htmlspecialchars($v),'"',((string) $v===$value?' selected="selected"':''),'>',htmlspecialchars($label),'</option>';
  279.                     }
  280.                 }
  281.                 echo '</select>';
  282.             }else{
  283.                 $value $this->_form->getData($ctrl->ref);
  284.  
  285.                 if(is_array($value)){
  286.                     if(count($value>= 1)
  287.                         $value $value[0];
  288.                     else
  289.                         $value ='';
  290.                 }
  291.                 $value = (string) $value;
  292.                 echo '<select',$id,$hint,$class,' size="',$ctrl->size,'">';
  293.                 foreach($ctrl->datasource->getDatas(as $v=>$label){
  294.                     echo '<option value="',htmlspecialchars($v),'"',((string) $v===$value?' selected="selected"':''),'>',htmlspecialchars($label),'</option>';
  295.                 }
  296.                 echo '</select>';
  297.             }
  298.             break;
  299.         case 'textarea':
  300.             $value $this->_form->getData($ctrl->ref);
  301.             $rows ' rows="'.$ctrl->rows.'" cols="'.$ctrl->cols.'"';
  302.             echo '<textarea',$id,$readonly,$hint,$class,$rows,'>',htmlspecialchars($value),'</textarea>';
  303.             break;
  304.         case 'secret':
  305.         case 'secretconfirm':
  306.             $size ($ctrl->size == 0?''' size="'.$ctrl->size.'"');
  307.             echo '<input type="password"',$id,$readonly,$hint,$class,$size,' value="',htmlspecialchars($this->_form->getData($ctrl->ref)),'"',$this->_endt;
  308.             break;
  309.         case 'output':
  310.             $value $this->_form->getData($ctrl->ref);
  311.             echo '<input type="hidden"',$id,' value="',htmlspecialchars($value),'"',$this->_endt;
  312.             echo '<span class="jforms-value"',$hint,'>',htmlspecialchars($value),'</span>';
  313.             break;
  314.         case 'upload':
  315.             if($ctrl->maxsize){
  316.                 echo '<input type="hidden" name="MAX_FILE_SIZE" value="',$ctrl->maxsize,'"',$this->_endt;
  317.             }
  318.             echo '<input type="file"',$id,$readonly,$hint,$class,' value=""',$this->_endt// ',htmlspecialchars($this->_form->getData($ctrl->ref)),'
  319.             break;
  320.         case 'submit':
  321.             if($ctrl->standalone){
  322.                 echo '<input type="submit"',$id,$hint,' class="jforms-submit" value="',htmlspecialchars($ctrl->label),'"/>';
  323.             }else{
  324.                 foreach($ctrl->datasource->getDatas(as $v=>$label){
  325.                     // because IE6 sucks with <button type=submit> (see ticket #431), we must use input :-(
  326.                     echo '<input type="submit" name="',$ctrl->ref,'" id="',$this->_name,'_',$ctrl->ref,'_',htmlspecialchars($v),'"',
  327.                         $hint,' class="jforms-submit" value="',htmlspecialchars($label),'"/> ';
  328.                 }
  329.             }
  330.             break;
  331.         case 'reset':
  332.             echo '<button type="reset"',$id,$hint,' class="jforms-reset">',htmlspecialchars($ctrl->label),'</button>';
  333.             break;
  334.         }
  335.  
  336.         if ($ctrl->hasHelp{
  337.             if($ctrl->type == 'checkboxes' || ($ctrl->type == 'listbox' && $ctrl->multiple)){
  338.                 $name=$ctrl->ref.'[]';
  339.             }else{
  340.                 $name=$ctrl->ref;
  341.             }
  342.             echo '<span class="jforms-help"><a href="javascript:jForms.showHelp(\''$this->_name.'\',\''.$name.'\')">?</a></span>';
  343.         }
  344.     }
  345.  
  346.  
  347.     abstract public function getJavascriptCheck($errDecorator,$helpDecorator);
  348. }
  349.  
  350. ?>

Documentation generated on Wed, 07 Sep 2011 13:47:24 +0200 by phpDocumentor 1.4.3