-
Публикации
1 592 -
Зарегистрирован
-
Посещение
-
Дней в лидерах
12
Сообщения, опубликованные пользователем IT-Security
-
-
А что, требуется новое API?
-
К сожалению из-за большой нагрузки я не успел скинуть релиз Владимиру в срок.
Поэтому DleAPI v2.0 будет интегрировано в DLE 9.0 API Edition.
- 3
-
Спасибо)Буду ждать пожеланий.
- 1
-
Есть антилич, не вызывает нагрузку, так как отдаёт маленькими кусками файл.
Есть докачка. Есть поддержка большого количества поддоменом для хранения. Нужен небольшой мод ДЛЕ, чтобы определить какой юзер имеет право качать, а какой нет.
ВНЕ авторизации и ВНЕ домена не скачаешь
На реализацию ушло прилично времени, учтено ВСЁ
дорого
-
Не проще хостинг на нормальный сменить раз такие проблемы?)
- 1
-
А канал то на сервере какой?Может загрузкой просто канал убивается?
-
Да вообщем-то никто и не говорит, что Вы злой.
Т.е. по вопросу более полного анализа при регистрации Вы возможно измените код в API ?
ЗЫ: Про по поводу "задницы" согласен. За что Вам почет и уважение
Разумеется. Я ведь не только для себя его пишу
Добавлю свои 5 копеек
Сейчас глянул функцию кеширования... м... У меня либо ошибки так полезут, либо вообще ничего не произойдет, ну, как я понимаю это дело. В любом случае, пока особо пользоваться АПИ не спешу - много не понятно и видится еще сырым, если я правильно думаю.
Вот, например, не ясно, откуда берется $fname - как его задавать? Я думал сначала, что это уже по умолчанию идет, но если мы задаем "имя" произвольно для создания временного файлика, то у меня такое не прокатит и я даже не буду знать, где и куда копать, просто потому, что у меня запрещено на серваке что-либо создавать, копировать и т.д., отключены частично курлы и некоторые функции - фиг его знает, зачем такой геморой, но, видимо, хостер так борется со взломами В любом случае, пока написал свои очень огромные функции почти под всё мне необходимое, учёл все возможные варианты, чего должно быть и в АПИ
public static function saveToCache ($fname, $vars) { $filename = $fname . '.tmp'; if (is_array($vars)) { $vars = serialize($vars); } if (is_writable(self::$cache_dir.$filename)) { file_put_contents (self::$cache_dir.$filename, $vars); return $vars; } return; }
Для себя я писал что-то типа:
if (is_file) {
if (@file_put_contents()) {...}
else echo 'No writing cash.';
} else echo 'No existing file.';
Еще с десяток различных проверок на различные функции, например, проверку наличия и работы функции CHMODE, которая у меня также выключена.
Если проверок не делать, то ничего просто не будет работать и просто навсего ничего не произойдет в модуле, хотя при этом никаких ошибок не будет, а просто пустая страница - прыгай потом вокруг коста с бубном по ночам...
Моя система кэширования пишет в ту же папку, что и кэш ДЛЕ. Просто она более удобна, чем длешная.
Если у Вас всё так плохо, то и встроенная система кэша работать по идее не должна.
$fname - имя файла
-
cache в custom должен быть включен + кэширование в движке должно быть включено и всё будет ОК.
-
SELECT id, autor, date, short_story, full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate, rating, vote_num, news_read, flag, editdate, editor, reason, view_edit, tags FROM dle_post WHERE category IN ('1','3','4','5','6','7','8','9',' 10','11','12','13','14','15','16','17',' 18','19','20','21','22') AND approve ORDER BY fixed desc, date DESC LIMIT 0,9
Используете тэг custom на страницах?Видимо с выключенным кэшированием.
-
Кэширование включено?
-
Не ну одну, а две.
Ещё класс апи вставить нужно.
<?php require_once ('engine/api/api.class.php'); $dle_api->install_admin_module (тут_аргументы); ?>
-
Это для установка модуля в админку. А использовать видимо нужно при его инсталяции))
-
Да вообщем-то никто и не говорит, что Вы злой. Но людей который не просто сидят за заднице - единицы и приходится всё проектировать самому.
-
Если у Вас есть доступ к базе - напишите или закажите скрипт который туда вставит посты и всё.
-
Есть в ToDO - будет в релизе.
-
Посмеялся над "взломщиком"... Оказывается использование прокси является серьёзным хаком...
-
Если модуль не будет интегрирован в ДЛЕ, то можно использовать API.
Там уже есть и подключён класс БД и настроен.
-
Отсутствие личной жизни сказывается xDDD
-
Не вижу в этом смысла. К АПИ это не имеет отношения на данный момент.
-
Разумеется учить ПХП. Я ведь сказал, что это инструмент для создания и поддержания модулей)
Версия 2.0 Alpha:
1) Реализовано
6) Реализован sendEmailMessage
Дополнительно:
- Оптимизирован весь код
- Проверки email заменены на аналоги из версии 8.5
- Функции сгруппированы по типам
- Изменён стиль кода
- Улучшен синтаксис SQL
-
АПИ нужно для удобной разработки и поддержания модулей.
Никакого отношения к безопасности и косякам оно не имеет. Это просто инструмент.
-
Пресс релиз исходника
Для затравки так сказать
<?php /** * API for DataLife Engine * @package DLE * @subpackage API * @author IT-Security * @since DLE 9.0 */ /* ===================================================== DataLife Engine - by SoftNews Media Group ----------------------------------------------------- http://dle-news.ru/ ----------------------------------------------------- Copyright (c) 2010 IT-Security (Asafov Sergey) ===================================================== Данный код защищен авторскими правами ===================================================== Файл: api.class.php ----------------------------------------------------- Назначение: API для написания модификаций или интеграции в другие скрипты Версия 2.0 под PHP5 ===================================================== */ if( ! defined( 'DATALIFEENGINE' ) ) { define( 'DATALIFEENGINE', true ); } if( ! defined( 'ROOT_DIR' ) ) { define( 'ROOT_DIR', substr( dirname( __FILE__ ), 0, - 11 ) ); } if( ! defined( 'ENGINE_DIR' ) ) { define( 'ENGINE_DIR', ROOT_DIR . '/engine' ); } if( ! class_exists( 'DleAPI' ) ) { class DleAPI { public static $config = Array (); public static $db = false; public static $version = '2.0'; public static $cache_dir = ''; public static $_TIME = 0; public static $mail = false; public static $cache_files = Array (); /** * Initialisation */ public static function init () { if (!isset(self::$config['version_id'])) { include_once (ENGINE_DIR . '/data/config.php'); self::$config = $config; } if (!self::$db) { include_once (ENGINE_DIR . '/classes/mysql.php'); include_once (ENGINE_DIR . '/data/dbconfig.php'); self::$db = $db; } self::$cache_dir = ENGINE_DIR."/cache/"; if (isset($_TIME)) { self::$_TIME = $_TIME; } else { self::$_TIME = time () + (self::$config['date_adjust'] * 60); } if (isset($mail)) { self::$mail = $mail; } else { include_once ENGINE_DIR.'/classes/mail.class.php'; self::$mail = new dle_mail (self::$config, true); } } /* * Service */ /** * Service function - take params from table * @param $table string - название таблицы * @param $fields string - необходимые поля через запятйю или * для всех * @param $where string - условие выборки * @param $multirow bool - забирать ли один ряд или несколько * @param $start int - начальное значение выборки * @param $limit int - количество записей для выборки, 0 - выбрать все * @param $sort string - поле, по которому осуществляется сортировка * @param $sort_order - направление сортировки * @return array с данными или false если mysql вернуль 0 рядов */ public static function loadTable ($table = '', $fields = "*", $where = '1', $multirow = false, $start = 0, $limit = 0, $sort = '', $sort_order = 'desc') { $values = Array (); if (!$table) { return ; } if ($sort!='') { $where.= ' order by '.$sort.' '.$sort_order; } if ($limit>0) { $where.= ' limit '.$start.','.$limit; } $q = self::$db->query ("Select ".$fields." from `".$table."` where ".$where); if ($multirow) { while ($row = self::$db->get_row($q)) { $values[] = $row; } } else { $values = self::$db->get_row($q); } if (count($values)==0) { return ; } return $values; } /** * Проверка существования группы с указанным ID * @param $group int - ID группы * @return bool - true если существует и false если нет */ private static function _checkGroup($group) { $row = $this->db->super_query('SELECT `id` FROM `'.USERPREFIX.'_usergroups` WHERE `id` = '.intval($group)); return isset($row['id']); } /** * Сохранение параметров скрипта * @param $key string или array * string: Название параметра * array: ассоциативный массив параметров * @param $new_value - значение параметра. Не используется, если $key массив * @return null; */ public static function editConfig ($key, $new_value = '') { $find = Array (); $replace = Array (); $find[] = "'\r'"; $replace[] = ""; $find[] = "'\n'"; $replace[] = ""; if (is_array($key)) { foreach ($key as $ckey=>$cvalue) { if (self::$config[$ckey]) { self::$config[$ckey] = $cvalue; } } } else { if (self::$config[$key]) { self::$config[$key] = $new_value; } } // Записываем новый конфиг $handle = @fopen(ENGINE_DIR.'/data/config.php', 'w'); fwrite( $handle, "<?PHP \n\n//System Configurations\n\n\$config = array (\n\n" ); foreach ( self::$config as $name => $value ) { if( $name != "offline_reason" ) { $value = trim( stripslashes( $value ) ); $value = htmlspecialchars( $value); $value = preg_replace( $find, $replace, $value ); $name = trim( stripslashes( $name ) ); $name = htmlspecialchars( $name, ENT_QUOTES ); $name = preg_replace( $find, $replace, $name ); } $value = str_replace( "$", "$", $value ); $value = str_replace( "{", "{", $value ); $value = str_replace( "}", "}", $value ); $name = str_replace( "$", "$", $name ); $name = str_replace( "{", "{", $name ); $name = str_replace( "}", "}", $name ); fwrite( $handle, "'{$name}' => \"{$value}\",\n\n"); } fwrite( $handle, ");\n\n?>" ); fclose( $handle ); self::cleanCache(); } /** * Установка административной части модуля * @param $name string - название модуля, а именно файла .php находящегося в папке engine/inc/, но без расширения файла * @param $title string - заголовок модуля * @param $descr string - описание модуля * @param $icon string - имя иконки для модуля, без указания пути. Иконка обязательно при этом должна находится в папке engine/skins/images/ * @param $perm string - информация о группах которым разрешен показ данного модуля. Данное поле может принимать следующие значения: all или ID групп через запятую. Например: 1,2,3. если указано значение all то модуль будет показываться всем пользователям имеющим доступ в админпанель * @return bool - true если успешно установлено и false если нет */ public static function installAdminModule ($name, $title, $descr, $icon, $perm = '1') { $name = self::$db->safesql($name); $title = self::$db->safesql($title); $descr = self::$db->safesql($descr); $icon = self::$db->safesql($icon); $perm = self::$db->safesql($perm); // Для начала проверяем наличие модуля self::$db->query("Select name from `".PREFIX."_admin_sections` where name = '$name'"); if (self::$db->num_rows()>0) { // Модуль есть, обновляем данные self::$db->query("UPDATE `".PREFIX."_admin_sections` set title = '$title', descr = '$descr', icon = '$icon', allow_groups = '$perm' where name = '$name'"); return true; } else { // Модуля нету, добавляем self::$db->query("INSERT INTO `".PREFIX."_admin_sections` (`name`, `title`, `descr`, `icon`, `allow_groups`) VALUES ('$name', '$title', '$descr', '$icon', '$perm')"); return true; } return false; } /** * Удаление административной части модуля * @param $name string - название модуля * @return null */ public static function uninstallAdminModule ($name) { $name = self::$db->safesql($name); self::$db->query("DELETE FROM `".PREFIX."_admin_sections` where `name` = '$name'"); } /** * Изменение прав административной части модуля * @param $name string - название модуля * @param $perm string - информация о группах которым разрешен показ данного модуля. Данное поле может принимать следующие значения: all или ID групп через запятую. Например: 1,2,3. если указано значение all то модуль будет показываться всем пользователям имеющим доступ в админпанель * @return null */ public static function changeAdminModulePerms ($name, $perm) { $name = self::$db->safesql($name); $perm = self::$db->safesql($perm); self::$db->query("UPDATE `".PREFIX."_admin_sections` set `allow_groups` = '$perm' where `name` = '$name'"); } /* * Users */ /** * Получение информации о пользователе по его ID * @param $user_id int - ID пользователя * @param $select_list string - Перечень полей с информации или * для всех * @return Массив с данными в случае успеха и false если пользователь не найден */ public static function takeUserById ($user_id, $select_list = '*') { $user_id = intval ($user_id); if ($user_id<=0) { return ; } $row = self::loadTable (USERPREFIX."_users", $select_list, "`user_id` = '$user_id'"); if (count($row)==0) { return ; } return $row; } /** * Получение информации о пользователе по его имени * @param $name string - Имя пользователя * @param $select_list string - Перечень полей с информации или * для всех * @return Массив с данными в случае успеха и false если пользователь не найден */ public static function takeUserByName ($name, $select_list = '*') { $name = self::$db->safesql ($name); if ($name == '') { return ; } $row = self::loadTable(USERPREFIX."_users", $select_list, "`name` = '$name'"); if (count($row)==0) { return ; } return $row; } /** * Получение информации о пользователе по его емайлу * @param $email string - Емайл пользователя * @param $select_list string - Перечень полей с информации или * для всех * @return Массив с данными в случае успеха и false если пользователь не найден */ public static function takeUserByEmail ($email, $select_list = '*') { $email = self::$db->safesql ($email); if ($email == '') { return ; } $row = self::loadTable(USERPREFIX."_users", $select_list, "`email` = '$email'"); if (count($row)==0) { return ; } return $row; } /** * Получение данных пользователей определённой группы * @param $group int - ID группы * @param $select_list string - Перечень полей с информации или * для всех * @param $limit int - Количество получаемых пользователей * @return 2-х мерный массив с данными в случае успеха и false если пользователь не найден */ public static function takeUsersByGroup ($group, $select_list = "*", $limit = 0) { $group = intval ($group); if ($group<=0) { return ; } $data = self::loadTable(USERPREFIX."_users", $select_list, "`user_group` = '$group'", true, 0, $limit); if (count($data)==0) { return ; } return $data; } /** * Получение данных пользователей, засветившихся под определённым IP * @param $ip string - Интересующий нас IP * @param $like bool - использовать ли маску при поиске * @param $select_list string - Перечень полей с информации или * для всех * @param $limit int - Количество получаемых пользователей * @return 2-х мерный массив с данными в случае успеха и false если пользователь не найден */ public static function takeUsersByIp ($ip, $like = false, $select_list = "*", $limit = 0) { $ip = self::$db->safesql( $ip ); $data = array(); if( $ip == '' ) { return; } if( $like ) { $condition = "`logged_ip` like '$ip%'"; } else { $condition = "`logged_ip` = '$ip'"; } $data = self::loadTable(USERPREFIX."_users", $select_list, $condition, true, 0, $limit); if( count( $data ) == 0 ) { return; } else { return $data; } } /** * Смена имени пользователя * @param $user_id int - ID пользователя * @param $new_name string - Новое имя пользователя * @return bool - true в случае успеха и false ежели новое имя уже занято другим пользователем */ public static function changeUserName ($user_id, $new_name) { $user_id = intval( $user_id ); $new_name = self::$db->safesql( $new_name ); $count_arr = self::loadTable(USERPREFIX."_users", "count(user_id) as count", "name = '$new_name'"); $count = $count_arr['count']; if( $count > 0 ) { return; } $old_name_arr = self::loadTable(USERPREFIX."_users", "name", "user_id = '$user_id'"); $old_name = $old_name_arr['name']; // Fix old name self::$db->query( "UPDATE `" . PREFIX . "_post` SET `autor`='$new_name' WHERE `autor`='{$old_name}'" ); self::$db->query( "UPDATE `" . PREFIX . "_comments` SET `autor`='$new_name' WHERE `autor`='{$old_name}' AND `is_register`='1'" ); self::$db->query( "UPDATE `" . USERPREFIX . "_pm` SET `user_from`='$new_name' WHERE `user_from`='{$old_name}'" ); self::$db->query( "UPDATE `" . PREFIX . "_vote_result` SET `name`='$new_name' WHERE `name`='{$old_name}'" ); self::$db->query( "UPDATE `" . PREFIX . "_images` SET `author`='$new_name' WHERE `author`='{$old_name}'" ); self::$db->query( "UPDATE `" . USERPREFIX . "_users` set `name` = '$new_name' where `user_id` = '$user_id'" ); return true; } /** * Изменение пароля пользователя * @param $user_id int - ID пользователя * @param $new_password string - новый пароль * @return null */ public static function changeUserPassword($user_id, $new_password) { $user_id = intval( $user_id ); $new_password = md5( md5( $new_password ) ); self::$db->query( "update " . USERPREFIX . "_users set `password` = '$new_password' where `user_id` = '$user_id'" ); } /** * Изменение емайла пользователя * @param $user_id int - ID пользователя * @param $new_email string - новый емайл пользователя * @return int - некий код * -2: некорректный емайл * -1: новый емайл используется другим пользователем * 1: операция прошла успешно */ public static function changeUserEmail($user_id, $new_email) { $user_id = intval( $user_id ); if( (! preg_match('/^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])'.'(([a-z0-9-])*([a-z0-9]))+' . '(\.([a-z0-9])([-a-z0-9_-])?([a-z0-9])+)+$/i', $new_email )) or (empty( $new_email )) ) { return -2; } $new_email = self::$db->safesql( $new_email ); $email_exist_arr = self::loadTable(USERPREFIX."_users", "count(user_id) as count", "email = '$new_email'"); if ($email_exist_arr['count'] > 0) { return -1; } $q = self::$db->query( "update " . USERPREFIX . "_users set email = '$new_email' where user_id = '$user_id'" ); return 1; } /** * Изменение группы пользователя * @param $user_id int - ID пользователя * @param $new_group int - ID новой группы пользователя * @return bool - true в случае успеха и false если указан ID несуществующей группы */ public static function changeUserGroup($user_id, $new_group, $limit=0) { $user_id = intval( $user_id ); $new_group = intval( $new_group ); if(self::_checkGroup($new_group) === false) { return; } if ($limit>0) { $time_limit = self::$_TIME+$limit; self::$db->query( "update " . USERPREFIX . "_users set `user_group` = '$new_group', `time_limit` = '$time_limit' where `user_id` = '$user_id'" ); } else { self::$db->query( "update " . USERPREFIX . "_users set `user_group` = '$new_group' where `user_id` = '$user_id'" ); } return true; } /** * Авторизация пользователя по имени и паролю * @param $login string - имя пользователя * @param $password string - пароль пользователя * @return bool * true: разрешаем авторизацию * false: авторизация не пройдена */ public static function externalAuth($login, $password) { $login = self::$db->safesql( $login ); $password = md5( md5( $password ) ); $arr = self::loadTable(USERPREFIX."_users", "user_id", "`name` = '$login' AND `password` = '$password'"); if( ! empty( $arr['user_id'] ) ) return true; else return; } /** * Внешняя авторизация * @param $source array - Массив с данными [ * - dle_user_id - ID пользователя, * - dle_password - хэш * ] * @return * bool false - авторизация не пройдена * array - массив с данными пользователя */ public static function checkAuth ($source='') { // Пробуем по переданному массиву if (isset($source['dle_user_id'])) { $user_id = intval($source['dle_user_id']); $hash = md5 ($source['dle_password']); } elseif (isset($_SESSION['dle_user_id'])) { // По сессии $user_id = intval($_SESSION['dle_user_id']); $hash = md5 ($_SESSION['dle_password']); } elseif (isset($_COOKIE['dle_user_id'])) { $user_id = intval($_COOKIE['dle_user_id']); $hash = md5 ($_COOKIE['dle_password']); } else { return; } $res = self::$db->get_row( self::$db->query("Select * from `".USERPREFIX."_users` where `user_id` = '$user_id' AND `password` = '$hash'")); if (isset($res['user_id'])) { return $res; } return; } /** * Добавление в базу нового пользователя * @param $login string - имя пользователя * @param $password string - пароль пользователя * @param $email string - емайл пользователя * @param $group int - группа пользователя * @return int - код * -4: задана несуществующая группа * -3: некорректный емайл * -2: емайл занят другим пользователем * -1: имя пользователя тоже занято, вот неудача * 1: операция прошла успешно */ public static function externalRegister($login, $password, $email, $group) { $login = $this->db->safesql( $login ); $password = md5( md5( $password ) ); $email = self::$db->safesql( $email ); $group = intval( $group ); $login_exist_arr = self::loadTable(USERPREFIX."_users", "count(user_id) as count", "name = '$login'"); if ( $login_exist_arr['count'] > 0 ) { return -1; } $email_exist_arr = self::loadTable(USERPREFIX."_users", "count(user_id) as count", "email = '$email'"); if( $email_exist_arr['count'] > 0 ) { return -2; } if ((!preg_match("/^([a-z0-9]([\-\_\.]*[a-z0-9])*)+@([a-z0-9]([\-]*[a-z0-9])*\.)+[a-z]{2,6}$/i", $email ) || (empty( $email )) || strlen( $email ) > 50)) { return -3; } if($this->checkGroup($group) === false) { return -4; } $now = self::$_TIME; $q = self::$db->query( "insert into " . USERPREFIX . "_users (`email`, `password`, `name`, `user_group`, `reg_date`) VALUES ('$email', '$password', '$login', '$group', '$now')" ); return 1; } /** * Метод для обновления поля в таблице базы * @param int $user_id - ID пользователя * @param string $field - название поля * @param string $value - значение поля */ public static function updateProfile ($user_id, $field, $value) { if (is_array ($field) && is_array($value)) { foreach ($field as $key=>$val) { self::updateProfile ($user_id, $field[$key], $value[$key]); } return ; } if ($field=='user_id') { return; } elseif ($field=='name') { return self::changeUserName ($user_id, $value); } elseif ($field=='password') { return self::changeUserPassword ($user_id, $value); } elseif ($field=='email') { return self::changeUserEmail ($user_id, $value); } elseif ($field=='user_group') { return self::changeUserGroup($user_id, $value); } else { $field = self::$db->safesql($field); $value = self::$db->safesql($value); // Check $fields = Array (); $fields_arr = self::loadTable(USERPREFIX.'_users', '*', '1', false, 0, 1); foreach ($fields_arr as $k=>$v) { $fields[] = $k; } if (in_array($field, $fields)) { self::$db->query ("UPDATE `".USERPREFIX."_users` SET `".$field."` = '$value' WHERE `user_id` ='$user_id'"); return true; } return; } } /** * Messaging */ /** * Отправка пользователю персонального сообщения * @param $user_id int - ID получателя * @param $subject string - тема сообщения * @param $text string - текст сообщения * @param $from string - имя отправителя * @return int - код * -1: получатель не существует * 0: операция неудалась * 1: операция прошла успешно */ public static function sendPmToUser ($user_id, $subject, $text, $from) { $user_id = intval( $user_id ); // Check if user exist $count_arr = self::loadTable(USERPREFIX."_users", "count(user_id) as count", "user_id = '$user_id'"); if($count_arr['count'] == 0 ) { return - 1; } $subject = $this->db->safesql( $subject ); $text = $this->db->safesql( $text ); $from = $this->db->safesql( $from ); $now = self::$_TIME; $q = $this->db->query( "insert into " . PREFIX . "_pm (subj, text, user, user_from, date, pm_read, folder) VALUES ('$subject', '$text', '$user_id', '$from', '$now', 'no', 'inbox')" ); if( ! $q ) { return 0; } self::$db->query( "update " . USERPREFIX . "_users set pm_unread = pm_unread + 1, pm_all = pm_all+1 where user_id = '$user_id'" ); return 1; } /** * Метод для отправки email-сообшения пользователю * @param int $user_id - ID пользователя * @param string $subject - заголовок сообщения * @param string $text - тело сообщения */ public static function sendEmailToUser ($user_id, $subject, $text) { $user_id = intval( $user_id ); // Check if user exist $check = self::loadTable(USERPREFIX."_users", "email", "user_id = '$user_id'"); if(!isset($check['email'])) { return - 1; } $charset = self::$config['charset']; $text = <<<HTML <html><title>{$subject}</title> <meta content="text/html; charset={$charset}" http-equiv=Content-Type> <style type="text/css"> html,body{ font-size: 11px; font-family: verdana; } a:active, a:visited, a:link { color: #4b719e; text-decoration:none; } a:hover { color: #4b719e; text-decoration: underline; } </style> <body> {$text} </body> </html> HTML; self::$mail->send ($check['email'], $subject, $text); } /** * Cache */ /** * Получение массива содержащего названия файлов кеша * @return array */ public static function getCachedFiles() { $handle = opendir($this->cache_dir); while (($file = readdir($handle)) !== false) { if ($file != '.' && $file != '..' && (!is_dir($this->cache_dir.$file) && $file !='.htaccess')) { $this->cache_files [] = $file; } } closedir($handle); } /** * Удаление кеша * @param $name string - имя файла для удаления. При значении GLOBAL удаляем весь кеш * @return null */ public static function cleanCache($name = 'GLOBAL') { self::getCachedFiles(); if ($name=='GLOBAL') { foreach (self::$cache_files as $cached_file) { @unlink(self::$cache_dir.$cached_file); } } elseif (in_array($name . '.tmp', self::$cache_files)) { @unlink(self::$cache_dir.$name . '.tmp'); } } /** * Загрузка данных из кеша * @param $fname string - имя файла для кеша без расширения * @param $timeout int - время жизни кэша в секундах * @param $type string - тип данных в кеше. если не text - считаем, что хранился массив * @return unknown_type */ public static function loadFromCache ($fname, $timeout=300, $type = 'text') { $filename = $fname . '.tmp'; if (!file_exists(self::$cache_dir.$filename)) { return false; } if ((filemtime(self::$cache_dir.$filename)) < (time()-$timeout)) { return false; } if ($type=='text'){ return file_get_contents(self::$cache_dir.$filename); } else { return unserialize(file_get_contents(self::$cache_dir.$filename)); } } /** * Сохранение данных в локальный кэш * @param string $fname - имя файла для кеша без расширения * @param mixed $vars - данные для записи * @return bool/mixed - false если файл недоступен для записи и $vars если всё нормально */ public static function saveToCache ($fname, $vars) { $filename = $fname . '.tmp'; if (is_array($vars)) { $vars = serialize($vars); } if (is_writable(self::$cache_dir.$filename)) { file_put_contents (self::$cache_dir.$filename, $vars); return $vars; } return; } /* * News */ /** * Получение новостей * @param $cat string - категории новостей, через запятую * @param $fields string - перечень получаемых полей новостей или * для всех * @param $start int - начальное значение выборки * @param $limit int - количество новостей для выборки, 0 - выбрать все новости * @param $sort string - поле, по которому осуществляется сортировка * @param $sort_order - направление сортировки * @return array - ассоциативный 2-х мерный массив с новостями */ function takeNews ($cat, $fields = "*", $start = 0, $limit = 10, $sort = 'id', $sort_order = 'desc') { if (self::$config['allow_multi_category'] == 1) { $condition = 'category regexp "[[:<:]]('.str_replace(',', '|', $cat).')[[:>:]]"'; } else { $condition = 'category IN ('.$cat.')'; } return self::loadTable (PREFIX."_post", $fields, $condition, $multirow = true, $start, $limit, $sort, $sort_order); } /* * Comments */ /** * Функция добавления комментария * @param $newsId int - ID новости * @param $userName string - имя пользователя * @param $ip string - IP пользователя * @param $text string - комментарий * @return bool true/false - результат операции */ function addComment ($newsId, $userName, $ip, $text) { $userName = self::$db->safesql($userName); $newsId = intval ($newsId); $text = self::$db->safesql($text); $ip = self::$db->safesql($ip); // Try to take userId $user_id_data = self::loadTable (USERPREFIX.'_users', 'user_id', "`name` = '$userName'"); if (isset($user_id_data['user_id'])) { $user_id = $user_id_data['user_id']; self::$db->query("INSERT INTO `".PREFIX."_comments` (`post_id`, `user_id`, `date`, `autor`, `text`, `ip`, `is_register`, `approve`) VALUES ('$newsId', '$user_id', NOW(), '$userName', '$text', '$ip', '1', '1')"); // Обновляем счётчик комментариев self::$db->query("UPDATE `".USERPREFIX."_users` set `comm_num` = `comm_num` + 1 where `name` = '$userName'"); // Обновляем счётчик у новости self::$db->query("UPDATE `".PREFIX."_post` set `comm_num` = `comm_num` + 1 where `id` = '$newsId'"); return true; } return false; } } DleAPI::init(); }
- 2
-
Не думаю. Этого нет в планах, да и с точки зрения безопасности не очень хорошо.
-
Запустить другой файл, внутри которого сделать file_get_contents() этого через HTTP
[Разработчикам модов]
в Готовые Моды, Хаки, Локализаторы, Советы
Опубликовано:
Он самый
Он и был всегда отдельным классом.
Это уже не отдельный модуль, а модификация всей системы целиком.
Но в целом событийная модель была бы к месту.
Например, чтобы можно было объвлять кучу обработчиков по событиям.
Например onNewPost, onNewComment и т.п.
Это скорее к Владимиру.