%PDF- %PDF-
| Direktori : /home1/lightco1/www/administrator/components/com_chronoforms5/chronoforms/models/ |
| Current File : //home1/lightco1/www/administrator/components/com_chronoforms5/chronoforms/models/form.php |
<?php
/**
* ChronoCMS version 1.0
* Copyright (c) 2012 ChronoCMS.com, All rights reserved.
* Author: (ChronoCMS.com Team)
* license: Please read LICENSE.txt
* Visit http://www.ChronoCMS.com for regular updates and information.
**/
namespace GCore\Admin\Extensions\Chronoforms\Models;
/* @copyright:ChronoEngine.com @license:GPLv2 */defined('_JEXEC') or die('Restricted access');
defined("GCORE_SITE") or die;
class Form extends \GCore\Libs\GModel {
var $tablename = '#__chronoengine_chronoforms';
static $tabs = array();
static $sliders = array();
function initialize(){
$this->validate = array(
'title' => array(
'required' => true,
'not_empty' => true,
'message' => l_('CF_FORM_TITLE_REQUIRED')
),
);
}
function beforeSave(&$data, &$params, $mode){
foreach($data['extras']['actions_config'] as $f_k => $f_info){
if(strpos($f_k, '{N}') !== false){
unset($data['extras']['actions_config'][$f_k]);
}
}
if(!empty($data['extras']['fields']) AND $data['form_type'] == '1'){
foreach($data['extras']['fields'] as $f_k => $f_info){
if(strpos($f_k, '{N}') !== false){
unset($data['extras']['fields'][$f_k]);
}
}
//$data['wizardcode'] = serialize($data['fields_config']);
if(!empty($data['extras']['fields'])){
ob_start();
\GCore\Helpers\Html::active_set('div');//!empty($data['params']['html_helper_set']) ? $data['params']['html_helper_set'] : 'div');
/*if(!empty($data['params']['theme']) AND $data['params']['theme'] != 'bootstrap3'){
$doc = \GCore\Libs\Document::getInstance();
$doc->theme = $data['params']['theme'];
}*/
$theme = !empty($data['params']['theme']) ? $data['params']['theme'] : '';
$doc = \GCore\Libs\Document::getInstance();
$doc->theme = $theme;
//echo \GCore\Helpers\Html::formSecStart();
$containers_ids = array();
$containers_configs = array();
foreach($data['extras']['fields'] as $k => $field){
if($field['type'] == 'multi' AND isset($field['inputs'])){
foreach($field['inputs'] as $sub_id => $input){
$field['inputs'][$sub_id] = $this->fix_field_data($field['inputs'][$sub_id]);
}
}else{
$field = $this->fix_field_data($field);
}
if($field['type'] == 'container'){
//if this container is also a root container then close existing ones
if($field['container_id'] == 0){
//close all open containers
foreach($containers_ids as $containers_id){
$container_id = array_pop($containers_ids);
echo $this->build_container_code($containers_configs[$container_id], 'end', $k);
}
}else{
check_parent_container:
if(!empty($containers_ids)){
$last_container_id = array_pop($containers_ids);
if($field['container_id'] == $last_container_id){
//do nothing, we should add the field as regular
array_push($containers_ids, $last_container_id);
}else{
//one container has just ended, because the element belongs to a differnt one, close it
echo $this->build_container_code($containers_configs[$last_container_id], 'end', $k);
goto check_parent_container;
}
}
}
echo $this->build_container_code($field, 'start', $k);
array_push($containers_ids, $k);
$containers_configs[$k] = $field;
}else{
if(isset($field['container_id'])){
if($field['container_id'] == 0){
//close all open containers
foreach(array_keys($containers_ids) as $c_k){
$container_id = array_pop($containers_ids);
echo $this->build_container_code($containers_configs[$container_id], 'end', $k);
}
}else{
check_container:
if(!empty($containers_ids)){
$last_container_id = array_pop($containers_ids);
if($field['container_id'] == $last_container_id){
//do nothing, we should add the field as regular
array_push($containers_ids, $last_container_id);
}else{
//one container has just ended, because the element belongs to a differnt one, close it
echo $this->build_container_code($containers_configs[$last_container_id], 'end', $k);
goto check_container;
}
}
}
}
if($field['type'] == 'hidden' OR !empty($field['pure_code'])){
echo \GCore\Helpers\Html::input($field['name'], $field);
}else{
if(!empty($field['dynamic_data']['enabled']) AND !empty($field['dynamic_data']['data_path']) AND !empty($field['dynamic_data']['value_key']) AND !empty($field['dynamic_data']['text_key'])){
echo $this->build_dynamic_element($field);
}else{
/*if(isset($field['label'])){
$position = isset($field['label_pos']) ? $field['label_pos'] : 'left';
$field['label'] = array('text' => $field['label'], 'position' => $position);
}*/
if($field['type'] == 'multi' AND isset($field['inputs'])){
foreach($field['inputs'] as $sub_id => $input){
if(!empty($input['dynamic_data']['enabled']) AND !empty($input['dynamic_data']['data_path']) AND !empty($input['dynamic_data']['value_key']) AND !empty($input['dynamic_data']['text_key'])){
$field['inputs'][$sub_id]['code'] = $this->build_dynamic_element($input, true);
$field['inputs'][$sub_id]['type'] = 'custom';
//$field['inputs'][$sub_id]['label'] = '';
}
}
echo \GCore\Helpers\Html::formLine($field['name'], $field);
}else{
echo \GCore\Helpers\Html::formLine($field['name'], $field);
}
//echo \GCore\Helpers\Html::formLine($field['name'], $field);
}
}
}
}
//close any empty containers with no fields after them
while($container_id = array_pop($containers_ids)){
echo $this->build_container_code($containers_configs[$container_id], 'end', $container_id);
}
//echo \GCore\Helpers\Html::formSecEnd();
//echo \GCore\Helpers\Html::formEnd();
$data['content'] = ob_get_clean();
}else{
$data['content'] = '';
}
}
foreach($data['extras']['actions_config'] as $k => $act_info){
if(!empty($act_info['__action_title__'])){
$action_title = $act_info['__action_title__'];
$classname = '\GCore\Admin\Extensions\Chronoforms\Actions\\'.\GCore\Libs\Str::camilize($action_title)."\\".\GCore\Libs\Str::camilize($action_title);
if(method_exists($classname, 'on_form_save')){
${$classname} = new $classname();
${$classname}->on_form_save($data, $k);
}
}
}
if(!empty(self::$tabs)){
foreach(self::$tabs as $container_id => $tabs){
$tabs_bar = '';
foreach($tabs as $tab_id => $tab_title){
$tab_class = empty($tabs_bar) ? ' class="active"' : '';
$tabs_bar .= '<li'.$tab_class.'><a href="#'.$tab_id.'" data-g-toggle="tab">'.$tab_title.'</a></li>';
}
$data['content'] = str_replace('__TABS_TITLES__'.$container_id.'__', $tabs_bar, $data['content']);
}
}
parent::beforeSave($data, $params, $mode);
}
function fix_field_data($field = array()){
if(isset($field['options'])){
$options = array();
if(!empty($field['options'])){
$lines = explode("\n", $field['options']);
foreach($lines as $line){
$opts = explode("=", $line);
$options[trim($opts[0])] = isset($opts[1]) ? trim($opts[1]) : trim($opts[0]);
}
}
$field['options'] = $options;
}
if(isset($field['values'])){
$values = array();
if(!empty($field['values'])){
$values = explode("\n", $field['values']);
}
$field['values'] = $values;
}
if(!empty($field['data'])){
foreach($field['data'] as $k => $v){
if(!empty($v)){
$field[':data-'.$k] = $v;
}
}
}
if(isset($field['params'])){
$params = array();
if(!empty($field['params'])){
ob_start();
eval('?>'.$field['params']);
$field['params'] = ob_get_clean();
$lines = explode("\n", $field['params']);
foreach($lines as $line){
$opts = explode("=", $line);
if(isset($field[trim($opts[0])])){
//here we override any existing field parameter using th extra params box
$field[trim($opts[0])] = isset($opts[1]) ? trim($opts[1]) : trim($opts[0]);
}else{
$field[':'.trim($opts[0])] = isset($opts[1]) ? trim($opts[1]) : trim($opts[0]);
}
}
}
}
if(!empty($field['validation'])){
$field_validations = array();
foreach($field['validation'] as $rule => $value){
if(!empty($value)){
if(is_numeric($value)){
$field_validations[] = $rule;
}else{
$field_validations[] = $rule.':'.$value;
}
}
}
$validation_class = '';
if(!empty($field_validations)){
$validation_class = " validate['".implode("','", $field_validations)."']";
}
if(isset($field['class'])){
$field['class'] .= $validation_class;
}else{
$field['class'] = $validation_class;
}
}
return $field;
}
function build_container_code($field = array(), $tag = 'start', $id){
if($tag == 'start'){
$attachment = !empty($field['load-state']) ? ' data-load-state="'.$field['load-state'].'"' : '';
switch($field['container_type']){
case '':
return '';
case 'div':
return '<div class="'.$field['class'].'" id="'.$field['id'].'"'.$attachment.'>';
case 'multiplier':
$multiplier_code = '<div class="'.$field['class'].' multiplier-container" id="'.$field['id'].'"'.$attachment.' '.(!empty($field['multiplier']['hide_first']) ? 'data-hide_first="1"' : '').' '.(!empty($field['multiplier']['disable_first']) ? 'data-disable_first="1"' : '').' data-replacer="'.$field['multiplier']['replacer'].'" data-count="'.$field['multiplier']['count'].'">';
$multiplier_code .= '<?php ob_start(); ?>';
return $multiplier_code;
case 'multiplier-contents':
return '<div class="'.$field['class'].' multiplier-contents" id="'.$field['id'].'"'.$attachment.'>';
case 'custom':
return $field['start_code'];
case 'column':
return '<div class="'.$field['class'].'" id="'.$field['id'].'" style="float:left; width:'.$field['size']['width'].'%"'.$attachment.'>';
case 'multi_column':
return '<div class="'.$field['class'].'" id="'.$field['id'].'" style="overflow:auto;"'.$attachment.'>';
case 'page':
return '';
case 'fieldset':
return '<fieldset class="'.$field['class'].'" id="'.$field['id'].'"'.$attachment.'>
<legend>'.$field['title'].'</legend>';
case 'panel':
return '<div class="panel panel-default '.$field['class'].'" id="'.$field['id'].'"'.$attachment.'>
<div class="panel-heading">'.$field['title'].'</div>
<div class="panel-body">';
case 'tabs_area':
return '<div class="'.$field['class'].'" id="'.$field['id'].'"'.$attachment.'>
<ul class="nav nav-tabs">'.'__TABS_TITLES__'.$id.'__'.'</ul>
<div class="tab-content">';
case 'pills_area':
return '<div class="'.$field['class'].'" id="'.$field['id'].'"'.$attachment.'>
<ul class="nav nav-pills">'.'__TABS_TITLES__'.$id.'__'.'</ul>
<div class="tab-content">';
case 'tab':
$class = 'tab-pane';
if(empty(self::$tabs[$field['container_id']])){
$class = 'tab-pane active';
}
self::$tabs[$field['container_id']][$field['id']] = $field['title'];
return '<div id="'.$field['id'].'" class="'.$class.'">';
case 'sliders_area':
self::$sliders[$id]['id'] = $field['id'];
return '<div class="panel-group '.$field['class'].'" id="'.$field['id'].'"'.$attachment.'>';
case 'slider':
$class = ' collapse';
if(empty(self::$sliders[$field['container_id']]['class'])){
$class = ' in';
self::$sliders[$field['container_id']]['class'] = 'collapse';
}
return '<div class="panel panel-default '.$field['class'].'" id="'.$field['id'].'">
<div class="panel-heading"><h4 class="panel-title"><a data-g-toggle="collapse" data-g-parent="#'.self::$sliders[$field['container_id']]['id'].'" href="#slider-'.$id.'">'.$field['title'].'</a></h4></div>
<div id="slider-'.$id.'" class="panel-collapse'.$class.'">
<div class="panel-body">';
}
}else{
switch($field['container_type']){
case '':
return '';
case 'div':
return '</div>';
case 'multiplier':
$multiplier_code = '<?php $multiplier_code = ob_get_clean(); ?>';
$multiplier_code .= '<?php echo $multiplier_code; ?>';
if(!empty($field['multiplier']['data_path'])){
$multiplier_code .= '<?php $count = count(\GCore\Libs\Arr::getVal($form->data, explode(".", "'.$field['multiplier']['data_path'].'"), array())); ?>';
$multiplier_code .= '<?php for($i = '.(int)$field['multiplier']['count'].'; $i < $count; $i++): ?>';
$multiplier_code .= '<?php echo str_replace("'.$field['multiplier']['replacer'].'", $i, $multiplier_code); ?>';
$multiplier_code .= '<?php endfor; ?>';
}else if(!empty($field['multiplier']['start_count']) AND is_numeric($field['multiplier']['start_count'])){
$multiplier_code .= '<?php for($i = '.(int)$field['multiplier']['count'].'; $i <'.((int)$field['multiplier']['count'] + (int)$field['multiplier']['start_count']).'; $i++): ?>';
$multiplier_code .= '<?php echo str_replace("'.$field['multiplier']['replacer'].'", $i, $multiplier_code); ?>';
$multiplier_code .= '<?php endfor; ?>';
}else{
}
$multiplier_code .= '
'.(!empty($field['multiplier']['hide_buttons']) ? '' : '<span class="btn btn-success btn-sm multiplier-add-button"><i class="fa fa-plus fa-lg"></i></span>').'
</div>';
return $multiplier_code;
case 'multiplier-contents':
return '
'.(!empty($field['multiplier-contents']['hide_buttons']) ? '' : '<span class="btn btn-danger btn-xs multiplier-remove-button"><i class="fa fa-times fa-lg"></i></span>').'
</div>';
case 'custom':
return $field['end_code'];
case 'column':
return '</div>';
case 'multi_column':
return '</div><div style="clear:both;"></div>';
case 'page':
return '<!--_CHRONOFORMS_PAGE_BREAK_-->';
case 'fieldset':
return '</fieldset>';
case 'panel':
return '</div></div>';
case 'tabs_area':
return '</div></div>';
case 'pills_area':
return '</div></div>';
case 'tab':
return '</div>';
case 'sliders_area':
return '</div>';
case 'slider':
return '</div></div></div>';
}
}
}
function build_dynamic_element($field, $input_only = false){
$code = '';
$code .= '<?php';
$code .= "\n";
$code .= '$keys = \GCore\Libs\Arr::getVal(\GCore\Libs\Arr::getVal($form->data, explode(".", "'.$field['dynamic_data']['data_path'].'")), explode(".", "[n].'.$field['dynamic_data']['value_key'].'"));';
$code .= "\n";
$code .= '$values = \GCore\Libs\Arr::getVal(\GCore\Libs\Arr::getVal($form->data, explode(".", "'.$field['dynamic_data']['data_path'].'")), explode(".", "[n].'.$field['dynamic_data']['text_key'].'"));';
$code .= "\n";
$code .= '$options = array_combine($keys, $values);';
$front_field = $field;
unset($front_field['validation'], $front_field['events'], $front_field['dynamic_data']);
$code .= "\n";
$code .= '$field = '.var_export($front_field, true).';';
$code .= "\n";
$code .= '$field["options"] = $options;';
$code .= "\n";
if($input_only){
$code .= 'echo \GCore\Helpers\Html::input($field["name"], $field);';
}else{
$code .= 'echo \GCore\Helpers\Html::formLine($field["name"], $field);';
}
$code .= "\n";
$code .= '?>';
return $code;
}
}