mirror of
				https://github.com/optim-enterprises-bv/control-pane.git
				synced 2025-10-31 18:07:46 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			272 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			272 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| /*
 | ||
| (
 | ||
| 	[idx] => 1
 | ||
| 	[mytable] => forms
 | ||
| 	[group_id] => 1
 | ||
| 	[order_id] => 1
 | ||
| 	[param] => ldap_host
 | ||
| 	[desc] => LDAP server
 | ||
| 	[def] => 192.168.1.3
 | ||
| 	[cur] => 
 | ||
| 	[new] => 
 | ||
| 	[mandatory] => 1
 | ||
| 	[attr] => maxlen=60
 | ||
| 	[xattr] => 
 | ||
| 	[type] => inputbox
 | ||
| 	[link] => 
 | ||
| )
 | ||
| */
 | ||
| class Forms
 | ||
| {
 | ||
| 	private $name='';
 | ||
| 	private $db='';
 | ||
| 	private $html='';
 | ||
| 	
 | ||
| 	function __construct($jname,$helper='',$db_path=false)
 | ||
| 	{
 | ||
| 		$this->name=$jname;
 | ||
| 		if($jname=='')
 | ||
| 		{
 | ||
| 			$database=$helper;
 | ||
| 		}else if($jname=='cbsd-settings'){
 | ||
| 			$this->db=new Db('cbsd-settings');
 | ||
| 		}else{
 | ||
| 			$database=array('jname'=>$jname,'helper'=>$helper);
 | ||
| 		}
 | ||
| 		if($helper!='')
 | ||
| 		{
 | ||
| 			if($db_path!==false)
 | ||
| 			{
 | ||
| 				$this->db=new Db('file',$db_path);
 | ||
| 			}else{
 | ||
| 				$this->db=new Db('helper',$database);
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| 	
 | ||
| 	function generate()
 | ||
| 	{
 | ||
| 		if($this->db->error) return;
 | ||
| 		//$query="select * from forms order by group_id asc, order_id asc";
 | ||
| 		$query="select * from forms order by groupname asc, group_id asc, order_id asc";
 | ||
| 		$fields=$this->db->select($query);
 | ||
| 		//print_r($fields);exit;
 | ||
| 		//echo '<pre>';print_r($fields);
 | ||
| 		//$defaults=array();
 | ||
| 		//$currents=array();
 | ||
| 		
 | ||
| 		// Строим карту формы с группами элементов
 | ||
| 		$groups=array();
 | ||
| 		foreach($fields as $key=>$field)
 | ||
| 		{
 | ||
| 			$group=$field['groupname'];
 | ||
| 			if(!empty($group))
 | ||
| 			{
 | ||
| 				if($field['type']=='group_add')
 | ||
| 				{	// Expand
 | ||
| 					$groups[$group]['_title']=$field['desc'];
 | ||
| 				}else if($field['type']=='delimer'){
 | ||
| 					// Delimer
 | ||
| 					$groups[$group][$field['group_id']]=$key;
 | ||
| 				}else{
 | ||
| 					// Other elements
 | ||
| 					$groups[$group][$field['group_id']]['_group_id']=$field['group_id'];
 | ||
| 					$groups[$group][$field['group_id']][$field['order_id']]=$key;
 | ||
| 				}
 | ||
| 			}else{
 | ||
| 				$groups[]=$key;
 | ||
| 			}
 | ||
| 		}
 | ||
| 		//print_r($fields);print_r($groups);exit;
 | ||
| 
 | ||
| 		$arr=array();
 | ||
| 		$last_type='';
 | ||
| 		foreach($fields as $key=>$field)
 | ||
| 		{
 | ||
| 			/*
 | ||
| 			if($last_type=='delimer' && $field['type']!='delimer')
 | ||
| 				$this->html.='<div class="pad-head"></div>';
 | ||
| 			*/
 | ||
| 			$last_type=$field['type'];
 | ||
| 			
 | ||
| 			if(isset($field['cur']) && isset($field['def']))
 | ||
| 			{
 | ||
| 				if(empty($field['cur'])) $field['cur']=$field['def'];
 | ||
| 			}
 | ||
| 			
 | ||
| 			$tpl=$this->getElement($field['type'],$field);
 | ||
| 			$params=array('param','desc','attr','cur');
 | ||
| 			foreach($params as $param)
 | ||
| 			{
 | ||
| 				if(isset($field[$param]))
 | ||
| 					$tpl=str_replace('${'.$param.'}',$field[$param],$tpl);
 | ||
| 			}
 | ||
| 			
 | ||
| 			//$value=$field['def'];
 | ||
| 			//if(isset($field['cur']) && !empty($field['cur'])) $value=$field['cur'];
 | ||
| 			$value=$field['cur'];
 | ||
| 			$tpl=str_replace('${value}',$value,$tpl);
 | ||
| 			
 | ||
| 			$value=$field['def'];
 | ||
| 			$tpl=str_replace('${def}',$value,$tpl);
 | ||
| 			
 | ||
| 			$required=($field['mandatory']==1)?' required':'';
 | ||
| 			$tpl=str_replace('${required}',$required,$tpl);
 | ||
| 			$arr[$key]=$tpl;
 | ||
| 			
 | ||
| 			//if($field['param']!='-') $currents[$field['param']]=$field['cur'];
 | ||
| 			//if($field['param']!='-') $defaults[$field['param']]=$field['def'];
 | ||
| 		}
 | ||
| 		
 | ||
| 		// Выстраиваем форму по карте
 | ||
| 		$this->html='<form class="helper" name="" onsubmit="return false;"><div class="form-fields">';
 | ||
| 		foreach($groups as $key=>$txt)
 | ||
| 		{
 | ||
| 			if(is_numeric($key))
 | ||
| 			{
 | ||
| 				$this->html.=$arr[$key];
 | ||
| 			}else if(is_array($txt)){
 | ||
| 				$group_name=key($txt);
 | ||
| 				$group_title=$txt['_title'];
 | ||
| 				unset($txt['_title']);
 | ||
| 				foreach($txt as $key1=>$val1)
 | ||
| 				{
 | ||
| 					$group_id=$val1['_group_id'];
 | ||
| 					unset($val1['_group_id']);
 | ||
| 					if(is_array($val1))
 | ||
| 					{
 | ||
| 						$this->html.='<div class="form-field"><fieldset id="ind-'.$group_id.'"><legend>'.$group_title.'</legend>';
 | ||
| 						foreach($val1 as $key2=>$val2)
 | ||
| 							$this->html.=$arr[$val2];
 | ||
| 						$this->html.='<div><input type="button" value="delete group" class="fgroup-del-butt" /></div></fieldset></div>';
 | ||
| 					}else{
 | ||
| 						$this->html.=$arr[$key1];
 | ||
| 					}
 | ||
| 				}
 | ||
| 				$this->html.='<div class="form-field"><input type="button" value="add group" class="fgroup-add-butt" /></div>';
 | ||
| 			}
 | ||
| 		}
 | ||
| 		$this->html.='</div>';
 | ||
| 		
 | ||
| 		$this->setButtons();
 | ||
| 		$this->html.='</form>';
 | ||
| 		return array('html'=>$this->html);	//	,'currents'=>$currents	//,'defaults'=>$defaults
 | ||
| 	}
 | ||
| 	
 | ||
| 	function getElement($el,$arr=array())
 | ||
| 	{
 | ||
| 		$tpl='';
 | ||
| 		switch(trim($el))
 | ||
| 		{
 | ||
| 			case 'inputbox':
 | ||
| 				$res=$this->getInputAutofill($arr);
 | ||
| 				if($res===false)
 | ||
| 				{
 | ||
| 					$list='';
 | ||
| 					$datalist='';
 | ||
| 				}else{
 | ||
| 					$list=' list="'.$res['list'].'"';
 | ||
| 					$datalist=$res['datalist'];
 | ||
| 				}
 | ||
| 				$tpl='<div class="form-field"><input type="text" name="${param}" value="${value}" ${attr}${required}'.$list.' /><span class="default val-${def}" title="Click to fill dafault value">[default]</span><span class="small">${desc}</span>'.$datalist.'</div>';
 | ||
| 				//'.$default.'
 | ||
| 				break;
 | ||
| 			case 'password':
 | ||
| 				$tpl='<div class="form-field"><input type="password" name="${param}" value="${value}" ${attr}${required} /><span class="default val-${def}" title="Click to fill dafault value">[default]</span><span class="small">${desc}</span></div>';
 | ||
| 				break;
 | ||
| 			case 'delimer':
 | ||
| 				$tpl='<h1>${desc}</h1>';
 | ||
| 				break;
 | ||
| 			case 'checkbox':
 | ||
| 				$tpl='<input type="checkbox" id="chk-${idx}" name="${param}" /><label for="chk-${idx}">${desc}</label>';
 | ||
| 				break;
 | ||
| 			case 'select':
 | ||
| 				$tpl=$this->getSelect($el,$arr);
 | ||
| 				break;
 | ||
| 			case 'radio':
 | ||
| 				$tpl=$this->getRadio($el,$arr);
 | ||
| 				break;
 | ||
| 		}
 | ||
| 		return $tpl;
 | ||
| 	}
 | ||
| 	
 | ||
| 	function getInputAutofill($arr)
 | ||
| 	{
 | ||
| 		if(isset($arr['link']))
 | ||
| 		{
 | ||
| 			$id=$arr['link'];	//$arr['param'].'-'.
 | ||
| 			$tpl='<datalist id="'.$id.'">';
 | ||
| 			$query="select * from {$arr['link']} order by order_id asc";
 | ||
| 			$opts=$this->db->select($query);
 | ||
| 			if(!empty($opts))foreach($opts as $key=>$opt)
 | ||
| 			{
 | ||
| 				$tpl.='<option>'.$opt['text'].'</option>';
 | ||
| 			}
 | ||
| 			$tpl.='</datalist>';
 | ||
| 			return array('list'=>$id,'datalist'=>$tpl);
 | ||
| 		}else return false;
 | ||
| 	}
 | ||
| 	
 | ||
| 	function getSelect($el,$arr)
 | ||
| 	{
 | ||
| 		$tpl='<div class="form-field"><select name="${param}">';
 | ||
| 		if(isset($arr['link']))
 | ||
| 		{
 | ||
| 			$query="select * from {$arr['link']} order by order_id asc";
 | ||
| 			$opts=$this->db->select($query);
 | ||
| 			// Пустое поле в списках оказалось ненужным!
 | ||
| 			//array_unshift($opts,array('id'=>0,'text'=>'','order_id'=>-1));
 | ||
| 			if(!empty($opts))foreach($opts as $key=>$opt)
 | ||
| 			{
 | ||
| 				$selected=($opt['id']==$arr['cur'])?' selected':'';
 | ||
| 				$tpl.='<option value="'.$opt['id'].'"'.$selected.'>'.$opt['text'].'</option>';
 | ||
| 			}
 | ||
| 		}
 | ||
| 		$tpl.='</select><span class="default val-${def}" title="Click to fill dafault value">[default]</span><span class="small">${desc}</span></div>';
 | ||
| 		return $tpl;
 | ||
| 	}
 | ||
| 	
 | ||
| 	function getRadio($el,$arr)
 | ||
| 	{
 | ||
| 		$tpl='<div class="form-field"><fieldset><legend>${desc}</legend>';
 | ||
| 		if(isset($arr['link']))
 | ||
| 		{
 | ||
| 			$query="select * from {$arr['link']} order by order_id asc";
 | ||
| 			$opts=$this->db->select($query);
 | ||
| 			if(!empty($opts))foreach($opts as $key=>$opt)
 | ||
| 			{
 | ||
| 				$checked=($opt['id']==$arr['cur'])?' checked':'';
 | ||
| 				$tpl.='<label for="${param}-'.$opt['id'].'">'.$opt['text'].':</label><input type="radio" name="${param}" value="'.$opt['id'].'" id="${param}-'.$opt['id'].'"'.$checked.' />';
 | ||
| 			}
 | ||
| 		}
 | ||
| 		$tpl.='</fieldset></div>';
 | ||
| 		return $tpl;
 | ||
| 	}
 | ||
| 	
 | ||
| 	function setButtons($arr=array())
 | ||
| 	{
 | ||
| 		$this->html.='<div class="buttons"><input type="button" value="Apply" class="save-helper-values" title="Save and apply params" />   <input type="button" value="Clear" class="clear-helper" title="Restore loaded params" /></div>';
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| 
 | ||
| $form=new Forms('php');
 | ||
| ?>
 | ||
| <html>
 | ||
| <style>
 | ||
| body {font-size:100%;font-family:Tahoma,'Sans-Serif',Arial;}
 | ||
| h1 {color:white;background:silver;margin:0;padding:10px;}
 | ||
| .small {font-size:x-small;}
 | ||
| .form-field {padding:4px 10px 0 10px;margin:0 4px; background:#fafafa;}
 | ||
| .form-field span {margin-left:10px;}
 | ||
| .form-field input {width:300px;}
 | ||
| form {border:1px solid gray;padding:0;margin-bottom:10px;width:500px;border-radius:8px;overflow:hidden;box-shadow:4px 4px 6px rgba(0,0,0,0.2);}
 | ||
| .buttons {padding:20px 10px;text-align:center;}
 | ||
| </style>
 | ||
| <?php
 | ||
| $form->generate();
 | ||
| //$form->setButtons(array('save','cancel'));
 | ||
| 
 | ||
| */ | 
