* @author Каючкин Александр * @access public */ /** * Целое число * * @link http://cms.alpha.inetra.ru * @version 1.0 * @copyright Copyright: 2003 Inetra, Inc. * @author Каючкин Александр * @access public */ class cmsIntegerType { /** * Дружественное имя. Например: "Целое число", "Строка" и т.д... * * @var string */ var $friendly_name = 'Целое число'; /** * Служебное имя (для столбцов таблиц, элементов форм и т.д.) * * @var string */ var $prefix = 'int1'; /** * Объект данных типа. Зависит от конкретной реализации. * * @var Int */ var $data = 0; /** * Mysql эквивалент типа * * @var string */ var $mysqlName = "int(11)"; /** * Pgsql эквивалент типа * * @var string */ var $pgsqlName = "integer"; /** * Методы класса. Составляют интерфейс для работы с данными. * */ /** * Дополнительные параметры для типов-наследников * * @var string */ var $params = ""; /** * Возвращает имя класса * * @return string */ function getClassName() { return "cmsIntegerType"; } /** * возвращает имя * @return string Дружественное имя класса */ function getName() { return $this->friendly_name; } /** * устанавливает имя * @param string Дружественное имя класса */ function setName($_friendly_name) { $this->friend_namely = $_friendly_name; return; } /** * возвращает служебное имя класса. * * @return string */ function getPrefix() { return $this->prefix; } /** * принимает служебное имя класса. * * @param string */ function setPrefix($_prefix) { $this->prefix = $_prefix; return; } /** * возвращает Mysql эквивалент. * * @return string */ function getMysqlName() { return $this->mysqlName; } /** * возвращает Mysql эквивалент. * * @return string */ function getPgsqlName() { return $this->pgsqlName; } /** * Возвращает данные. * * @return string */ function get() { return $this->data; } /** * Принимает значение. * * @param Mixed */ function set($_data) { $this->data = $_data; return; } /** * Берет значение из запроса POST * */ function getDataFromPOST() { global $_POST; $this->data = (int)$_POST[$this->prefix]; return; } /** * Возвращает SQL код для операции UPDATE * * @param string enum("mysql", "pgsql") * * @return string */ function getSQLUpdate($db_type = "mysql") { $sql = ""; switch ($db_type) { case "mysql" : $sql = $this->prefix." = ".$this->data; break; case "pgsql" : $sql = $this->prefix." = ".$this->data; break; default : $sql = $this->prefix." = ".$this->data; break; } return $sql; } /** * Возвращает SQL код для операции INSERT * * @param string enum("mysql", "pgsql") * * @return Array(2) */ function getSQLInsert($db_type = "mysql") { $sql = Array(); switch ($db_type) { case "mysql" : $sql[0] = $this->prefix; $sql[1] = $this->data; break; case "pgsql" : $sql[0] = $this->prefix; $sql[1] = $this->data; break; default : $sql[0] = $this->prefix; $sql[1] = $this->data; break; } return $sql; } /** * Возвращает HTML разметку данных. * * @return string */ function getHTMLData() { return $this->data; } /** * Возвращает элемент HTML формы для данного типа * * @return string */ function getFORMData() { return ""; } } /** * Строка * * @link http://cms.alpha.inetra.ru * @version 1.0 * @copyright Copyright: 2003 Inetra, Inc. * @author Каючкин Александр * @access public */ class cmsStringType extends cmsIntegerType { /** * Конструктор */ function cmsStringType() { $this->friendly_name = 'Строка'; $this->prefix = 'str1'; $this->data = ""; $this->mysqlName = "varchar(255)"; $this->pgsqlName = "varchar(255)"; $this->params = ""; } /** * Методы класса. Составляют интерфейс для работы с данными. * */ /** * Возвращает имя класса * * @return string */ function getClassName() { return "cmsStringType"; } /** * Берет значение из запроса POST * */ function getDataFromPOST() { global $_POST; $this->data = $_POST[$this->prefix]; return; } /** * Возвращает SQL код для операции UPDATE * * @param string enum("mysql", "pgsql") * * @return string */ function getSQLUpdate($db_type = "mysql") { $sql = ""; switch ($db_type) { case "mysql" : $sql = $this->prefix." = '".$this->data."'"; break; case "pgsql" : $sql = $this->prefix." = '".$this->data."'"; break; default : $sql = $this->prefix." = '".$this->data."'"; break; } return $sql; } /** * Возвращает SQL код для операции INSERT * * @param string enum("mysql", "pgsql") * * @return Array(2) */ function getSQLInsert($db_type = "mysql") { $sql = Array(); switch ($db_type) { case "mysql" : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; case "pgsql" : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; default : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; } return $sql; } /** * Возвращает HTML разметку данных. * * @return string */ function getHTMLData() { return Trim($this->data); } /** * Возвращает элемент HTML формы для данного типа * * @return string */ function getFORMData() { return ""; } } /** * Денежная единица * * @link http://cms.alpha.inetra.ru * @version 1.0 * @copyright Copyright: 2003 Inetra, Inc. * @author Каючкин Александр * @access public */ class cmsMoneyType extends cmsIntegerType { var $currency_types = Array(); var $display = 0; var $format = 0; /** * Конструктор */ function cmsMoneyType() { $this->friendly_name = 'Денежная единица'; $this->prefix = 'money1'; $this->data = ""; $this->mysqlName = "varchar(255)"; $this->pgsqlName = "varchar(255)"; $this->params = ""; $this->currency_types["RUS"] = "р"; $this->currency_types["USD"] = "$"; $this->currency_types["EUR"] = "€"; } /** * Методы класса. Составляют интерфейс для работы с данными. * */ /** * Возвращает имя класса * * @return string */ function getClassName() { return "cmsMoneyType"; } /** * Берет значение из запроса POST * */ function getDataFromPOST() { global $_POST; if ($_POST[$this->prefix]) $this->data = round((float)$_POST[$this->prefix], 2); else $this->data = 0.00; return; } /** * Возвращает SQL код для операции UPDATE * * @param string enum("mysql", "pgsql") * * @return string */ function getSQLUpdate($db_type = "mysql") { $sql = ""; switch ($db_type) { case "mysql" : $sql = $this->prefix." = '".$this->get()."'"; break; case "pgsql" : $sql = $this->prefix." = '".$this->get()."'"; break; default : $sql = $this->prefix." = '".$this->get()."'"; break; } return $sql; } /** * Возвращает SQL код для операции INSERT * * @param string enum("mysql", "pgsql") * * @return Array(2) */ function getSQLInsert($db_type = "mysql") { $sql = Array(); switch ($db_type) { case "mysql" : $sql[0] = $this->prefix; $sql[1] = "'".$this->get()."'"; break; case "pgsql" : $sql[0] = $this->prefix; $sql[1] = "'".$this->get()."'"; break; default : $sql[0] = $this->prefix; $sql[1] = "'".$this->get()."'"; break; } return $sql; } /** * Возвращает данные. * * @return string */ function get() { $this->data = round((float)$this->data, 2); return $this->data; } /** * Возвращает HTML разметку данных. * * @return string */ function getHTMLData() { if (!$this->params) return $this->get()."руб."; else { $_params_array = explode (":", $this->params); $data_currency = $_params_array[0]; $display_currency = $_params_array[1]; $currency_exchange = round((float)$_params_array[2], 2); if ($currency_exchange <= 0) $currency_exchange = 1; return round((float)($this->get() * $currency_exchange), 2);//." ".$this->currency_types[$display_currency]; } } /** * Возвращает элемент HTML формы для данного типа * * @return string */ function getFORMData() { $_params_array = explode (":", $this->params); $valute = $_params_array[0]; return " ".$this->currency_types[$valute]; } } /** * Text * * @link http://cms.alpha.inetra.ru * @version 1.0 * @copyright Copyright: 2003 Inetra, Inc. * @author Каючкин Александр * @access public */ class cmsTextType extends cmsIntegerType { /** * Конструктор */ function cmsTextType() { $this->friendly_name = 'Текст'; $this->prefix = 'text1'; $this->data = ""; $this->mysqlName = "text"; $this->pgsqlName = "text"; $this->params = ""; } /** * Методы класса. Составляют интерфейс для работы с данными. * */ /** * Возвращает имя класса * * @return string */ function getClassName() { return "cmsTextType"; } /** * Берет значение из запроса POST * */ function getDataFromPOST() { global $_POST; $this->data = $_POST[$this->prefix]; return; } /** * Возвращает SQL код для операции UPDATE * * @param string enum("mysql", "pgsql") * * @return string */ function getSQLUpdate($db_type = "mysql") { $sql = ""; switch ($db_type) { case "mysql" : $sql = $this->prefix." = '".$this->data."'"; break; case "pgsql" : $sql = $this->prefix." = '".$this->data."'"; break; default : $sql = $this->prefix." = '".$this->data."'"; break; } return $sql; } /** * Возвращает SQL код для операции INSERT * * @param string enum("mysql", "pgsql") * * @return Array(2) */ function getSQLInsert($db_type = "mysql") { $sql = Array(); switch ($db_type) { case "mysql" : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; case "pgsql" : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; default : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; } return $sql; } /** * Возвращает HTML разметку данных. * * @return string */ function getHTMLData() { return trim(str_replace("\n", "
", $this->data)); } /** * Возвращает элемент HTML формы для данного типа * * @return string */ function getFORMData() { return ""; } } /** * BigText * * @link http://cms.alpha.inetra.ru * @version 1.0 * @copyright Copyright: 2003 Inetra, Inc. * @author Каючкин Александр * @access public */ class cmsBigTextType extends cmsTextType { /** * Конструктор */ function cmsBigTextType() { $this->friendly_name = 'Большой текст (HTML-редактор)'; $this->prefix = 'bigtext1'; $this->data = ""; $this->mysqlName = "text"; $this->pgsqlName = "text"; $this->params = ""; } /** * Методы класса. Составляют интерфейс для работы с данными. * */ /** * Возвращает имя класса * * @return string */ function getClassName() { return "cmsBigTextType"; } /** * Берет значение из запроса POST * */ function getDataFromPOST() { global $_POST; $this->data = $_POST[$this->prefix]; return; } /** * Возвращает SQL код для операции UPDATE * * @param string enum("mysql", "pgsql") * * @return string */ function getSQLUpdate($db_type = "mysql") { $sql = ""; switch ($db_type) { case "mysql" : $sql = $this->prefix." = '".$this->data."'"; break; case "pgsql" : $sql = $this->prefix." = '".$this->data."'"; break; default : $sql = $this->prefix." = '".$this->data."'"; break; } return $sql; } /** * Возвращает SQL код для операции INSERT * * @param string enum("mysql", "pgsql") * * @return Array(2) */ function getSQLInsert($db_type = "mysql") { $sql = Array(); switch ($db_type) { case "mysql" : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; case "pgsql" : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; default : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; } return $sql; } /** * Возвращает HTML разметку данных. * * @return string */ function getHTMLData() { $this->data = trim(stripslashes($this->data)); return str_replace(" ", " ", $this->data); } /** * Возвращает элемент HTML формы для данного типа * * @return string */ function getFORMData() { $_data = $this->data; $_data = str_replace("\n", "", $_data); $_data = str_replace("\r", "", $_data); $_data = addslashes($_data); return " "; } } /** * Прикрепленный документ * * @link http://cms.alpha.inetra.ru * @version 1.0 * @copyright Copyright: 2003 Inetra, Inc. * @author Каючкин Александр * @access public */ class cmsFileType extends cmsStringType { var $path = ''; var $filename = ''; var $preview_image_width = 100; /** * Конструктор */ function cmsFileType() { $this->friendly_name = 'Файл (аттачмент или изображение)'; $this->prefix = 'doc1'; $this->path = ''; $this->filename = ''; $this->data = ""; $this->mysqlName = "varchar(255)"; $this->pgsqlName = "varchar(255)"; $this->params = ""; $this->preview_image_width = 100; } /** * Методы класса. Составляют интерфейс для работы с данными. * */ /** * Возвращает имя класса * * @return string */ function getClassName() { return "cmsFileType"; } /** * Берет значение из запроса POST * */ function getDataFromPOST() { global $HTTP_POST_FILES; $this->data = (empty($this->filename)) ? $HTTP_POST_FILES[$this->prefix]['name'] : $this->filename; if (!empty($this->path)) { $this->saveFile($this->path); } return; } /** * Возвращает SQL код для операции UPDATE * * @param string enum("mysql", "pgsql") * * @return string */ function getSQLUpdate($db_type = "mysql") { $sql = ""; switch ($db_type) { case "mysql" : $sql = $this->prefix." = '".$this->data."'"; break; case "pgsql" : $sql = $this->prefix." = '".$this->data."'"; break; default : $sql = $this->prefix." = '".$this->data."'"; break; } return $sql; } /** * Возвращает SQL код для операции INSERT * * @param string enum("mysql", "pgsql") * * @return Array(2) */ function getSQLInsert($db_type = "mysql") { $sql = Array(); switch ($db_type) { case "mysql" : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; case "pgsql" : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; default : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; } return $sql; } /** * Сохраняет POST аттачмент по заданному пути. * * @param string * * @return string */ function saveFile($_path, $_rewrite = False) { global $HTTP_POST_FILES, $_POST; $filepath = (empty($this->filename)) ? $_path.$HTTP_POST_FILES[$this->prefix]['name'] : $_path.$this->filename; $error = ""; { if (is_uploaded_file($HTTP_POST_FILES[$this->prefix]['tmp_name'])) { $_savefile = $filepath; if (!move_uploaded_file($HTTP_POST_FILES[$this->prefix]['tmp_name'], $_savefile)) { switch ($HTTP_POST_FILES[$this->prefix]['error']) { case 0: //no error; possible file attack! $error = "Возникла проблема при передаче файла"; break; case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini $error = "Размер файла превышает максимально допустимый"; break; case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form $error = "Размер файла превышает максимально допустимый"; break; case 3: //uploaded file was only partially uploaded $error = "Файл был передан с частичными повреждениями"; break; case 4: //no file was uploaded $error = "Файл не выбран"; break; default: //a default error, just in case! :) $error = "Возникла проблема при передаче файла"; break; } } else { $tmp = explode(".", $_savefile); $ext = strtolower($tmp[count($tmp)-1]); if ($ext == "jpeg") $ext = "jpg"; if (($ext == "jpg") || ($ext == "gif") || ($ext == "png") || ($ext != "bmp")) { dl("gd.so"); switch ($ext) { // case "gif": $im = ImageCreateFromGIF ($_savefile); break; case "jpg": $im = ImageCreateFromJPEG ($_savefile); break; case "png": $im = ImageCreateFromPNG ($_savefile); break; case "bmp": $im = ImageCreateFromWBMP ($_savefile); break; default : break; } if ($im && !$error) { $size = GetImageSize ($_savefile); $prop = $size[0] / $size[1]; if($prop > 1) { $otn = $this->preview_image_width / $size[0]; $preview_image_height = floor($size[1] * $otn); } else if($prop < 1) { $otn = $size[1] / $size[0]; $preview_image_height = floor($this->preview_image_width * $otn); } else $preview_image_height = $this->preview_image_width; $im_preview = ImageCreateTrueColor ($this->preview_image_width, $preview_image_height); if ($im_preview) { $_previewname = $_savefile.".preview.jpg"; imagecopyresampled ($im_preview, $im, 0, 0, 0, 0, $this->preview_image_width, $preview_image_height, $size[0], $size[1]); imagejpeg ($im_preview, $_previewname); imagedestroy ($im_preview); } imagedestroy ($im); } } } } } return $error; } /** * Возвращает HTML разметку данных. * * @return string */ function getHTMLData() { return Trim($this->data); } /** * Возвращает элемент HTML формы для данного типа * * @return string */ function getFORMData() { return "
"; } } /** * Boolean * * @link http://cms.alpha.inetra.ru * @version 1.0 * @copyright Copyright: 2003 Inetra, Inc. * @author Каючкин Александр * @access public */ class cmsBooleanType extends cmsIntegerType { /** * Конструктор */ function cmsBooleanType() { $this->friendly_name = 'Логическое значение (Y/N)'; $this->prefix = 'bool1'; $this->data = ""; $this->mysqlName = "varchar(1)"; $this->pgsqlName = "char(1)"; $this->params = ""; } /** * Методы класса. Составляют интерфейс для работы с данными. * */ /** * Возвращает имя класса * * @return string */ function getClassName() { return "cmsBooleanType"; } /** * Берет значение из запроса POST * */ function getDataFromPOST() { global $_POST; $this->data = (isset($_POST[$this->prefix])) ? "Y" : "N"; return; } /** * Возвращает SQL код для операции UPDATE * * @param string enum("mysql", "pgsql") * * @return string */ function getSQLUpdate($db_type = "mysql") { $sql = ""; switch ($db_type) { case "mysql" : $sql = $this->prefix." = '".$this->data."'"; break; case "pgsql" : $sql = $this->prefix." = '".$this->data."'"; break; default : $sql = $this->prefix." = '".$this->data."'"; break; } return $sql; } /** * Возвращает SQL код для операции INSERT * * @param string enum("mysql", "pgsql") * * @return Array(2) */ function getSQLInsert($db_type = "mysql") { $sql = Array(); switch ($db_type) { case "mysql" : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; case "pgsql" : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; default : $sql[0] = $this->prefix; $sql[1] = "'".$this->data."'"; break; } return $sql; } /** * Возвращает HTML разметку данных. * * @return string */ function getHTMLData() { return ($this->data == 'Y') ? "Y" : "N"; } /** * Возвращает элемент HTML формы для данного типа * * @return string */ function getFORMData() { $checked = ($this->data == 'Y') ? "checked" : ""; return ""; } } /** * List Type (Linked object) * * @link http://cms.alpha.inetra.ru * @version 1.0 * @copyright Copyright: 2003 Inetra, Inc. * @author Каючкин Александр * @access public */ class cmsListType extends cmsIntegerType { /** * Параметры (sql_table:sql_field:sql_key:sql_filter) * * @var string */ var $params = ""; /** * Конструктор */ function cmsListType() { $this->friendly_name = 'Выпадающий список'; $this->prefix = 'list1'; $this->data = 0; $this->mysqlName = "int(11)"; $this->pgsqlName = "integer"; $this->params = ""; } /** * Методы класса. Составляют интерфейс для работы с данными. * */ /** * Возвращает имя класса * * @return string */ function getClassName() { return "cmsListType"; } /** * Возвращает HTML разметку данных. * * @return string */ function getHTMLData() { $_params = explode(":", $this->params); if ($_params[0] && $_params[1]) // sql_table and sql_field { if (!$_params[2]) $_params[2] = "id"; if ($_params[3]) $_params[3] .= " AND "; $sql = "SELECT ".$_params[1]." FROM ".$_params[0]." WHERE $_params[3] ".$_params[2]." = ".$this->data; $val = $GLOBALS["db"]->getOne($sql); if (!DB::isError($val)) return $val; else return ""; } else return ""; } /** * Возвращает элемент HTML формы для данного типа * * @return string */ function getFORMData() { $_params = explode(":", $this->params); if ($_params[0] && $_params[1]) // sql_table and sql_field { if (!$_params[2]) $_params[2] = "id"; if ($_params[3]) $sql = "SELECT ".$_params[1].", ".$_params[2]." FROM ".$_params[0]." WHERE $_params[3] ORDER BY ".$_params[1]." ASC"; else $sql = "SELECT ".$_params[1].", ".$_params[2]." FROM ".$_params[0]." ORDER BY ".$_params[1]." ASC"; $arr = $GLOBALS["db"]->getAll($sql, DB_FETCHMODE_ASSOC); if (!DB::isError($arr)) { $ret = ""; return $ret; } else return ""; } else return ""; } } /** * Multi-Select List Type (Linked object) * * @link http://cms.alpha.inetra.ru * @version 1.0 * @copyright Copyright: 2003 Inetra, Inc. * @author Каючкин Александр * @access public */ class cmsMultiListType extends cmsStringType { /** * Конструктор */ function cmsMultiListType() { $this->friendly_name = 'Список (множественный выбор)'; $this->prefix = 'multilist1'; $this->data = Array(); $this->mysqlName = "varchar(255)"; $this->pgsqlName = "varchar(255)"; $this->params = ""; } /** * Возвращает имя класса * * @return string */ function getClassName() { return "cmsMultiListType"; } /** * Возвращает HTML разметку данных. * * @return string */ function getHTMLData($sql_filter = "") { $_params = explode(":", $this->params); $_data = explode(":", $this->data); $str_data = $_data[0]; for ($i = 1; $i < count($_data); $i++) { $str_data .= ",".$_data[$i]; } if ($_params[0] && $_params[1]) // sql_table and sql_field { if (!$_params[2]) $_params[2] = "id"; if ($_params[3]) $_params[3] .= " AND "; $sql = "SELECT ".$_params[1]." FROM ".$_params[0]." WHERE $_params[3] ".$_params[2]." in (".$str_data.")"; $val = $GLOBALS["db"]->getCol($sql); if (!DB::isError($val)) { for ($i = 0; $i < count($val); $i++) $str_val .= ($i+1).". ".$val[$i]."
"; return $str_val; } else return ""; } else return ""; } /** * Берет значение из запроса POST * */ function getDataFromPOST() { global $_POST; if (is_array($_POST[$this->prefix])) { $this->data = join(":", $_POST[$this->prefix]); } else { $this->data = ""; } return; } /** * Возвращает элемент HTML формы для данного типа * * @return string */ function getFORMData($sql_filter = "") { $_params = explode(":", $this->params); if ($_params[0] && $_params[1]) // sql_table and sql_field { if (!$_params[2]) $_params[2] = "id"; if ($_params[3]) $sql = "SELECT ".$_params[1].", ".$_params[2]." FROM ".$_params[0]." WHERE $_params[3] ORDER BY ".$_params[1]." ASC"; else $sql = "SELECT ".$_params[1].", ".$_params[2]." FROM ".$_params[0]." ORDER BY ".$_params[1]." ASC"; $arr = $GLOBALS["db"]->getAll($sql, DB_FETCHMODE_ASSOC); if (!DB::isError($arr)) { $ret = ""; return $ret; } else return ""; } else return ""; } } /** * Date Type * * @link http://cms.alpha.inetra.ru * @version 1.0 * @copyright Copyright: 2003 Inetra, Inc. * @author Каючкин Александр * @access public */ class cmsDateType extends cmsIntegerType { /** * Конструктор */ function cmsDateType() { $this->friendly_name = 'Дата / Время'; $this->prefix = 'date1'; $this->data = time(); $this->params = "d.m.Y"; $this->mysqlName = "int(11)"; $this->pgsqlName = "integer"; } /** * Возвращает имя класса * * @return string */ function getClassName() { return "cmsDateType"; } /** * Устанавливает формат данных. * * @param string */ function setFormat($_format) { $this->params = $_format; } /** * Возвращает HTML разметку данных. * * @return string */ function getHTMLData() { $monthes = Array("Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"); $html = ""; if (strchr($this->params, "d") != false) $html .= date("d", $this->data); if (strchr($this->params, "m") != false) $html .= " ".$monthes[1*date("m", $this->data)-1]; if (strchr($this->params, "Y") != false) $html .= " ".date("Y", $this->data); if (strchr($this->params, "H") != false) $html .= " ".date("H", $this->data); if (strchr($this->params, "i") != false) $html .= ":".date("i", $this->data); if (strchr($this->params, "s") != false) $html .= ":".date("s", $this->data); return $html; } /** * Берет значение из запроса POST * */ function getDataFromPOST() { global $_POST; $day = ($_POST[$this->prefix."_day"]) ? $_POST[$this->prefix."_day"] : 1; $month = ($_POST[$this->prefix."_month"]) ? $_POST[$this->prefix."_month"] : 1; $year = ($_POST[$this->prefix."_year"]) ? $_POST[$this->prefix."_year"] : 1970; $hour = ($_POST[$this->prefix."_hour"]) ? $_POST[$this->prefix."_hour"] : 0; $min = ($_POST[$this->prefix."_min"]) ? $_POST[$this->prefix."_min"] : 0; $sec = ($_POST[$this->prefix."_sec"]) ? $_POST[$this->prefix."_sec"] : 0; $this->data = mktime($hour, $min, $sec, $month, $day, $year); return; } /** * Возвращает элемент HTML формы для данного типа * * @return string */ function getFORMData() { if (!$this->data) $this->data = time(); $day = 1*date("d", $this->data); $month = 1*date("m", $this->data); $year = 1*date("Y", $this->data); $hour = 1*date("H", $this->data); $min = 1*date("i", $this->data); $sec = 1*date("s", $this->data); $html = ""; if (strchr($this->params, "d") != false) { $html .= ""; } if (strchr($this->params, "m") != false) { $monthes = Array("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"); //$monthes = Array("Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"); $html .= ""; } if (strchr($this->params, "Y") != false) { $html .= ""; } if (strchr($this->params, "H") != false) { $html .= "  Час: "; $html .= ""; } if (strchr($this->params, "i") != false) { $html .= "  Мин: "; $html .= ""; } if (strchr($this->params, "s") != false) { $html .= "  Сек: "; $html .= ""; } return $html; } /** * Возвращает данные. * * @return string */ function get() { $dd = $this->data; if ($dd < 1) $dd = 0; $dd_day = (strchr($this->params, "d") != false) ? date("d", $dd) : 1; $dd_month = (strchr($this->params, "m") != false) ? date("m", $dd) : 1; $dd_year = (strchr($this->params, "Y") != false) ? date("Y", $dd) : 1970; $dd_hour = (strchr($this->params, "H") != false) ? date("H", $dd) : 0; $dd_min = (strchr($this->params, "i") != false) ? date("i", $dd) : 0; $dd_sec = (strchr($this->params, "s") != false) ? date("s", $dd) : 0; $this->data = mktime($dd_hour, $dd_min, $dd_sec, $dd_month, $dd_day, $dd_year); return $this->data; } /** * Принимает значение. * * @param Mixed */ function set($_data) { $this->data = $_data; $this->data = $this->get(); return; } /** * Возвращает SQL код для операции UPDATE * * @param string enum("mysql", "pgsql") * * @return string */ function getSQLUpdate($db_type = "mysql") { $this->data = $this->get(); $sql = ""; switch ($db_type) { case "mysql" : $sql = $this->prefix." = ".$this->data; break; case "pgsql" : $sql = $this->prefix." = ".$this->data; break; default : $sql = $this->prefix." = ".$this->data; break; } return $sql; } /** * Возвращает SQL код для операции INSERT * * @param string enum("mysql", "pgsql") * * @return Array(2) */ function getSQLInsert($db_type = "mysql") { $this->data = $this->get(); $sql = Array(); switch ($db_type) { case "mysql" : $sql[0] = $this->prefix; $sql[1] = $this->data; break; case "pgsql" : $sql[0] = $this->prefix; $sql[1] = $this->data; break; default : $sql[0] = $this->prefix; $sql[1] = $this->data; break; } return $sql; } } ?> * @access private */ class DB_Tree { /** * Массив узлов * * @var Array Массив данных */ var $nodes = Array(); /** * Скользящий индекс узла. Используется для пробега по дереву. * * @var Int */ var $index = 0; /** * Database connection pointer * * @var Object Объект класса DB (Pear) */ var $conn = NULL; /** * Имя таблицы данных дерева * * Обязательные поля: * 1. id int Номер узла * 2. parent_id int Номер родительского узла * 3. position int Порядок сортировки (изначально равен id) * * @var String */ var $table = ""; /** * Дополнительные условия для выбора данных (WHERE STATEMENT FOR SELECT) * * @var String */ var $condition = ""; /** * Инициализирует объект * * @param Object DB - Коннектор * @param String Таблица данных */ function Init($_conn, $_table) { $this->conn = $_conn; $this->table = $_table; $this->index = 0; $this->nodes = Array(); $this->condition = ""; } function _getTree($node_id, $deep, $deep_koef) { if (!$this->conn) return; if (empty($this->condition)) $sql = "SELECT * FROM ".$this->table." WHERE parent_id = ".$node_id." ORDER BY position"; else $sql = "SELECT * FROM ".$this->table." WHERE parent_id = ".$node_id." AND $this->condition ORDER BY position"; $_nodes = $GLOBALS["db"]->getAll($sql, DB_FETCHMODE_ASSOC); for ($i = 0; $i < count($_nodes); $i++) { $this->nodes[$this->index] = $_nodes[$i]; $this->nodes[$this->index]["deep"] = $deep * $deep_koef; $this->index++; $this->_getTree($_nodes[$i]["id"], $deep + 1, $deep_koef); } } /** * Возвращает дерево данных * * @param int $id Узел с которого начинается обход * @param int $deep На сколько увеличивать глубину узла * @return mixed Массив данных */ function getTree($node_id, $deep = 1, $_condition = "") { $this->nodes = Array(); $this->index = 0; $this->condition = $_condition; $this->_getTree($node_id, 0, $deep); $this->condition = ""; return $this->nodes; } /** * Возвращает узел по номеру * * @param int $id Номер узла * @return mixed Объект данных узла */ function getNode($node_id, $_condition = "") { $sql = "SELECT * FROM ".$this->table." WHERE id = ".$node_id; if ($_condition) $sql .= " AND ".$_condition; $_node = $GLOBALS["db"]->getRow($sql, DB_FETCHMODE_ASSOC); return $_node; } /** * Возвращает родительский узел * * @param int $id Номер узла * @return mixed Объект данных узла */ function getParent($node_id, $_condition = "") { $sql = "SELECT parent_id FROM ".$this->table." WHERE id = ".$node_id; $_parent_id = $GLOBALS["db"]->getOne($sql); if ($_parent_id > 0) { $sql = "SELECT * FROM ".$this->table." WHERE id = ".$_parent_id; $_parent = $GLOBALS["db"]->getRow($sql, DB_FETCHMODE_ASSOC); return ($_parent["id"] > 0) ? $_parent : NULL; } return NULL; } /** * Возвращает массив дочерних узлов * * @param int $id Номер узла * @return Array Массив узлов */ function getChildren($node_id, $_condition = "") { if (!$_condition) $sql = "SELECT * FROM ".$this->table." WHERE parent_id = ".$node_id." ORDER BY position"; else $sql = "SELECT * FROM ".$this->table." WHERE parent_id = ".$node_id." AND ".$_condition." ORDER BY position"; return $GLOBALS["db"]->getAll($sql, DB_FETCHMODE_ASSOC); } /** * Возвращает массив узлов от самого узла до root (обратная навигация) * * @param int $id Номер узла * @return Array Массив узлов */ function getNodePath($node_id, $_condition = "") { $path = Array(); $sql = "SELECT * FROM ".$this->table." WHERE id = ".$node_id; if ($_condition) $sql .= " AND ".$_condition; $path[0] = $GLOBALS["db"]->getRow($sql, DB_FETCHMODE_ASSOC); $i = 0; while (true) { $sql = "SELECT * FROM ".$this->table." WHERE id = ".$path[$i]["parent_id"]; if ($_condition) $sql .= " AND ".$_condition; $nn = $GLOBALS["db"]->getRow($sql, DB_FETCHMODE_ASSOC); if ($nn["id"] > 0) { $path[++$i] = $nn; } else break; } return array_reverse($path); } /** * Поднимает узел на позицию вверх, относительно узлов этого же уровня * * @param int $id Номер узла */ function upNode($node_id, $_condition = "") { global $GLOBALS; $sql = "SELECT * FROM ".$this->table." WHERE id = ".$node_id; if ($_condition) $sql .= " AND ".$_condition; $node = $GLOBALS["db"]->getRow($sql, DB_FETCHMODE_ASSOC); if ($_condition) $sql = "SELECT * FROM ".$this->table." WHERE $_condition AND position < ".$node["position"]." AND parent_id = ".$node["parent_id"]." ORDER BY position DESC "; else $sql = "SELECT * FROM ".$this->table." WHERE position < ".$node["position"]." AND parent_id = ".$node["parent_id"]." ORDER BY position DESC "; switch (trim(substr($GLOBALS["dsn"], 0, strpos($GLOBALS["dsn"], ":")))) { case "pgsql": $sql .= " LIMIT 1 OFFSET 0"; break; case "mysql": $sql .= " LIMIT 0, 1"; break; default: die ("Unsupported database server - ".substr($GLOBALS["dsn"], 0, strpos($GLOBALS["dsn"], ":"))); } $nextnode = $GLOBALS["db"]->getRow($sql, DB_FETCHMODE_ASSOC); if ($node["id"] && $nextnode["id"]) { $sql = "UPDATE ".$this->table." SET position = ".$node["position"]." WHERE id = ".$nextnode["id"]; $GLOBALS["db"]->query($sql); $sql = "UPDATE ".$this->table." SET position = ".$nextnode["position"]." WHERE id = ".$node["id"]; $GLOBALS["db"]->query($sql); } } /** * Опускает узел на позицию вниз, относительно узлов этого же уровня * * @param int $id Номер узла */ function downNode($node_id, $_condition) { $sql = "SELECT * FROM ".$this->table." WHERE id = ".$node_id; if ($_condition) $sql .= " AND ".$_condition; $node = $GLOBALS["db"]->getRow($sql, DB_FETCHMODE_ASSOC); if ($_condition) $sql = "SELECT * FROM ".$this->table." WHERE $_condition AND position > ".$node["position"]." AND parent_id = ".$node["parent_id"]." ORDER BY position ASC "; else $sql = "SELECT * FROM ".$this->table." WHERE position > ".$node["position"]." AND parent_id = ".$node["parent_id"]." ORDER BY position ASC "; switch (trim(substr($GLOBALS["dsn"], 0, strpos($GLOBALS["dsn"], ":")))) { case "pgsql": $sql .= " LIMIT 1 OFFSET 0"; break; case "mysql": $sql .= " LIMIT 0, 1"; break; default: die ("Unsupported database server - ".substr($GLOBALS["dsn"], 0, strpos($GLOBALS["dsn"], ":"))); } $nextnode = $GLOBALS["db"]->getRow($sql, DB_FETCHMODE_ASSOC); if ($node["id"] && $nextnode["id"]) { $sql = "UPDATE ".$this->table." SET position = ".$node["position"]." WHERE id = ".$nextnode["id"]; $GLOBALS["db"]->query($sql); $sql = "UPDATE ".$this->table." SET position = ".$nextnode["position"]." WHERE id = ".$node["id"]; $GLOBALS["db"]->query($sql); } } /** * Удаляет узел из дерева * * @param int $id Номер узла * @param bool $all Если true, то удаляет рекурсивно все дочерние узлы, * иначе удаляет узел, а всех потомкам назначает вышестоящего родителя. */ function removeNode($node_id, $all = false) { $sql = "SELECT * FROM ".$this->table." WHERE id = ".$node_id; $node = $GLOBALS["db"]->getRow($sql, DB_FETCHMODE_ASSOC); if ($node["id"] < 1) return; if (!$all) { $sql = "DELETE FROM ".$this->table." WHERE id = ".$node["id"]; $GLOBALS["db"]->query($sql); $sql = "UPDATE ".$this->table." SET parent_id = ".$node["parent_id"]." WHERE parent_id = ".$node["id"]; $GLOBALS["db"]->query($sql); } else { $this->removeChildren($node_id); $this->removeNode($node_id, false); } } /** * Рекурсивно удаляет все дочерние ветви узла * * @param int $id Номер узла */ function removeChildren($node_id) { if ($node_id < 1) return; $children = $this->getChildren($node_id); for ($i = 0; $i < count($children); $i++) { $this->removeChildren($children[$i]["id"]); $this->removeNode($children[$i]["id"], false); } } } ?> 2008.gorenje - Холодильник -

Все ваши работы

Рейтинг — 18 голосов

Код для блога

скопировать код
Отправить другу: