. * * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. * */ /** * Class Form * @author David S. Callizaya S. * @package gulliver.system * @access public */ class Form extends XmlForm { var $id=''; var $width = 600; var $title = ''; var $fields = array(); var $values = array(); var $action = ''; var $ajaxServer = ''; var $enableTemplate = false; var $ajaxSubmit = false; var $callback='function(){}'; var $in_progress='function(){}'; var $template; var $className="formDefault"; var $objectRequiredFields = null; var $nextstepsave = ''; var $printdynaform = ''; public $visual_frontend; /** * Function setDefaultValues * @author David S. Callizaya S. * @access public * @return string */ function setDefaultValues( ) { foreach($this->fields as $name => $content) { if (is_object($content) && get_class($content) != '__PHP_Incomplete_Class') { if (isset($content->defaultValue)) $this->values[$name] = $content->defaultValue; else $this->values[$name] = ''; } else { $this->values[$name] = ''; } } foreach($this->fields as $k => $v){ if (is_object($v)) {//julichu $this->fields[$k]->owner =& $this; } } } /** * Function Form * @author David S. Callizaya S. * @access public * @param string filename * @param string home * @param string language * @param string forceParse * @param string $visual_frontend * @return string */ function Form($filename, $home='', $language = '', $forceParse = false, $visual_frontend=null) { $this->visual_frontend = $visual_frontend; if ($language=== '') $language = defined('SYS_LANG')? SYS_LANG : 'en'; if ($home=== '') $home = defined('PATH_XMLFORM')? PATH_XMLFORM : (defined('PATH_DYNAFORM')? PATH_DYNAFORM: ''); //to do: obtain the error code in case the xml parsing has errors: DONE //Load and parse the xml file if ( substr($filename, -4) !== '.xml' ) $filename = $filename . '.xml'; $this->home=$home; $res = parent::parseFile( $filename , $language, $forceParse ); if ($res==1) trigger_error('Faild to parse file ' . $filename . '.', E_USER_ERROR ); if ($res==2) trigger_error('Faild to create cache file "' . $xmlform->parsedFile . '".', E_USER_ERROR ); $this->setDefaultValues(); //to do: review if you can use the same form twice. in order to use once or not. //DONE: Use require to be able to use the same xmlform more than once. foreach($this->fields as $k => $v) { //too memory? but it fails if it's loaded with baneco.xml with SYS_LANG='es' //NOTE: This fails apparently when class of ($this->fields[$k]) is PHP_Incomplete_Class (because of cache) if (is_object($v)) {//julichu $this->fields[$k]->owner =& $this; if ($this->fields[$k]->type==='grid') $this->fields[$k]->parseFile($home, $language); } } $this->template = PATH_CORE . 'templates/'.$this->type.'.html'; } /** * Function printTemplate * @author David S. Callizaya S. * @access public * @param string template * @param string scriptContent * @return string */ function printTemplate( $template, &$scriptContent ) { if (!file_exists($template)){ throw(new Exception('Template "'.basename($template).'" doesn`t exist.')); } $o = new xmlformTemplate($this, $template); if (is_array(reset($this->values))) $this->rows=count(reset($this->values)); if ($this->enableTemplate) { $filename = substr($this->fileName , 0, -3) . ( $this->type==='xmlform' ? '' : '.' . $this->type ) . 'html'; if (!file_exists( $filename )) { $o->template = $o->printTemplate( $this ); $f=fopen($filename, 'w+'); fwrite($f, $o->template); fclose($f); } $o->template = implode( '', file( $filename ) ); } else { $o->template = $o->printTemplate( $this ); } return $o->template; } /** * Function render * @author David S. Callizaya S. * @access public * @param string template * @param string scriptContent * @return string */ function render( $template, &$scriptContent ) { /*** * This section was added for store the current used template. */ $tmp_var = explode('/', $template); if( is_array($tmp_var) ){ $tmp_var = $tmp_var[sizeof($tmp_var)-1]; $this->using_template = $tmp_var; } /***/ $this->template = $template; $o = new xmlformTemplate($this, $template); $values = $this->values; $aValuekeys=array_keys($values); if (isset($aValuekeys[0]) && ((int)$aValuekeys[0]==1)) $values=XmlForm_Field_Grid::flipValues($values); //TODO: Review when $values of a grid has only one row it is converted as a $values for a list (when template="grid" at addContent()) if (is_array(reset($values))) { $this->rows=count(reset($values)); } if ($this->enableTemplate) { $filename = substr($this->fileName, 0, -3) . 'html'; if (!file_exists( $filename )) { $o->template = $o->printTemplate( $this ); $f=fopen($filename, 'w+'); fwrite($f, $o->template); fclose($f); } $o->template = implode( '', file( $filename ) ); } else { $o->template = $o->printTemplate( $this ); } $scriptContent = $o->printJavaScript( $this ); $content = $o->printObject($this); return $content; } /** * Function setValues * @author David S. Callizaya S. * @access public * @param array $newValues * @return string */ function setValues($newValues=array()) { if ( !is_array ( $newValues) ){ return; } foreach($this->fields as $k => $v){ if ( array_key_exists($k,$newValues) ) { if ( is_array($newValues[$k]) ) { $this->values[$k] = array(); foreach( $newValues[$k] as $j => $item ) { if ($this->fields[$k]->validateValue($newValues[$k][$j], $this )) $this->values[$k][$j] = $newValues[$k][$j]; } if ((sizeof($this->values[$k])===1) && ($v->type!=='grid') && isset($this->values[$k][0]) ) $this->values[$k] = $this->values[$k][0]; if (sizeof($this->values[$k])===0) $this->values[$k] = ''; } else { if ($this->fields[$k]->validateValue($newValues[$k], $this )) $this->values[$k] = $newValues[$k]; } } } foreach ($newValues as $k => $v) { if (strpos($k,'SYS_GRID_AGGREGATE_') !== false) { $this->values[$k] = $newValues[$k]; } } foreach($this->fields as $k => $v){ if(is_object($this->fields[$k]) && get_class($this->fields[$k])!='__PHP_Incomplete_Class'){ $this->fields[$k]->owner =& $this; } } if(isset($this->labelWidth)){ $nMaxPorcent = 1024; $nWidth = stripos($this->width, '%'); if($nWidth > 0) { $sStrFind = $this->width; $result = substr($sStrFind, 0, strpos($sStrFind, '%')); $nWidth = (int)(($nMaxPorcent/100)*$result); } else { $nWidth = (int)$this->width; $nMaxPorcent = $nWidth; } $nLabelWidth = stripos($this->labelWidth, '%'); if($nLabelWidth > 0) { $sStrFind = $this->labelWidth; $result = substr($sStrFind, 0, strpos($sStrFind, '%')); $nLabelWidth = (int)(($nWidth/100)*$result); } else { $nLabelWidth = (int)$this->labelWidth; } // krumo($nWidth,$nLabelWidth); if(($nWidth - $nLabelWidth) > 0) $this->fieldContentWidth = (int)($nWidth - $nLabelWidth); } } /** * Function getFields * @author David S. Callizaya S. * @access public * @param string template * @param int $therow * @return string */ function getFields($template, $therow = -1) { $o = new xmlformTemplate($this, $template); return $o->getFields( $this, $therow ); } /** * Function that validates the values retrieved in $_POST * @author David S. Callizaya S. * @access public * @return array $_POST['form'] */ function validatePost() { return $_POST['form']=$this->validateArray($_POST['form']); } /** * Function that validates the values retrieved in an Array: * ex $_POST['form'] * @author David S. Callizaya S. * @access public * @param array $newValues * @return array */ function validateArray($newValues) { $values = array(); foreach($this->fields as $k => $v) { if (($v->type != 'submit')) { if ($v->type != 'file') { if ( array_key_exists($k,$newValues) ) { switch($v->type){ case 'radiogroup': $values[$k] = $newValues[$k]; $values["{$k}_label"] = $newValues["{$k}_label"] = $v->options[$newValues[$k]]; break; case 'suggest': $values[$k] = $newValues[$k]; $values["{$k}_label"] = $newValues["{$k}_label"]; break; case 'checkgroup': case 'listbox': if ( is_array($newValues[$k]) ) { $values[$k] = $values["{$k}_label"] = ''; foreach ($newValues[$k] as $i => $value) { //if $value is empty continue with the next loop, because this is a not selected/checked item if (trim($value) == '') { continue; } $values[$k] .= ($i != 0 ? '|': '') . $value; if (isset($v->options[$value])){ $values["{$k}_label"] .= ($i != 0 ? '|': '') . $v->options[$value]; } else { $query = G::replaceDataField($this->fields[$k]->sql,$newValues); //we do the query to the external connection and we've got the label $con = Propel::getConnection($this->fields[$k]->sqlConnection!=""?$this->fields[$k]->sqlConnection:"workflow");//use default connection workflow if connection is not defined. Same as Dynaforms $stmt = $con->prepareStatement($query); $rs = $stmt->executeQuery(ResultSet::FETCHMODE_NUM); while ($rs->next()) { list($rowId, $rowContent) = array_values($rs->getRow());//This to be sure that the array is numeric. Some cases when is DBArray result it returns an associative. By JHL if ($value == $rowId){ $values["{$k}_label"] .= ($i != 0 ? '|': '') . $rowContent; break; } } //die; } } $newValues["{$k}_label"] = isset($values["{$k}_label"]) ? $values["{$k}_label"] : ''; } else { $values[$k] = $newValues[$k]; $values["{$k}_label"] = isset($newValues["{$k}_label"]) ? $newValues["{$k}_label"] : ''; } break; case 'dropdown': $values[$k] = $newValues[$k]; if (isset($v->options[$newValues[$k]])){ $values["{$k}_label"] = $newValues["{$k}_label"] = $v->options[$newValues[$k]]; } else { $query = G::replaceDataField($this->fields[$k]->sql,$newValues); //we do the query to the external connection and we've got the label $con = Propel::getConnection($this->fields[$k]->sqlConnection!=""?$this->fields[$k]->sqlConnection:"workflow"); $stmt = $con->prepareStatement($query); $rs = $stmt->executeQuery(ResultSet::FETCHMODE_NUM); while ($rs->next()) { list($rowId, $rowContent) = $rs->getRow(); if ($newValues[$k]==$rowId){ $values["{$k}_label"] = $rowContent; break; } } } break; case 'grid': foreach( $newValues[$k] as $j => $item ) { if(is_array($item)){ $i=0; $values[$k][$j] = $this->fields[$k]->maskValue( $newValues[$k][$j], $this ); foreach($item as $kk => $vv){ //we need to know which fields are dropdowns if($this->fields[$k]->fields[$kk]->type == 'dropdown') { $values[$k][$j] = $newValues[$k][$j]; if ($this->fields[$k]->validateValue($newValues[$k][$j], $this )){ if (isset($this->fields[$k]->fields[$kk]->options[$vv])){ $values[$k][$j]["{$kk}_label"] = $newValues[$k][$j][$kk . '_label'] = $this->fields[$k]->fields[$kk]->options[$vv]; } else { $query = G::replaceDataField($this->fields[$k]->fields[$kk]->sql,$values[$k][$j]); $con = Propel::getConnection($this->fields[$k]->sqlConnection!=""?$this->fields[$k]->sqlConnection:"workflow"); $stmt = $con->prepareStatement($query); $rs = $stmt->executeQuery(ResultSet::FETCHMODE_NUM); while ($rs->next()){ // from the query executed we only need certain elements list($rowId, $rowContent) = $rs->getRow(); if ($vv==$rowId){ $values[$k][$j]["{$kk}_label"] = $newValues[$k][$j][$kk. '_label'] = $rowContent; break; } } } } } else { // if there are no dropdowns previously setted and the evaluated field is not a dropdown // only then rewritte the $values $values[$k][$j] = $this->fields[$k]->maskValue( $newValues[$k][$j], $this ); } $i++; } } else { $values[$k][$j] = $this->fields[$k]->maskValue( $newValues[$k][$j], $this ); } } break; default: if ($this->fields[$k]->validateValue($newValues[$k], $this )) $values[$k] = $this->fields[$k]->maskValue( $newValues[$k], $this ); } } } else { if (isset($_FILES['form']['name'][$k])) { $values[$k] = $_FILES['form']['name'][$k]; } /** * FIXED for multiple inputs documents related to file type field * By Erik Amaru Ortiz * Nov 24th, 2009 */ if ( isset($v->input) && $v->input != ''){ $_POST['INPUTS'][$k] = $v->input; } /**/ } } } foreach ($newValues as $k => $v) { if (strpos($k, 'SYS_GRID_AGGREGATE_') !== false) { $values[$k] = $v; } } return $values; } /** * Function that return the valid fields to replace * @author Julio Cesar Laura Avendao?=o * @access public * @param boolean $bWhitSystemVars * @return array */ function getVars($bWhitSystemVars = true) { $aFields = array(); if ($bWhitSystemVars) { $aAux = G::getSystemConstants(); foreach ($aAux as $sName => $sValue) { $aFields[] = array('sName' => $sName, 'sType' => 'system'); } } foreach($this->fields as $k => $v) { if (($v->type != 'title') && ($v->type != 'subtitle') && ($v->type != 'link') && ($v->type != 'file') && ($v->type != 'button') && ($v->type != 'reset') && ($v->type != 'submit') && ($v->type != 'listbox') && ($v->type != 'checkgroup') && ($v->type != 'grid') && ($v->type != 'javascript')) { $aFields[] = array('sName' => trim($k), 'sType' => trim($v->type)); } } return $aFields; } /** * Function that verify the required fields without a correct value * @author Erik Amaru Ortiz * @access public * @param array $values * @param array $aNoRequiredByJS * @return array/false */ function validateRequiredFields($values, $aNoRequiredByJS = array()) { $rFields = Array(); $missingFields = Array(); foreach ($this->fields as $o) { if (is_object($o) && property_exists(get_class($o), 'required')) { if( $o->required == 1) { if (!in_array($o->name, $aNoRequiredByJS)) { array_push($rFields, $o->name); } } } } foreach($rFields as $field){ #we verify if the requiered field is in array values,. t if (array_key_exists($field, $values)) { if( $values[$field] == "") { array_push($missingFields, $field); } } else { array_push($missingFields, $field); } } if(sizeof($missingFields) != 0) { return $missingFields; } else { return false; } } }