_name) $this->_name = substr(get_class($this), 0, -8); if (!$this->_db_table) $this->_db_table = $this->_name; } /** * Returns if an object exists * @param int $id * @return bool */ public function exists($id) { if (!is_numeric($id)) { return false; } elseif (isset($this->list[$id])) { return true; } elseif ($object=$this->get($id)) { return true; } else { return false; } } /** * Returns if an object exists * @param name $string * @return bool */ public function exists_ref($ref) { if (!isset($this->_fields['ref'])) { return false; } elseif (!is_string($ref)) { return false; } elseif (isset($this->list_ref[$ref])) { return true; } elseif ($object=$this->get_ref($ref)) { return true; } else { return false; } } /** * Renvoie un object de la base * @param string $ref * @return db_object */ public function get_ref($ref) { if (!isset($this->_fields['ref'])) { return false; } elseif (!is_string($ref)) { return false; } elseif (isset($this->list_ref[$ref])) { return $this->list[$this->list_ref[$ref]]; } elseif (count($objects=$this->select("ref='".mysql_real_escape_string($ref)."'"))==1) { return array_pop($objects); } else { return false; } } /** * Renvoie un object de la base * @param int $id * @return db_object */ public function get($id) { if (!is_numeric($id)) { return false; } elseif (isset($this->list[$id])) { return $this->list[$id]; } elseif(count($objects=$this->select('id='.$id))==1) { return array_pop($objects); } else{ return false; } } /** * Select en base de donnée * @param [] $params * @param int $limit * @param string $order * @return [] */ public function select($params=null, $limit=null, $order=null) { $classname = $this->_name; $list = array(); foreach ($this->db_retrieve($params, $limit, $order) as $row) { if (!isset($this->list[$row["id"]])){ $this->list[$row["id"]] = $object = new $classname(null, $row); if (isset($row['ref'])) $this->list_ref[$row["ref"]] = $row["id"]; } else $object = $this->list[$row["id"]]; $list[] = $object; } return $list; } /** * Select en base de donnée * @param [] $params * @param int $limit * @param string $order * @return [] */ public function db_retrieve($params=null, $limit=null, $order=null) { if ($params) $q_where = "WHERE ".$params; else $q_where = ""; if ($limit) $q_limit = "LIMIT ".$limit; else $q_limit = ""; if ($order){ $q_o = array(); foreach(explode(', ', $order) as $o) if (count($o2=explode(' ', trim($o)))>1) $q_o[] = "`".$o2[0]."` ".$o2[1]; else $q_o[] = "`".$o2[0]."`"; $q_order = "ORDER BY ".implode(', ', $q_o); } else $q_order = ""; $select_more = array(); $type_select_multiple = array(); $q_select = array("`".$this->_db_id."` as `id`"); foreach($this->_fields as $name=>$field) { if (in_array($field["type"], $this->field_simple)) { if ($field["type"] == "select_multiple") $type_select_multiple[] = $name; if (isset($field["db_fieldname"])) $q_select[] = "`".$field["db_fieldname"]."` as `".$name."`"; else $q_select[] = "`".$name."`"; } elseif ($field["type"] == "object_list") { $select_more[] = $name; } } $q_s = "SELECT ".implode(", ", $q_select)." FROM `".$this->_db_table."` ".$q_where." ".$q_order." ".$q_limit; $q_r = mysql_query($q_s); if ($this->DB_DEBUG == true || ($error=mysql_error())) { echo "$q_s : ".$error; } $list = array(); $list_id = array(); while ($row=mysql_fetch_assoc($q_r)) { // @todo : tout pourris... foreach($row as $i=>$j) $row[$i] = stripslashes($j); foreach($type_select_multiple as $name) { if ($row[$name] !== null) $row[$name] = explode(",", $row[$name]); else $row[$name] = array(); } $list[$row["id"]] = $row; $list_id[] = $row["id"]; } // Fields of type : object_list foreach($select_more as $name) { $field = $this->_fields[$name]; $classname = $field["object_type"]; $q_s = "SELECT `".$field["db_field_id"]."` as id, `".$field["db_field_ref_id"]."` as ref_id FROM `".$field["db_table"]."` WHERE `".$field["db_field_ref_id"]."` IN (".implode(", ", $list_id).")"; $q_r = mysql_query($q_s); while ($row=mysql_fetch_assoc($q_r)) { $list[$row["ref_id"]][$name][] = $row["id"]; } } // More fields foreach($this->db_retrieve_more($list_id) as $id=>$row) $list[$id] = array_merge($list[$id], $row); return $list; } /** * retrieve more info * @param []int $list_id */ protected function db_retrieve_more($list_id=null) { return array(); } /** * Count en base de donnée * @param [] $params * @return int */ public function count($params=null) { $classname = $this->_name; if ($params) $q_where = "WHERE ".$params; else $q_where = ""; $q_s = "SELECT COUNT(*) FROM `".$this->_db_table."` ".$q_where; $q_r = mysql_query($q_s); if ($this->DB_DEBUG == true) { echo "$q_s : ".mysql_error(); } $row = mysql_fetch_row($q_r); return array_pop($row); } } /** * Classe objet ORM * @author mathieu * @package db_object * */ class db_object { /** * Class name * @var string */ public $_name = ""; /** * Manager object * @access public * @var db_object_manager */ public $_manager = null; /** * Object ID * @var int */ public $id = null; /* CONSTRUCT */ /** * Constructeur * @param int $id * @param [] $info */ public function __construct($id=null, $info=null) { if (!$this->_name) $this->_name = get_class($this); $classname = $this->_name; $this->_manager = $classname(); foreach ($this->_manager->_fields as $name=>$value) $this->$name = null; if (is_numeric($id)) { if ($info=$this->db_retrieve($id)) $this->field_update($info); } elseif (is_array($info)) { $this->field_update($info); } } /* DISPLAY */ /** * Default display * @return string */ public function __tostring() { if ($this->id) return $this->_manager->_name." #".$this->id; else return $this->_manager->_name." # en cours..."; } /** * Return image url * @param string $name * @return string */ public function file($name) { if (isset($this->_manager->_fields[$name]) && in_array($this->_manager->_fields[$name]["type"], array("img", "file")) && $this->$name) { return $this->_manager->_fields[$name]["folder"]."/".$this->$name; } } /** * Return object associated to a field * @param string $fieldname * @return db_object */ function object($fieldname) { if (!is_string($fieldname) || !isset($this->_manager->_fields[$fieldname])) return; $field = $this->_manager->_fields[$fieldname]; if (!isset($field["type"]) || $field["type"] != "object" || !isset($field["object_type"])) return; if (!is_string($classname=$field["object_type"]) || !class_exists($classname)) return; if (!is_numeric($this->$fieldname)) return; return $classname()->get($this->$fieldname); } /* INSERT UPDATE VERIF */ public function field_calculated(&$info) { foreach($this->_manager->_fields as $name=>&$field) if (isset($field['calculate'])){ list($type, $var) = explode(':', $field['calculate']); if ($type=='url'){ if (!isset($info[$var])) continue; $url = strtolower(stripAccents($info[$var])); $patterns = $replacements = array(); $patterns[0] = '/(&|&)/i'; $replacements[0] = '-and-'; $patterns[1] = '/[^a-zA-Z01-9]/i'; $replacements[1] = '-'; $patterns[2] = '/(-+)/i'; $replacements[2] = '-'; $patterns[3] = '/(-$|^-)/i'; $replacements[3] = ''; $url = preg_replace($patterns, $replacements, $url); if (strlen($url)>100){ $urle = explode('-', $url); while (strlen($url)>100){ array_pop($urle); $url = implode('-', $urle); } } $info[$name] = $url; } if ($type=='ref'){ if (!isset($info[$var])) continue; $url = strtolower(stripAccents($info[$var])); $patterns = $replacements = array(); $patterns[0] = '/(&|&)/i'; $replacements[0] = ''; $patterns[1] = '/[^a-zA-Z01-9]/i'; $replacements[1] = '_'; $patterns[2] = '/(_+)/i'; $replacements[2] = '_'; $patterns[3] = '/(_$|^_)/i'; $replacements[3] = ''; $url = preg_replace($patterns, $replacements, $url); $urle = explode('_', $url); $s = 0; while (strlen($url)>20) { $s++; foreach($urle as $i=>&$j) { if (strlen($j)<=$s) { unset($urle[$i]); $url = implode('_', $urle); if (strlen($url)<=20) break; } } } while (strlen($url)>50){ array_pop($urle); $url = implode('_', $urle); } $info[$name] = $url; } } //var_dump($info); die(); } /** * Contrôle des champs * @param [] $info */ public function field_verif(&$info) { if (!is_array($info)) $info = array(); foreach($info as $name=>&$value) { if (!isset($this->_manager->_fields[$name])) { unset($info[$name]); } else { $field = $this->_manager->_fields[$name]; if (isset($field["type"])) { $type = $field["type"]; if (in_array($type, array("object", "int", "float", "numeric", "decimal")) && !is_numeric($value)) { $value = NULL; } elseif ($type == "boolean") { $value = ($value) ?1 :0; } elseif ($type == "object" && $value) { $object_classname = $field["object_type"]; if (!$object_classname()->exists($value)) $value = NULL; } elseif (in_array($type, array("string", "text", "richtext")) && !is_string($value)) { $value = NULL; } elseif ($type == "select" && ((!is_string($value) && !is_numeric($value)) || !isset($field["list"][$value]))) { $value = NULL; } elseif ($type == "select_multiple") { if (!is_array($value)) { $value = NULL; } else { foreach($value as $i=>$v) if (!isset($field["list"][$v])) unset($value[$i]); } } elseif ($type == "date" && (!is_string($value))) { $value = NULL; } elseif (in_array($type, array("datetime", "timestamp")) && (!is_string($value))) { $value = NULL; } elseif ($type == "img" || $type == "file") { //var_dump($_FILES); // Sans upload ou upload foireux if (isset($_FILES[$name]) && (!$_FILES[$name]["tmp_name"] || $_FILES[$name]["error"] != UPLOAD_ERR_OK)) { unset($_FILES[$name]); } // Fichier sans nom ou nom foireux if (isset($_FILES[$name])) { if (isset($field["filename"])) { $_FILES[$name]["name"] = $this->field_map_replace($field["filename"]); } else { $nb = 0; $name = $field["filename"]; while (file_exists(PATH_ROOT."/".$field["folder"]."/".$_FILES[$name]["name"])) { $nb++; $_FILES[$name]["name"] = $nb."-".$name; } } $value = $_FILES[$name]["name"]; } // Renommage sans fichier elseif ($value && (isset($field["filename"]) || !$this->$name || !file_exists(PATH_ROOT."/".$field["folder"]."/".$this->$name))) { //echo PATH_ROOT."/".$field["folder"]."/".$this->$name; unset($info[$name]); } } } } } //var_dump($_FILES); var_dump($info); } function field_map_replace($string) { $replace_from = $replace_to = array(); foreach($this->_manager->_fields as $name=>$field) { $replace_from[] = "{".$name."}"; $replace_to[] = $this->$name; } return str_replace($replace_from, $replace_to, $string); } /** * Contrôle supplémentaire à l'insertion * @param [] $info */ public function field_verif_insert(&$info) { } /** * Contrôle supplémentaire à la mise à jour * @param [] $info */ public function field_verif_update(&$info) { } /** * Update object with data * @param [] $info */ private function field_update(&$info) { if (!is_array($info)) return; foreach($info as $name=>$value) if ($name=="id" || isset($this->_manager->_fields[$name])) $this->$name = $value; } public function duplicate() { } /* OPERATIONS */ /** * Insertion objet * @param [] $info * @return bool */ public function insert($info) { if (is_numeric($this->id)) return; $this->field_verif($info); $this->field_calculated($info); $this->field_verif_insert($info); if (is_numeric($id=$this->db_insert($info))) { $this->id = $id; $this->field_update($info); return true; } else return false; } /** * Mise à jour objet * @param [] $info * @return bool */ public function update($info) { if (!is_numeric($this->id)) return; $this->field_verif($info); foreach($info as $name=>$value) if ($this->$name === $value && (!in_array($this->_manager->_fields[$name]["type"], array("img", "file")) || !isset($_FILES[$name]))) unset($info[$name]); $this->field_verif_update($info); if ($this->db_update($info)) { $this->field_update($info); return true; } else return false; } /** * Supression objet * @return bool */ public function delete() { if (!is_numeric($this->id)) return; return $this->db_delete($this->id); } /* DATABASE */ /* * Comprend autant les opérations en base de donnée que sur le système de fichiers, * bref sur tout support de stockage de donnée (ce qui se tient logiquement) */ /** * Retrieve object info from database * @param int $id * @return []|bool */ protected function db_retrieve($id) { if (!is_numeric($id) || !count($list=$this->_manager->db_retrieve("`".$this->_manager->_db_id."`='".$id."'"))) return false; return array_pop($list); } /** * Update object in database * @param [] $info * @return int */ protected function db_update($info) { if (!is_numeric($this->id)) return false; $q_list = array(); $file_move_list = $file_rename_list = $file_delete_list = array(); //var_dump($_FILES); var_dump($info); foreach($info as $name=>$value) { $field = $this->_manager->_fields[$name]; if (isset($field["type"])) { $type = $field["type"]; if (in_array($field["type"], $this->_manager->field_simple)) { if ($field["type"] == "select_multiple") { if (is_array($value)) foreach($value as $i=>$v) $value[$i] = mysql_real_escape_string($v); $q_list[] = "`".(isset($field["db_fieldname"]) ?$field["db_fieldname"] :$name)."` = ".(is_array($value)&&count($value) ?"'".implode(",",$value)."'" :"NULL"); } else $q_list[] = "`".(isset($field["db_fieldname"]) ?$field["db_fieldname"] :$name)."` = ".($value===NULL?"NULL":"'".mysql_real_escape_string($value)."'"); if ($type == "img") { if (isset($_FILES[$name]) && $this->$name) $file_delete_list[] = PATH_ROOT."/".$field["folder"]."/".$this->$name; if (!isset($_FILES[$name]) && $this->$name) $file_rename_list[PATH_ROOT."/".$field["folder"]."/".$this->$name] = PATH_ROOT."/".$field["folder"]."/".$value; if (isset($_FILES[$name])) $file_move_list[$_FILES[$name]["tmp_name"]] = PATH_ROOT."/".$field["folder"]."/".$value; } } } } if (count($q_list)){ $q_s = "UPDATE `".$this->_manager->_db_table."` SET ".implode(", ", $q_list)." WHERE `".$this->_manager->_db_id."`='".$this->id."'"; $q_r = mysql_query($q_s); } if ($this->_manager->DB_DEBUG == true || (isset($q_s) && ($error=mysql_error()))) { echo "$q_s : ".$error; } $return = (isset($q_s) && mysql_affected_rows()>0 ?true :false); if ($return) { foreach($file_delete_list as $name) { if ($this->_manager->FILE_DEBUG) echo "

Delete $name

\n"; unlink($name); } foreach($file_rename_list as $from=>$to) { if ($this->_manager->FILE_DEBUG) echo "

Rename $from $to

\n"; rename($from, $to); } foreach($file_move_list as $from=>$to) { if ($this->_manager->FILE_DEBUG) echo "

Move uplodaed $from $to

\n"; move_uploaded_file($from, $to); } } // More fields $return = ($this->db_update_more($info) || $return); return $return; } /** * Modification supplémentaire * @param [] $info */ protected function db_update_more($info) { return false; } /** * Insert in database * @param [] $info * @return bool */ protected function db_insert($info) { if (is_numeric($this->id)) return false; $q_list_1 = $q_list_2 = array(); $file_move_list = array(); foreach($info as $name=>$value) { $field = $this->_manager->_fields[$name]; if (isset($field["type"])) { if (in_array($field["type"], $this->_manager->field_simple)) { $type = $field["type"]; $q_list_1[] = "`".(isset($field["db_fieldname"]) ?$field["db_fieldname"] : $name)."`"; if ($field["type"] == "select_multiple") { if (is_array($value)) foreach($value as $i=>$v) $value[$i] = "'".mysql_real_escape_string($v)."'"; $q_list_2[] = (is_array($value)&&count($value) ?"(".implode(",",$value).")" :"NULL"); } else $q_list_2[] = ($value===NULL?"NULL":"'".mysql_real_escape_string($value)."'"); if ($type == "img") { $file_move_list[$_FILES[$name]["tmp_name"]] = PATH_ROOT."/".$field["folder"]."/".$value; } } } } $q_s = "INSERT INTO `".$this->_manager->_db_table."` (".implode(", ", $q_list_1).") VALUES (".implode(", ", $q_list_2).")"; $q_r = mysql_query($q_s); if ($this->_manager->DB_DEBUG == true) { echo "$q_s : ".mysql_error(); } $return = mysql_insert_id(); if ($return) { foreach($file_move_list as $from=>$to) { if ($this->_manager->FILE_DEBUG) echo "

Move uploaded $from $to

\n"; move_uploaded_file($from, $to); } } if ($return) $this->db_insert_more($return, $info); return $return; } /** * Insertions supplémentaires * @param int $id * @param [] $info * @return bool */ protected function db_insert_more($id, $info) { return false; } /** * Delete object in database * @return bool */ protected function db_delete() { if (!is_numeric($this->id)) return false; $q_s = "DELETE FROM `".$this->_manager->_db_table."` WHERE `".$this->_manager->_db_id."`='".$this->id."'"; $q_r = mysql_query($q_s); if ($this->_manager->DB_DEBUG == true) { echo "$q_s : ".mysql_error(); } $return = (mysql_affected_rows()>0 ?true :false); if ($return) $this->db_delete_more(); return $return; } /** * Suppressions supplémentaires * @return bool */ protected function db_delete_more() { return false; } } ?>