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

Documentation generated on Thu, 19 Sep 2013 00:04:33 +0200 by phpDocumentor 1.4.3