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; }