вопрос
Есть два модуля http://blockpro.ru/
Подключаються на одной страницы сразу два таких модуля.
1 ташит информацию с базы основного сайта где он установлен.
2 ташит информацию с другой базы данных.
При подключении обоих сразу допустим в main.tpl, ташит информацию только с 1 базы.
В общем очень нужна помошь.
Как заставить работать два таких модуля сразу, и допустим ташить с разных баз информацию?
Пример первый
{include file="engine/modules/block_pro_1/sort.php?&sort=date&template=block1&sort=date&startFrom=0&limit=5"}
Второй
{include file="engine/modules/block_pro_2/sort.php?&sort=date&template=block1&sort=date&startFrom=0&limit=5"}
Прикладываю код одно из них..
Не судите строго, php плохо знаю.
Подправтьте где ошибся, и подскажите как сделать что бы они работали.
[code]
<?php
if(! defined('DATALIFEENGINE')) {
die("Hacking attempt!");
}
$news_host = 'хост';
$news_bd = 'база';
$news_user = 'юзер';
$news_pass = 'пасс';
$news_pref = 's1';
$db->connect($news_user, $news_pass, $news_bd, $news_host);
if($showstat) $start = microtime(true);
if(!class_exists('BlockPro')) {
class BlockPro {
protected static $_instance;
// Конструктор конфига модуля
private function __construct()
{
global $config;
// Получаем конфиг DLE
$this->dle_config = &$config;
}
public function __clone(){}
private function __wakeup() {}
/**
* Статическая функция, которая возвращает
* экземпляр класса или создает новый при
* необходимости
*
* @return SingletonTest
*/
public static function getInstance()
{
if (null === self::$_instance) {
self::$_instance = new self();
}
return self::$_instance;
}
/*
* Новый конфиг
*/
public function set_config($cfg)
{
// Задаем конфигуратор класса
$this->config = $cfg;
}
/*
* Обновление даных
*/
public function get_category()
{
global $category, $category_id;
$this->category_id = $category_id;
$this->category = $category;
}
/*
* Главный метод класса BlockPro
*/
public function runBlockPro($BlockProConfig)
{
global $db, $cat_info, $lang;
$this->get_category();
$this->set_config($BlockProConfig);
// Защита от фашистов)))) (НУЖНА ЛИ?)
$this->config['postId'] = @$db->safesql(strip_tags(str_replace('/', '', $this->config['postId'])));
$this->config['notPostId'] = @$db->safesql(strip_tags(str_replace('/', '', $this->config['notPostId'])));
$this->config['author'] = @$db->safesql(strip_tags(str_replace('/', '', $this->config['author'])));
$this->config['notAuthor'] = @$db->safesql(strip_tags(str_replace('/', '', $this->config['notAuthor'])));
$this->config['xfilter'] = @$db->safesql(strip_tags(str_replace('/', '', $this->config['xfilter'])));
$this->config['notXfilter'] = @$db->safesql(strip_tags(str_replace('/', '', $this->config['notXfilter'])));
// Определяем сегодняшнюю дату
$tooday = date("Y-m-d H:i:s", (time() + $this->dle_config['date_adjust'] * 60));
// Проверка версии DLE
if ($this->dle_config['version_id'] >= 9.6) $newVersion = true;
// Пробуем подгрузить содержимое модуля из кэша
$output = false;
// Назначаем суффикс кеша, если имеются переменные со значениями this, иначе для разных мест будет создаваться один и тот же файл кеша
$cache_suffix = '';
if ($this->config['catId'] == 'this') $cache_suffix .= $this->category_id.'cId_';
if ($this->config['notCatId'] == 'this') $cache_suffix .= $this->category_id.'nCId_';
if ($this->config['postId'] == 'this') $cache_suffix .= $_REQUEST["newsid"].'pId_';
if ($this->config['notPostId'] == 'this') $cache_suffix .= $_REQUEST["newsid"].'nPId_';
if ($this->config['author'] == 'this') $cache_suffix .= $_REQUEST["user"].'a_';
if ($this->config['notAuthor'] == 'this') $cache_suffix .= $_REQUEST["user"].'nA_';
if ($this->config['tags'] == 'this') $cache_suffix .= $_REQUEST["tag"].'t_';
if ($this->config['notTags'] == 'this') $cache_suffix .= $_REQUEST["tag"].'nT_';
if ($this->config['related'] == 'this') $cache_suffix .= $_REQUEST["newsid"].'r_';
// Если установлено время жизи кеша - убираем префикс news_ чтобы кеш не чистился автоматом
// и задаём настройки времени жизни кеша в секундах
if ($this->config['cacheLive'])
{
$this->config['prefix'] = '';
$filedate = ENGINE_DIR.'/cache/'.$this->config['prefix'].'bp_'.md5($cache_suffix.implode('_', $this->config)).'.tmp';
if(@file_exists($filedate)) $cache_time=time()-@filemtime ($filedate);
else $cache_time = $this->config['cacheLive']*60;
if ($cache_time>=$this->config['cacheLive']*60) $clear_time_cache = 1;
}
// Если nocache не установлен - добавляем префикс (по умолчанию news_) к файлу кеша.
if(!$this->config['nocache'])
{
$output = dle_cache($this->config['prefix'].'bp_'.md5($cache_suffix.implode('_', $this->config)));
}
if ($clear_time_cache)
{
$output = false;
}
// Если значение кэша для данной конфигурации получено, выводим содержимое кэша
if($output !== false)
{
$this->showOutput($output);
return;
}
// Если в кэше ничего не найдено, генерируем модуль заново
$wheres = array();
// Условие для отображения только постов, прошедших модерацию
$wheres[] = 'approve';
if ($this->config['fixed']) {
$fixedType = ($this->config['fixed'] == 'y') ? '' : 'NOT ';
$wheres[] = $fixedType.'fixed';
}
// Фильтрация КАТЕГОРИЙ по их ID
if ($this->config['catId'] == 'this') $this->config['catId'] = $this->category_id;
if ($this->config['notCatId'] == 'this') $this->config['notCatId'] = $this->category_id;
if ($this->config['catId'] || $this->config['notCatId'])
{
$ignore = ($this->config['notCatId']) ? 'NOT ' : '';
$catArr = ($this->config['notCatId']) ? $this->getDiapazone($this->config['notCatId']) : $this->getDiapazone($this->config['catId']);
$wheres[] = $ignore.'category regexp "[[:<:]]('.str_replace(',', '|', $catArr).')[[:>:]]"';
}
// Фильтрация НОВОСТЕЙ по их ID
if ($this->config['postId'] == 'this') $this->config['postId'] = $_REQUEST["newsid"];
if ($this->config['notPostId'] == 'this') $this->config['notPostId'] = $_REQUEST["newsid"];
if (($this->config['postId'] || $this->config['notPostId']) && $this->config['related'] == '')
{
$ignorePosts = ($this->config['notPostId']) ? 'NOT ' : '';
$postsArr = ($this->config['notPostId']) ? $this->getDiapazone($this->config['notPostId']) : $this->getDiapazone($this->config['postId']);
$wheres[] = $ignorePosts.'id regexp "[[:<:]]('.str_replace(',', '|', $postsArr).')[[:>:]]"';
}
// Фильтрация новостей по АВТОРАМ
if ($this->config['author'] == 'this') $this->config['author'] = $_REQUEST["user"];
if ($this->config['notAuthor'] == 'this') $this->config['notAuthor'] = $_REQUEST["user"];
if ($this->config['author'] || $this->config['notAuthor'])
{
$ignoreAuthors = ($this->config['notAuthor']) ? 'NOT ' : '';
$authorsArr = ($this->config['notAuthor']) ? $this->config['notAuthor'] : $this->config['author'];
$wheres[] = $ignoreAuthors.'autor regexp "[[:<:]]('.str_replace(',', '|', $authorsArr).')[[:>:]]"';
}
// Фильтрация новостей по ДОПОЛНИТЕЛЬНЫМ ПОЛЯМ
if ($this->config['xfilter'] || $this->config['notXfilter'])
{
$ignoreXfilters = ($this->config['notXfilter']) ? 'NOT ' : '';
$xfiltersArr = ($this->config['notXfilter']) ? $this->config['notXfilter'] : $this->config['xfilter'];
$wheres[] = $ignoreXfilters.'xfields regexp "[[:<:]]('.str_replace(',', '|', $xfiltersArr).')[[:>:]]"';
}
// Фильтрация новостей по ТЕГАМ
if ($this->config['tags'] == 'this') $this->config['tags'] = $_REQUEST["tag"];
if ($this->config['notTags'] == 'this') $this->config['notTags'] = $_REQUEST["tag"];
if ($this->config['tags'] || $this->config['notTags'])
{
$ignoreTags = ($this->config['notTags']) ? 'NOT ' : '';
$tagsArr = ($this->config['notTags']) ? $this->config['notTags'] : $this->config['tags'];
$wheres[] = $ignoreTags.'tags regexp "[[:<:]]('.str_replace(',', '|', $tagsArr).')[[:>:]]"';
}
// Если включен режим вывода похожих новостей:
if ($this->config['related'] != '')
{
if ($this->config['related'] == 'this' && $_REQUEST["newsid"] =='') {
echo '<span style="color: red;">Переменная related=this работает только в полной новости и не работает с ЧПУ 3 типа.</span>';
return;
}
$relatedId = ($this->config['related'] == 'this') ? $_REQUEST["newsid"] : $this->config['related'];
$wheresRelated = array();
$relatedRows = 'title, short_story, full_story, xfields';
$wheresRelated[] = 'approve';
$wheresRelated[] = 'id = '.$relatedId;
$whereRlated = implode(' AND ', $wheresRelated);
$relatedBody = $this->load_table (PREFIX . '_post', $relatedRows, $whereRlated, false, '0', '1', '', '');
$bodyToRelated = (strlen($relatedBody['full_story']) < strlen($relatedBody['short_story'])) ? $relatedBody['short_story'] : $relatedBody['full_story'];
$bodyToRelated = $db->safesql(strip_tags(stripslashes($relatedBody['title'] . " " . $bodyToRelated)));
$wheres[] = 'MATCH ('.$relatedRows.') AGAINST ("'.$bodyToRelated.'") AND id !='.$relatedId;
}
// Определяем переменные, чтоб сто раз не писать одно и тоже
$bDay = intval($this->config['day']);
$bDayCount = intval($this->config['dayCount']);
// Разбираемся с временными рамками отбора новостей, если кол-во дней указано - ограничиваем выборку, если нет - выводим без ограничения даты
if($bDay) $wheres[] = 'date >= "'.$tooday.'" - INTERVAL '.$bDay.' DAY';
// Если задана переменная dayCount и day, а так же day больше dayCount - отбираем новости за указанный интервал от указанного периода
if($bDay && $bDayCount && ($bDayCount < $bDay)) {
$wheres[] = 'date < "'.$tooday.'" - INTERVAL '.($bDay-$bDayCount).' DAY';
} else {
// Условие для отображения только тех постов, дата публикации которых уже наступила
$wheres[] = 'date < "'.$tooday.'"';
}
// Складываем условия
$where = implode(' AND ', $wheres);
// Направление сортировки по убыванию или возрастанию
$ordering = $this->config['order'] == 'new'?'DESC':'ASC';
// Сортировка новостей
switch ($this->config['sort'])
{
case 'none': // Не сортировать (можно использовать для вывода похожих новостей, аналогично стандарту DLE)
$sort = false;
break;
case 'date': // Дата
$sort = 'date ';
break;
case 'rating': // Рейтинг
$sort = 'rating ';
break;
case 'comms': // Комментарии
$sort = 'comm_num ';
break;
case 'views': // Просмотры
$sort = 'news_read ';
break;
case 'random': // Случайные
$sort = 'RAND() ';
break;
case 'title': // По алфавиту
$sort = 'title ';
break;
case 'hit': // Правильный топ (экспериментально)
$sort = '(rating + (comm_num*0,6) + (news_read*0,2)) ';
break;
default: // Топ как в DLE (сортировка по умолчанию)
$sort = 'rating '.$ordering.', comm_num '.$ordering.', news_read ';
break;
}
// Формирование запроса в зависимости от версии движка
if ($newVersion) {
// 9.6 и выше
$selectRows = 'p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.category, p.alt_name, p.allow_comm, p.comm_num, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes';
} else {
// старые версии идут лесом
echo '<span style="color: #f00">Модуль поддерживает только DLE 9.6 и выше.</span>';
return;
}
/**
* 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 рядов
*/
$news = $this->load_table (PREFIX . '_post p LEFT JOIN ' . PREFIX . '_post_extras e ON (p.id=e.news_id)', $selectRows, $where, true, $this->config['startFrom'], $this->config['limit'], $sort, $ordering);
if(empty($news)) $news = array();
// Задаём переменную, в котоую будем всё складывать
$output = '';
// Если в выборке нет новостей - сообщаем об этом
if (empty($news)) {
$output .= '<span style="color: #f00">По заданным критериям материалов нет, попробуйте изменить параметры строки подключения</span>';
return;
}
// Пробегаем по массиву с новостями и формируем список
foreach ($news as $newsItem)
{
$xfields = xfieldsload();
$newsItem['date'] = strtotime($newsItem['date']);
$newsItem['short_story'] = stripslashes($newsItem['short_story']);
$newsItem['full_story'] = stripslashes($newsItem['full_story']);
// Формируем ссылки на категории и иконки категорий
$my_cat = array();
$my_cat_icon = array();
$my_cat_link = array();
$cat_list = explode(',', $newsItem['category']);
foreach($cat_list as $element) {
if(isset($cat_info[$element])) {
$my_cat[] = $cat_info[$element]['name'];
if ($cat_info[$element]['icon'])
$my_cat_icon[] = '<img class="bp-cat-icon" src="'.$cat_info[$element]['icon'].'" alt="'.$cat_info[$element]['name'].'" />';
else
$my_cat_icon[] = '<img class="bp-cat-icon" src="{THEME}/blockpro/'.$this->config['noicon'].'" alt="'.$cat_info[$element]['name'].'" />';
if($this->dle_config['allow_alt_url'] && $this->dle_config['allow_alt_url'] != 'no')
$my_cat_link[] = '<a href="'.$this->dle_config['http_home_url'].get_url($element).'/">'.$cat_info[$element]['name'].'</a>';
else
$my_cat_link[] = '<a href="'.$PHP_SELF.'?do=cat&category='.$cat_info[$element]['alt_name'].'">'.$cat_info[$element]['name'].'</a>';
}
}
$categoryUrl = ($newsItem['category']) ? $this->dle_config['http_home_url'] . get_url(intval($newsItem['category'])) . '/' : '/';
// Ссылка на профиль юзера
if($this->dle_config['allow_alt_url'] && $this->dle_config['allow_alt_url'] != 'no') {
$go_page = $this->dle_config['http_home_url'].'user/'.urlencode($newsItem['autor']).'/';
} else {
$go_page = $PHP_SELF.'?subaction=userinfo&user='.urlencode($newsItem['autor']);
}
// Выводим картинку
switch($this->config['image'])
{
// Первое изображение из краткой новости
case 'short_story':
$imgArray = $this->getImage($newsItem['short_story'], $newsItem['date']);
break;
// Первое изображение из полного описания
case 'full_story':
$imgArray = $this->getImage($newsItem['full_story'], $newsItem['date']);
break;
// Изображение из дополнительного поля
default:
$xfieldsdata = xfieldsdataload($newsItem['xfields']);
$imgArray = $this->getImage($xfieldsdata[$this->config['image']], $newsItem['date']);
break;
}
// Определяем переменные, выводящие картинку
$image = ($imgArray['imgResized']) ? $imgArray['imgResized'] : '{THEME}/blockpro/'.$this->config['noimage'];
if (!$imgArray['imgResized']) {
$imageFull = '{THEME}/blockpro/'.$this->config['noimageFull'];
} else {
$imageFull = $imgArray['imgOriginal'];
}
// Формируем вид даты новости для вывода в шаблон
if(date('Ymd', $newsItem['date']) == date('Ymd')) {
$showDate = $lang['time_heute'].langdate(', H:i', $newsItem['date']);
} elseif(date('Ymd', $newsItem['date']) == date('Ymd') - 1) {
$showDate = $lang['time_gestern'].langdate(', H:i', $newsItem['date']);
} else {
$showDate = langdate($this->dle_config['timestamp_active'], $newsItem['date']);
}
// Формируем вывод облака тегов
if($this->dle_config['allow_tags'] && $newsItem['tags']) {
$showTagsArr = array();
$newsItem['tags'] = explode(",", $newsItem['tags']);
foreach ($newsItem['tags'] as $value) {
$value = trim($value);
if($this->dle_config['allow_alt_url'] && $this->dle_config['allow_alt_url'] != 'no')
$showTagsArr[] = "<a href=\"".$this->dle_config['http_home_url']."tags/".urlencode($value)."/\">".$value."</a>";
else
$showTagsArr[] = "<a href=\"$PHP_SELF?do=tags&tag=".urlencode($value)."\">".$value."</a>";
$showTags = implode(', ', $showTagsArr);
}
} else {
$showTags = '';
}
// Выводим аватарку пользователя, если включен вывод (добавляет один запрос на каждую новость).
$avatar = '{THEME}/images/noavatar.png';
if ($this->config['avatar']) {
$userAvatar = $this->load_table(PREFIX . '_users', 'foto', 'name="'.$newsItem['autor'].'"', false, '0', '1', '', '');
if($userAvatar['foto']) {
$avatar = $this->dle_config['http_home_url'].'uploads/fotos/'.$userAvatar['foto'];
}
}
/**
* Код, формирующий вывод шаблона новости
*/
// проверяем существует ли файл шаблона, если есть - работаем дальше
if (file_exists(TEMPLATE_DIR.'/'.$this->config['template'].'.tpl'))
{
$xfieldsdata = xfieldsdataload($newsItem['xfields']);
$newsTitle = htmlspecialchars(strip_tags(stripslashes($newsItem['title'])), ENT_QUOTES, $this->dle_config['charset']);
$output .= $this->applyTemplate($this->config['template'],
array(
'{title}' => $this->textLimit($newsTitle, $this->config['titleLimit']),
'{full-title}' => $newsTitle,
'{full-link}' => $this->getPostUrl($newsItem, $newsItem['date']),
'{image}' => $image,
'{full-image}' => $imageFull,
'{short-story}' => $this->textLimit($newsItem['short_story'], $this->config['textLimit']),
'{full-story}' => $this->textLimit($newsItem['full_story'], $this->config['textLimit']),
'{link-category}' => implode(', ', $my_cat_link),
'{category}' => implode(', ', $my_cat),
'{category-icon}' => implode('', $my_cat_icon),
'{category-url}' => $categoryUrl,
'{news-id}' => $newsItem['id'],
'{author}' => "<a onclick=\"ShowProfile('" . urlencode($newsItem['autor']) . "', '" . $go_page . "', '" . $use
Подключаються на одной страницы сразу два таких модуля.
1 ташит информацию с базы основного сайта где он установлен.
2 ташит информацию с другой базы данных.
При подключении обоих сразу допустим в main.tpl, ташит информацию только с 1 базы.
В общем очень нужна помошь.
Как заставить работать два таких модуля сразу, и допустим ташить с разных баз информацию?
Пример первый
{include file="engine/modules/block_pro_1/sort.php?&sort=date&template=block1&sort=date&startFrom=0&limit=5"}
Второй
{include file="engine/modules/block_pro_2/sort.php?&sort=date&template=block1&sort=date&startFrom=0&limit=5"}
Прикладываю код одно из них..
Не судите строго, php плохо знаю.
Подправтьте где ошибся, и подскажите как сделать что бы они работали.
[code]
<?php
if(! defined('DATALIFEENGINE')) {
die("Hacking attempt!");
}
$news_host = 'хост';
$news_bd = 'база';
$news_user = 'юзер';
$news_pass = 'пасс';
$news_pref = 's1';
$db->connect($news_user, $news_pass, $news_bd, $news_host);
if($showstat) $start = microtime(true);
if(!class_exists('BlockPro')) {
class BlockPro {
protected static $_instance;
// Конструктор конфига модуля
private function __construct()
{
global $config;
// Получаем конфиг DLE
$this->dle_config = &$config;
}
public function __clone(){}
private function __wakeup() {}
/**
* Статическая функция, которая возвращает
* экземпляр класса или создает новый при
* необходимости
*
* @return SingletonTest
*/
public static function getInstance()
{
if (null === self::$_instance) {
self::$_instance = new self();
}
return self::$_instance;
}
/*
* Новый конфиг
*/
public function set_config($cfg)
{
// Задаем конфигуратор класса
$this->config = $cfg;
}
/*
* Обновление даных
*/
public function get_category()
{
global $category, $category_id;
$this->category_id = $category_id;
$this->category = $category;
}
/*
* Главный метод класса BlockPro
*/
public function runBlockPro($BlockProConfig)
{
global $db, $cat_info, $lang;
$this->get_category();
$this->set_config($BlockProConfig);
// Защита от фашистов)))) (НУЖНА ЛИ?)
$this->config['postId'] = @$db->safesql(strip_tags(str_replace('/', '', $this->config['postId'])));
$this->config['notPostId'] = @$db->safesql(strip_tags(str_replace('/', '', $this->config['notPostId'])));
$this->config['author'] = @$db->safesql(strip_tags(str_replace('/', '', $this->config['author'])));
$this->config['notAuthor'] = @$db->safesql(strip_tags(str_replace('/', '', $this->config['notAuthor'])));
$this->config['xfilter'] = @$db->safesql(strip_tags(str_replace('/', '', $this->config['xfilter'])));
$this->config['notXfilter'] = @$db->safesql(strip_tags(str_replace('/', '', $this->config['notXfilter'])));
// Определяем сегодняшнюю дату
$tooday = date("Y-m-d H:i:s", (time() + $this->dle_config['date_adjust'] * 60));
// Проверка версии DLE
if ($this->dle_config['version_id'] >= 9.6) $newVersion = true;
// Пробуем подгрузить содержимое модуля из кэша
$output = false;
// Назначаем суффикс кеша, если имеются переменные со значениями this, иначе для разных мест будет создаваться один и тот же файл кеша
$cache_suffix = '';
if ($this->config['catId'] == 'this') $cache_suffix .= $this->category_id.'cId_';
if ($this->config['notCatId'] == 'this') $cache_suffix .= $this->category_id.'nCId_';
if ($this->config['postId'] == 'this') $cache_suffix .= $_REQUEST["newsid"].'pId_';
if ($this->config['notPostId'] == 'this') $cache_suffix .= $_REQUEST["newsid"].'nPId_';
if ($this->config['author'] == 'this') $cache_suffix .= $_REQUEST["user"].'a_';
if ($this->config['notAuthor'] == 'this') $cache_suffix .= $_REQUEST["user"].'nA_';
if ($this->config['tags'] == 'this') $cache_suffix .= $_REQUEST["tag"].'t_';
if ($this->config['notTags'] == 'this') $cache_suffix .= $_REQUEST["tag"].'nT_';
if ($this->config['related'] == 'this') $cache_suffix .= $_REQUEST["newsid"].'r_';
// Если установлено время жизи кеша - убираем префикс news_ чтобы кеш не чистился автоматом
// и задаём настройки времени жизни кеша в секундах
if ($this->config['cacheLive'])
{
$this->config['prefix'] = '';
$filedate = ENGINE_DIR.'/cache/'.$this->config['prefix'].'bp_'.md5($cache_suffix.implode('_', $this->config)).'.tmp';
if(@file_exists($filedate)) $cache_time=time()-@filemtime ($filedate);
else $cache_time = $this->config['cacheLive']*60;
if ($cache_time>=$this->config['cacheLive']*60) $clear_time_cache = 1;
}
// Если nocache не установлен - добавляем префикс (по умолчанию news_) к файлу кеша.
if(!$this->config['nocache'])
{
$output = dle_cache($this->config['prefix'].'bp_'.md5($cache_suffix.implode('_', $this->config)));
}
if ($clear_time_cache)
{
$output = false;
}
// Если значение кэша для данной конфигурации получено, выводим содержимое кэша
if($output !== false)
{
$this->showOutput($output);
return;
}
// Если в кэше ничего не найдено, генерируем модуль заново
$wheres = array();
// Условие для отображения только постов, прошедших модерацию
$wheres[] = 'approve';
if ($this->config['fixed']) {
$fixedType = ($this->config['fixed'] == 'y') ? '' : 'NOT ';
$wheres[] = $fixedType.'fixed';
}
// Фильтрация КАТЕГОРИЙ по их ID
if ($this->config['catId'] == 'this') $this->config['catId'] = $this->category_id;
if ($this->config['notCatId'] == 'this') $this->config['notCatId'] = $this->category_id;
if ($this->config['catId'] || $this->config['notCatId'])
{
$ignore = ($this->config['notCatId']) ? 'NOT ' : '';
$catArr = ($this->config['notCatId']) ? $this->getDiapazone($this->config['notCatId']) : $this->getDiapazone($this->config['catId']);
$wheres[] = $ignore.'category regexp "[[:<:]]('.str_replace(',', '|', $catArr).')[[:>:]]"';
}
// Фильтрация НОВОСТЕЙ по их ID
if ($this->config['postId'] == 'this') $this->config['postId'] = $_REQUEST["newsid"];
if ($this->config['notPostId'] == 'this') $this->config['notPostId'] = $_REQUEST["newsid"];
if (($this->config['postId'] || $this->config['notPostId']) && $this->config['related'] == '')
{
$ignorePosts = ($this->config['notPostId']) ? 'NOT ' : '';
$postsArr = ($this->config['notPostId']) ? $this->getDiapazone($this->config['notPostId']) : $this->getDiapazone($this->config['postId']);
$wheres[] = $ignorePosts.'id regexp "[[:<:]]('.str_replace(',', '|', $postsArr).')[[:>:]]"';
}
// Фильтрация новостей по АВТОРАМ
if ($this->config['author'] == 'this') $this->config['author'] = $_REQUEST["user"];
if ($this->config['notAuthor'] == 'this') $this->config['notAuthor'] = $_REQUEST["user"];
if ($this->config['author'] || $this->config['notAuthor'])
{
$ignoreAuthors = ($this->config['notAuthor']) ? 'NOT ' : '';
$authorsArr = ($this->config['notAuthor']) ? $this->config['notAuthor'] : $this->config['author'];
$wheres[] = $ignoreAuthors.'autor regexp "[[:<:]]('.str_replace(',', '|', $authorsArr).')[[:>:]]"';
}
// Фильтрация новостей по ДОПОЛНИТЕЛЬНЫМ ПОЛЯМ
if ($this->config['xfilter'] || $this->config['notXfilter'])
{
$ignoreXfilters = ($this->config['notXfilter']) ? 'NOT ' : '';
$xfiltersArr = ($this->config['notXfilter']) ? $this->config['notXfilter'] : $this->config['xfilter'];
$wheres[] = $ignoreXfilters.'xfields regexp "[[:<:]]('.str_replace(',', '|', $xfiltersArr).')[[:>:]]"';
}
// Фильтрация новостей по ТЕГАМ
if ($this->config['tags'] == 'this') $this->config['tags'] = $_REQUEST["tag"];
if ($this->config['notTags'] == 'this') $this->config['notTags'] = $_REQUEST["tag"];
if ($this->config['tags'] || $this->config['notTags'])
{
$ignoreTags = ($this->config['notTags']) ? 'NOT ' : '';
$tagsArr = ($this->config['notTags']) ? $this->config['notTags'] : $this->config['tags'];
$wheres[] = $ignoreTags.'tags regexp "[[:<:]]('.str_replace(',', '|', $tagsArr).')[[:>:]]"';
}
// Если включен режим вывода похожих новостей:
if ($this->config['related'] != '')
{
if ($this->config['related'] == 'this' && $_REQUEST["newsid"] =='') {
echo '<span style="color: red;">Переменная related=this работает только в полной новости и не работает с ЧПУ 3 типа.</span>';
return;
}
$relatedId = ($this->config['related'] == 'this') ? $_REQUEST["newsid"] : $this->config['related'];
$wheresRelated = array();
$relatedRows = 'title, short_story, full_story, xfields';
$wheresRelated[] = 'approve';
$wheresRelated[] = 'id = '.$relatedId;
$whereRlated = implode(' AND ', $wheresRelated);
$relatedBody = $this->load_table (PREFIX . '_post', $relatedRows, $whereRlated, false, '0', '1', '', '');
$bodyToRelated = (strlen($relatedBody['full_story']) < strlen($relatedBody['short_story'])) ? $relatedBody['short_story'] : $relatedBody['full_story'];
$bodyToRelated = $db->safesql(strip_tags(stripslashes($relatedBody['title'] . " " . $bodyToRelated)));
$wheres[] = 'MATCH ('.$relatedRows.') AGAINST ("'.$bodyToRelated.'") AND id !='.$relatedId;
}
// Определяем переменные, чтоб сто раз не писать одно и тоже
$bDay = intval($this->config['day']);
$bDayCount = intval($this->config['dayCount']);
// Разбираемся с временными рамками отбора новостей, если кол-во дней указано - ограничиваем выборку, если нет - выводим без ограничения даты
if($bDay) $wheres[] = 'date >= "'.$tooday.'" - INTERVAL '.$bDay.' DAY';
// Если задана переменная dayCount и day, а так же day больше dayCount - отбираем новости за указанный интервал от указанного периода
if($bDay && $bDayCount && ($bDayCount < $bDay)) {
$wheres[] = 'date < "'.$tooday.'" - INTERVAL '.($bDay-$bDayCount).' DAY';
} else {
// Условие для отображения только тех постов, дата публикации которых уже наступила
$wheres[] = 'date < "'.$tooday.'"';
}
// Складываем условия
$where = implode(' AND ', $wheres);
// Направление сортировки по убыванию или возрастанию
$ordering = $this->config['order'] == 'new'?'DESC':'ASC';
// Сортировка новостей
switch ($this->config['sort'])
{
case 'none': // Не сортировать (можно использовать для вывода похожих новостей, аналогично стандарту DLE)
$sort = false;
break;
case 'date': // Дата
$sort = 'date ';
break;
case 'rating': // Рейтинг
$sort = 'rating ';
break;
case 'comms': // Комментарии
$sort = 'comm_num ';
break;
case 'views': // Просмотры
$sort = 'news_read ';
break;
case 'random': // Случайные
$sort = 'RAND() ';
break;
case 'title': // По алфавиту
$sort = 'title ';
break;
case 'hit': // Правильный топ (экспериментально)
$sort = '(rating + (comm_num*0,6) + (news_read*0,2)) ';
break;
default: // Топ как в DLE (сортировка по умолчанию)
$sort = 'rating '.$ordering.', comm_num '.$ordering.', news_read ';
break;
}
// Формирование запроса в зависимости от версии движка
if ($newVersion) {
// 9.6 и выше
$selectRows = 'p.id, p.autor, p.date, p.short_story, p.full_story, p.xfields, p.title, p.category, p.alt_name, p.allow_comm, p.comm_num, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes';
} else {
// старые версии идут лесом
echo '<span style="color: #f00">Модуль поддерживает только DLE 9.6 и выше.</span>';
return;
}
/**
* 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 рядов
*/
$news = $this->load_table (PREFIX . '_post p LEFT JOIN ' . PREFIX . '_post_extras e ON (p.id=e.news_id)', $selectRows, $where, true, $this->config['startFrom'], $this->config['limit'], $sort, $ordering);
if(empty($news)) $news = array();
// Задаём переменную, в котоую будем всё складывать
$output = '';
// Если в выборке нет новостей - сообщаем об этом
if (empty($news)) {
$output .= '<span style="color: #f00">По заданным критериям материалов нет, попробуйте изменить параметры строки подключения</span>';
return;
}
// Пробегаем по массиву с новостями и формируем список
foreach ($news as $newsItem)
{
$xfields = xfieldsload();
$newsItem['date'] = strtotime($newsItem['date']);
$newsItem['short_story'] = stripslashes($newsItem['short_story']);
$newsItem['full_story'] = stripslashes($newsItem['full_story']);
// Формируем ссылки на категории и иконки категорий
$my_cat = array();
$my_cat_icon = array();
$my_cat_link = array();
$cat_list = explode(',', $newsItem['category']);
foreach($cat_list as $element) {
if(isset($cat_info[$element])) {
$my_cat[] = $cat_info[$element]['name'];
if ($cat_info[$element]['icon'])
$my_cat_icon[] = '<img class="bp-cat-icon" src="'.$cat_info[$element]['icon'].'" alt="'.$cat_info[$element]['name'].'" />';
else
$my_cat_icon[] = '<img class="bp-cat-icon" src="{THEME}/blockpro/'.$this->config['noicon'].'" alt="'.$cat_info[$element]['name'].'" />';
if($this->dle_config['allow_alt_url'] && $this->dle_config['allow_alt_url'] != 'no')
$my_cat_link[] = '<a href="'.$this->dle_config['http_home_url'].get_url($element).'/">'.$cat_info[$element]['name'].'</a>';
else
$my_cat_link[] = '<a href="'.$PHP_SELF.'?do=cat&category='.$cat_info[$element]['alt_name'].'">'.$cat_info[$element]['name'].'</a>';
}
}
$categoryUrl = ($newsItem['category']) ? $this->dle_config['http_home_url'] . get_url(intval($newsItem['category'])) . '/' : '/';
// Ссылка на профиль юзера
if($this->dle_config['allow_alt_url'] && $this->dle_config['allow_alt_url'] != 'no') {
$go_page = $this->dle_config['http_home_url'].'user/'.urlencode($newsItem['autor']).'/';
} else {
$go_page = $PHP_SELF.'?subaction=userinfo&user='.urlencode($newsItem['autor']);
}
// Выводим картинку
switch($this->config['image'])
{
// Первое изображение из краткой новости
case 'short_story':
$imgArray = $this->getImage($newsItem['short_story'], $newsItem['date']);
break;
// Первое изображение из полного описания
case 'full_story':
$imgArray = $this->getImage($newsItem['full_story'], $newsItem['date']);
break;
// Изображение из дополнительного поля
default:
$xfieldsdata = xfieldsdataload($newsItem['xfields']);
$imgArray = $this->getImage($xfieldsdata[$this->config['image']], $newsItem['date']);
break;
}
// Определяем переменные, выводящие картинку
$image = ($imgArray['imgResized']) ? $imgArray['imgResized'] : '{THEME}/blockpro/'.$this->config['noimage'];
if (!$imgArray['imgResized']) {
$imageFull = '{THEME}/blockpro/'.$this->config['noimageFull'];
} else {
$imageFull = $imgArray['imgOriginal'];
}
// Формируем вид даты новости для вывода в шаблон
if(date('Ymd', $newsItem['date']) == date('Ymd')) {
$showDate = $lang['time_heute'].langdate(', H:i', $newsItem['date']);
} elseif(date('Ymd', $newsItem['date']) == date('Ymd') - 1) {
$showDate = $lang['time_gestern'].langdate(', H:i', $newsItem['date']);
} else {
$showDate = langdate($this->dle_config['timestamp_active'], $newsItem['date']);
}
// Формируем вывод облака тегов
if($this->dle_config['allow_tags'] && $newsItem['tags']) {
$showTagsArr = array();
$newsItem['tags'] = explode(",", $newsItem['tags']);
foreach ($newsItem['tags'] as $value) {
$value = trim($value);
if($this->dle_config['allow_alt_url'] && $this->dle_config['allow_alt_url'] != 'no')
$showTagsArr[] = "<a href=\"".$this->dle_config['http_home_url']."tags/".urlencode($value)."/\">".$value."</a>";
else
$showTagsArr[] = "<a href=\"$PHP_SELF?do=tags&tag=".urlencode($value)."\">".$value."</a>";
$showTags = implode(', ', $showTagsArr);
}
} else {
$showTags = '';
}
// Выводим аватарку пользователя, если включен вывод (добавляет один запрос на каждую новость).
$avatar = '{THEME}/images/noavatar.png';
if ($this->config['avatar']) {
$userAvatar = $this->load_table(PREFIX . '_users', 'foto', 'name="'.$newsItem['autor'].'"', false, '0', '1', '', '');
if($userAvatar['foto']) {
$avatar = $this->dle_config['http_home_url'].'uploads/fotos/'.$userAvatar['foto'];
}
}
/**
* Код, формирующий вывод шаблона новости
*/
// проверяем существует ли файл шаблона, если есть - работаем дальше
if (file_exists(TEMPLATE_DIR.'/'.$this->config['template'].'.tpl'))
{
$xfieldsdata = xfieldsdataload($newsItem['xfields']);
$newsTitle = htmlspecialchars(strip_tags(stripslashes($newsItem['title'])), ENT_QUOTES, $this->dle_config['charset']);
$output .= $this->applyTemplate($this->config['template'],
array(
'{title}' => $this->textLimit($newsTitle, $this->config['titleLimit']),
'{full-title}' => $newsTitle,
'{full-link}' => $this->getPostUrl($newsItem, $newsItem['date']),
'{image}' => $image,
'{full-image}' => $imageFull,
'{short-story}' => $this->textLimit($newsItem['short_story'], $this->config['textLimit']),
'{full-story}' => $this->textLimit($newsItem['full_story'], $this->config['textLimit']),
'{link-category}' => implode(', ', $my_cat_link),
'{category}' => implode(', ', $my_cat),
'{category-icon}' => implode('', $my_cat_icon),
'{category-url}' => $categoryUrl,
'{news-id}' => $newsItem['id'],
'{author}' => "<a onclick=\"ShowProfile('" . urlencode($newsItem['autor']) . "', '" . $go_page . "', '" . $use
Ответил: alexgut
Плохо добавилось (
Первое что правил, это подключение к базе
И второе это выдергивание удаленного адреса + категории, сори писал как мог, криво )
Первое что правил, это подключение к базе
$news_host = 'хост';
$news_bd = 'база';
$news_user = 'юзер';
$news_pass = 'пасс';
$news_pref = 's1';
$db->connect($news_user, $news_pass, $news_bd, $news_host);
И второе это выдергивание удаленного адреса + категории, сори писал как мог, криво )
/**
* @param $post - массив с информацией о статье
* @return string URL для категории
*/
public function getPostUrl($post, $postDate)
{
global $db;
$lalka=$post['category'];
$lalka2=$post['id'];
$lolochka = explode(',', $lalka);
$loloshechka = $lolochka[0];
$q3 = $db->query( "SELECT alt_name FROM " . PREFIX . "_category WHERE id =$loloshechka");
$sql = $q3 -> fetch_assoc();
$q4 = $db->query( "SELECT short_story FROM " . PREFIX . "_post WHERE id =$lalka2");
$sql2 = $q4 -> fetch_assoc();
$lalka3=$sql2['short_story'];
preg_match_all('/<img(?:\\s[^<>]*?)?\\bsrc\\s*=\\s*(?|"([^"]*)"|\'([^\']*)\'|([^<>\'"\\s]*))[^<>]*>/i', $lalka3, $n);
$ololo = $n[1][0];
preg_match('@^(?:http://)?([^/]+)@i', $ololo, $matches);
$host = $matches[1];
if($this->dle_config['allow_alt_url'] == 'yes')
{
if(
($this->dle_config['version_id'] < 9.6 && $this->dle_config['seo_type'])
||
($this->dle_config['version_id'] >= 9.6 && ($this->dle_config['seo_type'] == 1 || $this->dle_config['seo_type'] == 2))
)
{
if(intval($post['category']) && $this->dle_config['seo_type'] == 2)
{
$url = 'http://'.$host.'/'.$sql['alt_name'].'/'.$post['id'].'-'.$post['alt_name'].'.html';
}
else
{
$url = 'http://'.$host.'/'.$sql['alt_name'].'/'.$post['id'].'-'.$post['alt_name'].'.html';
}
}
else
{
$url = 'http://'.$host.'/'.$sql['alt_name'].'/'.$post['id'].'-'.$post['alt_name'].'.html';
}
}
else
{
$url = 'http://'.$host.'/'.$sql['alt_name'].'/'.$post['id'].'-'.$post['alt_name'].'.html';
}
return $url;
}