Source for file jFormsBase.class.php

Documentation is available at jFormsBase.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  forms
  5. @author      Laurent Jouanneau
  6. @contributor Dominique Papin
  7. @contributor Bastien Jaillot, Steven Jehannet
  8. @contributor Christophe Thiriot, Julien Issler
  9. @copyright   2006-2009 Laurent Jouanneau, 2007 Dominique Papin, 2008 Bastien Jaillot, 2010 Steven Jehannet
  10. @copyright   2008 Julien Issler
  11. @link        http://www.jelix.org
  12. @licence     http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  13. */
  14.  
  15. /**
  16.  *
  17.  */
  18. require(JELIX_LIB_PATH.'forms/jFormsControl.class.php');
  19. require(JELIX_LIB_PATH.'forms/jFormsDatasource.class.php');
  20. require(JELIX_LIB_UTILS_PATH.'jDatatype.class.php');
  21.  
  22. /**
  23.  * exception for jforms
  24.  * @package     jelix
  25.  * @subpackage  forms
  26.  */
  27. class jExceptionForms extends jException {
  28.  
  29. }
  30.  
  31. /**
  32.  * base class of all form classes generated by the jform compiler
  33.  * @package     jelix
  34.  * @subpackage  forms
  35.  */
  36. abstract class jFormsBase {
  37.     
  38.     const SECURITY_LOW = 0;
  39.     const SECURITY_CSRF = 1;
  40.  
  41.     public $securityLevel = 1;
  42.  
  43.     /**
  44.      * List of all form controls
  45.      * array of jFormsControl objects
  46.      * @var array 
  47.      * @see jFormsControl
  48.      */
  49.     protected $controls = array();
  50.  
  51.     /**
  52.      * List of top controls
  53.      * array of jFormsControl objects
  54.      * @var array 
  55.      * @see jFormsControl
  56.      */
  57.     protected $rootControls = array();
  58.  
  59.     /**
  60.      * List of submit buttons
  61.      * array of jFormsControl objects
  62.      * @var array 
  63.      * @see jFormsControl
  64.      */
  65.     protected $submits = array();
  66.  
  67.     /**
  68.      * Reset button
  69.      * @var jFormsControl 
  70.      * @see jFormsControl
  71.      * @since 1.0
  72.      */
  73.     protected $reset = null;
  74.  
  75.     /**
  76.      * List of uploads controls
  77.      * array of jFormsControl objects
  78.      * @var array 
  79.      * @see jFormsControl
  80.      */
  81.     protected $uploads = array();
  82.  
  83.     /**
  84.      * List of hidden controls
  85.      * array of jFormsControl objects
  86.      * @var array 
  87.      * @see jFormsControl
  88.      */
  89.     protected $hiddens = array();
  90.  
  91.     /**
  92.      * List of htmleditorcontrols
  93.      * array of jFormsControl objects
  94.      * @var array 
  95.      * @see jFormsControl
  96.      */
  97.     protected $htmleditors = array();
  98.  
  99.     /**
  100.      * the data container
  101.      * @var jFormsDataContainer 
  102.      */
  103.     protected $container = null;
  104.  
  105.     /**
  106.      * content list of available form builder
  107.      * @var boolean 
  108.      */
  109.     protected $builders = array();
  110.  
  111.     /**
  112.      * the form selector
  113.      * @var string 
  114.      */
  115.     protected $sel;
  116.  
  117.     /**
  118.      * @param string $sel the form selector
  119.      * @param jFormsDataContainer $container the data container
  120.      * @param boolean $reset says if the data should be reset
  121.      */
  122.     public function __construct($sel$container$reset false){
  123.         $this->container = $container;
  124.         if($reset){
  125.             $this->container->clear();
  126.         }
  127.         $this->container->updatetime = time();
  128.         $this->sel = $sel;
  129.     }
  130.  
  131.     public function getSelector({
  132.         return $this->sel;
  133.     }
  134.  
  135.     /**
  136.      * set form data from request parameters
  137.      */
  138.     public function initFromRequest(){
  139.         $req $GLOBALS['gJCoord']->request;
  140.         if ($this->securityLevel == jFormsBase::SECURITY_CSRF{
  141.             if ($this->container->token !== $req->getParam('__JFORMS_TOKEN__'))
  142.                 throw new jException("jelix~formserr.invalid.token");
  143.         }
  144.  
  145.         foreach($this->rootControls as $name=>$ctrl){
  146.             if(!$this->container->isActivated($name|| $this->container->isReadOnly($name))
  147.                 continue;
  148.             $ctrl->setValueFromRequest($req);
  149.         }
  150.     }
  151.  
  152.     /**
  153.      * check validity of all data form
  154.      * @return boolean true if all is ok
  155.      */
  156.     public function check(){
  157.         $this->container->errors = array();
  158.         foreach($this->rootControls as $name=>$ctrl){
  159.             if($this->container->isActivated($name))
  160.                 $ctrl->check();
  161.         }
  162.         return count($this->container->errors== 0;
  163.     }
  164.  
  165.     /**
  166.      * prepare an object with values of all controls
  167.      * @param object $object the object to fill
  168.      * @param array $properties array of 'propertyname'=>array('required'=>true/false,
  169.      *                           'defaultValue'=>$value, 'datatype'=>$datatype)
  170.      *    values of datatype = same as dao datatypes = ex: 'string', 'int','integer','double','float','boolean','datetime','date'
  171.      */
  172.     public function prepareObjectFromControls($object$properties null){
  173.         if ($properties == null{
  174.             $properties get_object_vars($object);
  175.             foreach($properties as $n=>$v{
  176.                 if (!is_null($v)) {
  177.                     $r true;
  178.                     $t gettype($v);
  179.                 }
  180.                 else {
  181.                     $t 'string';
  182.                     $r false;
  183.                 }
  184.                 $properties[$n]=array('required'=>$r'defaultValue'=>$v'datatype'=>$t);
  185.             }
  186.         }
  187.         
  188.         foreach($this->controls as $name=>$ctrl){
  189.             if(!isset($properties[$name]))
  190.                 continue;
  191.  
  192.             if(is_array($this->container->data[$name])){
  193.                 if (count($this->container->data[$name]==1{
  194.                     $object->$name $this->container->data[$name][0];
  195.                 }
  196.                 else
  197.                     // do nothing for arrays ?
  198.                     continue;
  199.             }
  200.             else{
  201.                 $object->$name $this->container->data[$name];
  202.             }
  203.  
  204.             if($object->$name == '' && !$properties[$name]['required']{
  205.                 // if no value and if the property is not required, we set null to it
  206.                 $object->$name null;
  207.             }
  208.             else if($object->$name == '' && $properties[$name]['defaultValue'!== null
  209.                     && in_array($properties[$name]['datatype'],
  210.                                 array('int','integer','double','float'))) {
  211.                 $object->$name $properties[$name]['defaultValue'];
  212.             }
  213.             else if$properties[$name]['datatype'== 'boolean' && !is_bool($object->$name)) {
  214.                 $object->$name (intval($object->$name== 1|| strtolower($object->$name=== 'true'
  215.                                   || $object->$name === 't' || $object->$name === 'on');
  216.             }
  217.             else if($ctrl->datatype instanceof jDatatypeLocaleDateTime
  218.                      && $properties[$name]['datatype'== 'datetime'{
  219.                 $dt new jDateTime();
  220.                 $dt->setFromString($object->$namejDateTime::LANG_DTFORMAT);
  221.                 $object->$name $dt->toString(jDateTime::DB_DTFORMAT);
  222.             }
  223.             elseif($ctrl->datatype instanceof jDatatypeLocaleDate
  224.                     && $properties[$name]['datatype'== 'date'{
  225.                 $dt new jDateTime();
  226.                 $dt->setFromString($object->$namejDateTime::LANG_DFORMAT);
  227.                 $object->$name $dt->toString(jDateTime::DB_DFORMAT);
  228.             }
  229.         }
  230.     }
  231.  
  232.     /**
  233.      * set form data from a DAO
  234.      * @param string $daoSelector the selector of a dao file
  235.      * @param string $key the primary key for the dao. if null, takes the form ID as primary key
  236.      * @param string $dbProfile the jDb profile to use with the dao
  237.      * @see jDao
  238.      * @return jDaoRecordBase 
  239.      */
  240.     public function initFromDao($daoSelector$key null$dbProfile=''){
  241.         if($key === null)
  242.             $key $this->container->formId;
  243.         $dao jDao::create($daoSelector$dbProfile);
  244.         $daorec $dao->get($key);
  245.         if(!$daorec{
  246.             if(is_array($key))
  247.                 $key var_export($key,true);
  248.             throw new jExceptionForms('jelix~formserr.bad.formid.for.dao',
  249.                                       array($daoSelector$key$this->sel));
  250.         }
  251.  
  252.         $prop $dao->getProperties();
  253.         foreach($this->controls as $name=>$ctrl){
  254.             if(isset($prop[$name])) {
  255.                 $ctrl->setDataFromDao($daorec->$name$prop[$name]['datatype']);
  256.             }
  257.         }
  258.         return $daorec;
  259.     }
  260.  
  261.     /**
  262.      * prepare a dao with values of all controls
  263.      * @param string $daoSelector the selector of a dao file
  264.      * @param string $key the primary key for the dao. if null, takes the form ID as primary key
  265.      * @param string $dbProfile the jDb profile to use with the dao
  266.      * @return mixed return three vars : $daorec, $dao, $toInsert which have to be extracted
  267.      * @see jDao
  268.      */
  269.     public function prepareDaoFromControls($daoSelector$key null$dbProfile=''){
  270.         $dao jDao::get($daoSelector$dbProfile);
  271.  
  272.         if($key === null)
  273.             $key $this->container->formId;
  274.  
  275.         if($key != null && ($daorec $dao->get($key))) {
  276.             $toInsertfalse;
  277.         }else{
  278.             $daorec jDao::createRecord($daoSelector$dbProfile);
  279.             if($key != null)
  280.                 $daorec->setPk($key);
  281.             $toInserttrue;
  282.         }
  283.         $this->prepareObjectFromControls($daorec$dao->getProperties());
  284.         return compact("daorec""dao""toInsert");
  285.     }
  286.  
  287.     /**
  288.      * save data using a dao.
  289.      * it call insert or update depending the value of the formId stored in the container
  290.      * @param string $daoSelector the selector of a dao file
  291.      * @param string $key the primary key for the dao. if null, takes the form ID as primary key
  292.      * @param string $dbProfile the jDb profile to use with the dao
  293.      * @return mixed  the primary key of the new record in a case of inserting
  294.      * @see jDao
  295.      */
  296.     public function saveToDao($daoSelector$key null$dbProfile=''){
  297.         $results $this->prepareDaoFromControls($daoSelector,$key,$dbProfile);
  298.         extract($results)//use a temp variable to avoid notices
  299.         if($toInsert){
  300.             // todo : what about updating the formId with the Pk ?
  301.             $dao->insert($daorec);
  302.         }else{
  303.             $dao->update($daorec);
  304.         }
  305.         return $daorec->getPk();
  306.     }
  307.  
  308.     /**
  309.      * set data from a DAO, in a control
  310.      *
  311.      * The control must be a container like checkboxes or listbox with multiple attribute.
  312.      * The form should contain a formId
  313.      *
  314.      * The Dao should map to an "association table" : its primary key should be composed by
  315.      * the primary key stored in the formId (or the given primarykey) + the field which will contain one of
  316.      * the values of the control. If this order is not the same as defined into the dao,
  317.      * you should provide the list of property names which corresponds to the primary key
  318.      * in this order : properties for the formId, followed by the property which contains
  319.      * the value.
  320.      * @param string $name  the name of the control
  321.      * @param string $daoSelector the selector of a dao file
  322.      * @param mixed  $primaryKey the primary key if the form have no id. (optional)
  323.      * @param mixed  $primaryKeyNames list of field corresponding to primary keys (optional)
  324.      * @param string $dbProfile the jDb profile to use with the dao
  325.      * @see jDao
  326.      */
  327.     public function initControlFromDao($name$daoSelector$primaryKey null$primaryKeyNames=null$dbProfile=''){
  328.  
  329.         if(!$this->controls[$name]->isContainer()){
  330.             throw new jExceptionForms('jelix~formserr.control.not.container'array($name$this->sel));
  331.         }
  332.  
  333.         if(!$this->container->formId)
  334.             throw new jExceptionForms('jelix~formserr.formid.undefined.for.dao'array($name$this->sel));
  335.  
  336.         if($primaryKey === null)
  337.             $primaryKey $this->container->formId;
  338.  
  339.         if(!is_array($primaryKey))
  340.             $primaryKey =array($primaryKey);
  341.  
  342.         $dao jDao::create($daoSelector$dbProfile);
  343.  
  344.         $conditions jDao::createConditions();
  345.         if($primaryKeyNames)
  346.             $pkNamelist $primaryKeyNames;
  347.         else
  348.             $pkNamelist $dao->getPrimaryKeyNames();
  349.  
  350.         foreach($primaryKey as $k=>$pk){
  351.             $conditions->addCondition ($pkNamelist[$k]'='$pk);
  352.         }
  353.  
  354.         $results $dao->findBy($conditions);
  355.         $valuefield $pkNamelist[$k+1];
  356.         $val array();
  357.         foreach($results as $res){
  358.             $val[]=$res->$valuefield;
  359.         }
  360.         $this->controls[$name]->setData($val);
  361.     }
  362.  
  363.  
  364.     /**
  365.      * save data of a control using a dao.
  366.      *
  367.      * The control must be a container like checkboxes or listbox with multiple attribute.
  368.      * If the form contain a new record (no formId), you should call saveToDao before
  369.      * in order to get a new id (the primary key of the new record), or you should get a new id
  370.      * by an other way. then you must pass this primary key in the third argument.
  371.      * If the form has already a formId, then it will be used as a primary key, unless
  372.      * you give one in the third argument.
  373.      *
  374.      * The Dao should map to an "association table" : its primary key should be
  375.      * the primary key stored in the formId + the field which will contain one of
  376.      * the values of the control. If this order is not the same as defined into the dao,
  377.      * you should provide the list of property names which corresponds to the primary key
  378.      * in this order : properties for the formId, followed by the property which contains
  379.      * the value.
  380.      * All existing records which have the formid in their keys are deleted
  381.      * before to insert new values.
  382.      *
  383.      * @param string $controlName  the name of the control
  384.      * @param string $daoSelector the selector of a dao file
  385.      * @param mixed  $primaryKey the primary key if the form have no id. (optional)
  386.      * @param mixed  $primaryKeyNames list of field corresponding to primary keys (optional)
  387.      * @param string $dbProfile the jDb profile to use with the dao
  388.      * @see jDao
  389.      */
  390.     public function saveControlToDao($controlName$daoSelector$primaryKey null$primaryKeyNames=null$dbProfile=''){
  391.  
  392.         if(!$this->controls[$controlName]->isContainer()){
  393.             throw new jExceptionForms('jelix~formserr.control.not.container'array($controlName$this->sel));
  394.         }
  395.  
  396.         $values $this->container->data[$controlName];
  397.         if(!is_array($values&& $values != '')
  398.             throw new jExceptionForms('jelix~formserr.value.not.array'array($controlName$this->sel));
  399.  
  400.         if(!$this->container->formId && !$primaryKey)
  401.             throw new jExceptionForms('jelix~formserr.formid.undefined.for.dao'array($controlName$this->sel));
  402.  
  403.         if($primaryKey === null)
  404.             $primaryKey $this->container->formId;
  405.  
  406.         if(!is_array($primaryKey))
  407.             $primaryKey =array($primaryKey);
  408.  
  409.         $dao jDao::create($daoSelector$dbProfile);
  410.         $daorec jDao::createRecord($daoSelector$dbProfile);
  411.  
  412.         $conditions jDao::createConditions();
  413.         if($primaryKeyNames)
  414.             $pkNamelist $primaryKeyNames;
  415.         else
  416.             $pkNamelist $dao->getPrimaryKeyNames();
  417.  
  418.         foreach($primaryKey as $k=>$pk){
  419.             $conditions->addCondition ($pkNamelist[$k]'='$pk);
  420.             $daorec->{$pkNamelist[$k]$pk;
  421.         }
  422.  
  423.         $dao->deleteBy($conditions);
  424.         if (is_array($values)) {
  425.             $valuefield $pkNamelist[$k+1];
  426.             foreach($values as $value){
  427.                 $daorec->$valuefield $value;
  428.                 $dao->insert($daorec);
  429.             }
  430.         }
  431.     }
  432.  
  433.     /**
  434.      * return list of errors found during the check
  435.      * @return array 
  436.      * @see jFormsBase::check
  437.      */
  438.     public function getErrors(){  return $this->container->errors;  }
  439.  
  440.     /**
  441.      * set an error message on a specific field
  442.      * @param string $field the field name
  443.      * @param string $mesg  the error message string
  444.      */
  445.     public function setErrorOn($field$mesg){
  446.         $this->container->errors[$field]=$mesg;
  447.     }
  448.  
  449.     /**
  450.      *
  451.      * @param string $name the name of the control/data
  452.      * @param string $value the data value
  453.      */
  454.     public function setData($name$value{
  455.         $this->controls[$name]->setData($value);
  456.     }
  457.  
  458.     /**
  459.      *
  460.      * @param string $name the name of the  control/data
  461.      * @return string the data value
  462.      */
  463.     public function getData($name{
  464.         if(isset($this->container->data[$name]))
  465.             return $this->container->data[$name];
  466.         else return null;
  467.     }
  468.  
  469.     /**
  470.      * @return array form data
  471.      */
  472.     public function getAllData()return $this->container->data}
  473.  
  474.     /**
  475.      * DEPRECATED, use getAllData() instead.
  476.      * @return array form data
  477.      * @deprecated since 1.1
  478.      */
  479.     public function getDatas(){
  480.         trigger_error('jFormsBase::getDatas is deprecated, use getAllData instead',E_USER_NOTICE);
  481.         return $this->container->data;
  482.     }
  483.  
  484.     /**
  485.      * deactivate (or reactivate) a control
  486.      * When a control is deactivated, it is not displayes anymore in the output form
  487.      * @param string $name  the name of the control
  488.      * @param boolean $deactivation   TRUE to deactivate, or FALSE to reactivate
  489.      */
  490.     public function deactivate($name$deactivation=true{
  491.         $this->controls[$name]->deactivate($deactivation);
  492.     }
  493.  
  494.     /**
  495.     * check if a control is activated
  496.     * @param $name the control name
  497.     * @return boolean true if it is activated
  498.     */
  499.     public function isActivated($name{
  500.         return $this->container->isActivated($name);
  501.     }
  502.  
  503.  
  504.     /**
  505.      * set a control readonly or not
  506.      * @param boolean $r true if you want read only
  507.      */
  508.     public function setReadOnly($name$r true{
  509.         $this->controls[$name]->setReadOnly($r);
  510.     }
  511.  
  512.     /**
  513.      * check if a control is readonly
  514.      * @return boolean true if it is readonly
  515.      */
  516.     public function isReadOnly($name{
  517.         return $this->container->isReadOnly($name);
  518.     }
  519.  
  520.     /**
  521.      * @return jFormsDataContainer 
  522.      */
  523.     public function getContainer()return $this->container}
  524.  
  525.  
  526.     /**
  527.      * @return array of jFormsControl objects
  528.      */
  529.     public function getRootControls()return $this->rootControls}
  530.  
  531.     /**
  532.      * @return array of jFormsControl objects
  533.      */
  534.     public function getControls()return $this->controls}
  535.  
  536.     /**
  537.      * @param string $name the control name you want to get
  538.      * @return jFormsControl 
  539.      * @since jelix 1.0
  540.      */
  541.     public function getControl($name{
  542.         if(isset($this->controls[$name]))
  543.             return $this->controls[$name];
  544.         else return null;
  545.     }
  546.  
  547.     /**
  548.      * @return array of jFormsControl objects
  549.      */
  550.     public function getSubmits()return $this->submits}
  551.  
  552.      /**
  553.      * @return array of jFormsControl objects
  554.      * @since 1.1
  555.      */
  556.     public function getHiddens()return $this->hiddens}
  557.  
  558.      /**
  559.      * @return array of jFormsControl objects
  560.      * @since 1.1
  561.      */
  562.     public function getHtmlEditors()return $this->htmleditors}
  563.  
  564.     /**
  565.      * call this method after initilization of the form, in order to track
  566.      * modified controls
  567.      * @since 1.1
  568.      */
  569.     public function initModifiedControlsList(){
  570.         $this->container->originalData $this->container->data;
  571.     }
  572.  
  573.     /**
  574.      * DEPRECATED. use initModifiedControlsList() instead.
  575.      * @since 1.1b1
  576.      * @deprecated 1.1rc1
  577.      */
  578.     public function resetModifiedControlsList(){
  579.         $this->initModifiedControlsList();
  580.     }
  581.  
  582.     /**
  583.      * returns the old values of the controls which have been modified since
  584.      * the call of the method initModifiedControlsList()
  585.      * @return array key=control id,  value=old value
  586.      * @since 1.1
  587.      */
  588.     public function getModifiedControls(){
  589.         if (count($this->container->originalData)) {
  590.  
  591.             // we musn't use array_diff_assoc because it convert array values
  592.             // to "Array" before comparison, so these values are always equal for it.
  593.             // We shouldn't use array_udiff_assoc  because it crashes PHP, at least on
  594.             // some PHP version.
  595.             // so we have to compare by ourself.
  596.  
  597.             $result array();
  598.             $orig $this->container->originalData;
  599.             foreach($this->container->data as $k=>$v1{
  600.                 
  601.                 if (!array_key_exists($k$orig)) {
  602.                     continue;
  603.                 }
  604.                 
  605.                 if($this->_diffValues($orig[$k]$v1))  {
  606.                     $result[$k$orig[$k];
  607.                     continue;
  608.                 }
  609.             }
  610.             return $result;
  611.         }
  612.         else
  613.             return $this->container->data;
  614.     }
  615.  
  616.     protected function _diffValues(&$v1&$v2{
  617.         if (is_array($v1&& is_array($v2)) {
  618.             $comp array_merge(array_diff($v1$v2),array_diff($v2$v1));
  619.             return !empty($comp);
  620.         }
  621.         elseif(empty($v1&& empty($v2)){
  622.             return false;
  623.         }
  624.         elseif (is_array($v1|| is_array($v2)) {
  625.             return true;
  626.         }
  627.         else {
  628.             return !($v1==$v2);
  629.             //return !($v2== (string)$v1);
  630.         }
  631.     }
  632.  
  633.     /**
  634.      * @return array of jFormsControl objects
  635.      */
  636.     public function getReset()return $this->reset}
  637.  
  638.     /**
  639.      * @return string the formId
  640.      */
  641.     public function id()return $this->container->formId}
  642.  
  643.     /**
  644.      * @return boolean 
  645.      */
  646.     public function hasUpload(return count($this->uploads)>0}
  647.  
  648.     /**
  649.      * @param string $buildertype  the type name of a form builder
  650.      * @return jFormsBuilderBase 
  651.      */
  652.     public function getBuilder($buildertype){
  653.         global $gJConfig;
  654.         if($buildertype == ''$buildertype 'html';
  655.         if(isset($gJConfig->_pluginsPathList_jforms[$buildertype])){
  656.             if(isset($this->builders[$buildertype]))
  657.                 return $this->builders[$buildertype];
  658.             include_once(JELIX_LIB_PATH.'forms/jFormsBuilderBase.class.php');
  659.             include_once ($gJConfig->_pluginsPathList_jforms[$buildertype].$buildertype.'.jformsbuilder.php');
  660.             $c $buildertype.'JformsBuilder';
  661.             $o $this->builders[$buildertypenew $c($this);
  662.             return $o;
  663.         }else{
  664.             throw new jExceptionForms('jelix~formserr.invalid.form.builder'array($buildertype$this->sel));
  665.         }
  666.     }
  667.  
  668.     /**
  669.      * save an uploaded file in the given directory. the given control must be
  670.      * an upload control of course.
  671.      * @param string $controlName the name of the upload control
  672.      * @param string $path path of the directory where to store the file. If it is not given,
  673.      *                      it will be stored under the var/uploads/_modulename~formname_/ directory
  674.      * @param string $alternateName a new name for the file. If it is not given, the file
  675.      *                               while be stored with the original name
  676.      * @return boolean true if the file has been saved correctly
  677.      */
  678.     public function saveFile($controlName$path=''$alternateName=''{
  679.         if ($path == ''{
  680.             $path JELIX_APP_VAR_PATH.'uploads/'.$this->sel.'/';
  681.         else if (substr($path-11!= '/'{
  682.             $path.='/';
  683.         }
  684.  
  685.         if(!isset($this->controls[$controlName]|| $this->controls[$controlName]->type != 'upload')
  686.             throw new jExceptionForms('jelix~formserr.invalid.upload.control.name'array($controlName$this->sel));
  687.  
  688.         if(!isset($_FILES[$controlName]|| $_FILES[$controlName]['error']!= UPLOAD_ERR_OK)
  689.             return false;
  690.  
  691.         if($this->controls[$controlName]->maxsize && $_FILES[$controlName]['size'$this->controls[$controlName]->maxsize){
  692.             return false;
  693.         }
  694.         jFile::createDir($path);
  695.         if ($alternateName == ''{
  696.             $path.= $_FILES[$controlName]['name'];
  697.         else {
  698.             $path.= $alternateName;
  699.         }
  700.         return move_uploaded_file($_FILES[$controlName]['tmp_name']$path);
  701.     }
  702.  
  703.     /**
  704.      * save all uploaded file in the given directory
  705.      * @param string $path path of the directory where to store the file. If it is not given,
  706.      *                      it will be stored under the var/uploads/_modulename~formname_/ directory
  707.      */
  708.     public function saveAllFiles($path=''{
  709.         if ($path == ''{
  710.             $path JELIX_APP_VAR_PATH.'uploads/'.$this->sel.'/';
  711.         else if (substr($path-11!= '/'{
  712.             $path.='/';
  713.         }
  714.  
  715.         if(count($this->uploads))
  716.             jFile::createDir($path);
  717.  
  718.         foreach($this->uploads as $ref=>$ctrl){
  719.  
  720.             if(!isset($_FILES[$ref]|| $_FILES[$ref]['error']!= UPLOAD_ERR_OK)
  721.                 continue;
  722.             if($ctrl->maxsize && $_FILES[$ref]['size'$ctrl->maxsize)
  723.                 continue;
  724.  
  725.             move_uploaded_file($_FILES[$ref]['tmp_name']$path.$_FILES[$ref]['name']);
  726.         }
  727.     }
  728.  
  729.     /**
  730.     * add a control to the form
  731.     * @param jFormsControl $control the control to add
  732.     */
  733.     public function addControl($control){
  734.         $this->rootControls [$control->ref$control;
  735.         $this->addChildControl($control);
  736.  
  737.         if($control instanceof jFormsControlGroups{
  738.             foreach($control->getChildControls(as $ctrl)
  739.                 $this->addChildControl($ctrl);
  740.         }
  741.     }
  742.  
  743.     /**
  744.      * add a control to the form, before the specified control
  745.      * @param jFormsControl $control the control to add
  746.      * @param string $ref The ref of the control the new control should be inserted before
  747.      * @since 1.1
  748.      */
  749.     public function addControlBefore($control$ref){
  750.         if(isset($this->rootControls[$ref])){
  751.             $controls array();
  752.             foreach($this->rootControls as $k=>$c){
  753.                 if($k == $ref)
  754.                     $controls[$control->refnull;
  755.                 $controls[$k$c;
  756.             }
  757.             $this->rootControls $controls;
  758.         }
  759.         $this->addControl($control);
  760.     }
  761.  
  762.  
  763.     function removeControl($name{
  764.         if(!isset($this->rootControls [$name]))
  765.             return;
  766.         unset($this->rootControls [$name]);
  767.         unset($this->controls [$name]);
  768.         unset($this->submits [$name]);
  769.         if($this->reset && $this->reset->ref == $name)
  770.             $this->reset = null;
  771.         unset($this->uploads [$name]);
  772.         unset($this->hiddens [$name]);
  773.         unset($this->htmleditors [$name]);
  774.         unset($this->container->data[$name]);
  775.     }
  776.  
  777.  
  778.     /**
  779.     * declare a child control to the form. The given control should be a child of an other control
  780.     * @param jFormsControl $control 
  781.     */
  782.     public function addChildControl($control){
  783.         $this->controls [$control->ref$control;
  784.         if($control->type =='submit')
  785.             $this->submits [$control->ref$control;
  786.         else if($control->type =='reset')
  787.             $this->reset = $control;
  788.         else if($control->type =='upload')
  789.             $this->uploads [$control->ref$control;
  790.         else if($control->type =='hidden')
  791.             $this->hiddens [$control->ref$control;
  792.         else if($control->type == 'htmleditor')
  793.             $this->htmleditors [$control->ref$control;
  794.  
  795.         $control->setForm($this);
  796.  
  797.         if(!isset($this->container->data[$control->ref])){
  798.             if $control->datatype instanceof jDatatypeDateTime && $control->defaultValue == 'now'{
  799.                 $dt new jDateTime();
  800.                 $dt->now();
  801.                 $this->container->data[$control->ref$dt->toString($control->datatype->getFormat());
  802.             }
  803.             else {
  804.                 $this->container->data[$control->ref$control->defaultValue;
  805.             }
  806.         }
  807.     }
  808.     
  809.     /**
  810.      * generate a new token for security against CSRF
  811.      * a builder should call it and create for example an hidden input
  812.      * so jForms could verify it after the submit.
  813.      * @return string the token
  814.      * @since 1.1.2
  815.      */
  816.     public function createNewToken({
  817.       if ($this->container->formId != jForms::DEFAULT_ID || $this->container->token == ''{
  818.           $tok md5($this->container->formId.time().session_id());
  819.           return ($this->container->token $tok);
  820.       }
  821.       return $this->container->token;
  822.     }
  823. }

Documentation generated on Thu, 22 Mar 2012 22:15:41 +0100 by phpDocumentor 1.4.3