Ejemplo n.º 1
0
	public static function create($values=array(),$data=false)
	{
		$sl=self::$c->silent();
		$uid=auth::user("id");
		if(!is_string($data))$data=false;
		$t=db::tMeta(self::$class);
		$fs=array_keys($t);
		//проверяем данные
		$dts=array();
		$work=array();
		foreach($fs as $fld)
			if(!in_array($fld,self::$fieldsSys))$work[]=$fld;
		$ind=0;
		foreach($values as $field=>$value)
		{
			if(is_numeric($field))
			{
				if(!isset($work[$ind]))continue;
				$field=$work[$ind];
				$ind++;
			}
			else
			{
				if(!in_array($field,$fs))continue;
			}
			if(in_array($field,self::$fieldsSys))
			{
				switch($field)
				{
					case "id":
						$t["id"]["data"]="NULL";
						break;
					case "uid":
					case "uuid":
						$t[$field]["data"]="".$uid;
						break;
					case "created":
					case "updated":
						$dt=$value;
						if(!lib::validDt($dt))$t[$field]["data"]="NOW()";
						else $t[$field]["data"]="'".$dt."'";
						break;
					case "force_spots"://string only accepted
						if(is_string($value) && $value!="")
						{
							$sp=explode(",",$value);
							if(count($sp))
							{
								$spn=array();
								foreach($sp as $i=>$spot)
								{
									$sp[$i]=0+(trim($spot));
									if($sp[$i])$spn[]=$sp[$i];
								}
								if(count($spn))$value=implode(",",$spn);
								else $value;
							}
							else $value=false;
						}
						else $value=false;
						if(!$value)$t["force_spots"]["data"]="''";
						break;
				}
			}
			if(($field=="title") && !$value)$value="Новая страница";
			if(($t[$field]["type"]=="string") || ($t[$field]["type"]=="text"))
			{
				$value="".$value;
				$t[$field]["data"]="'".mysql_real_escape_string($value)."'";
			}
			else $t[$field]["data"]="".$value;
		}
		$d=array();
		foreach($t as $field=>$m)
		{
			if(!in_array($field,$work))
			{
				switch($field)
				{
					case "id":
						$d[]="NULL";
						break;
					case "uid":
					case "uuid":
						$d[]="".$uid;
						break;
					case "created":
					case "updated":
						$d[]="NOW()";
						break;
					case "force_spots":
						$d[]="''";
						break;
				}
				continue;
			}
			if(!isset($m["data"]))
			{
				$msg="Невозможно выполнить операцию: данные не распознаны или заданы с ошибкой.";
				msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"Field is not set: ".$field."=>".serialize($m));
				return false;
			}
			if(!$m["isnumber"])
			{
				if($m["maxLen"]>0)
				{
					$len=@mb_strlen($m["data"],"UTF-8");
					if($len>$m["maxLen"])
					{
						$msg="Данные для поля [".$field."] превышают максимальную длину (".$m["maxLen"]." симв., текущая: ".$len.")";
						msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"String for ".db::tnm(self::$class)."[".$field."] is too long: ".$len.">".$m["maxLen"]);
						return false;
					}
				}
			}
			$d[]=$m["data"];
		}
		//проверяем на существование папку модуля,
		//создаем ее, если нужно
		if($data!==false)
		{
			$mdir=FLEX_APP_DIR_DAT."/_".self::$class;
			if(!@file_exists($mdir))
			{
				if(@mkdir($mdir,0755)===false || (!@is_writeable($mdir)))
				{
					$msg="Невозможно создать страницу: доступ к файловой системе ограничен!";
					msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"Directory creation failed: ".$mdir);
					return false;
				}
			}
		}
		$r=db::q("INSERT INTO ".db::tnm(self::$class)." VALUES(".implode(",",$d).")",!$sl);
		if($r===false)return false;
		$id=0+mysql_insert_id();
		if($data)
		{
			//проверяем доступ на запись файла страницы
			$fn=$mdir."/".$id."/".self::$config["index"].".php";
			if(@file_exists($fn) && !@is_writable($fn))
			{
				db::q("DELETE FROM ".db::tnm(self::$class)." WHERE `id`=".$id);
				$msg="Невозможно создать страницу: доступ к файловой системе ограничен!";
				msgr::errorLog($msg,true,self::$class,__FUNCTION__,__LINE__,"File creation failed: ".$fn);
				return false;
			}
			@file_put_contents($fn,"<?defined(\"FLEX_APP\") or die(\"Forbidden.\");?>\n".$data);
			@chmod($fn,0755);
		}
		return $id;
	}