PHP, DLE: Комментарии на статических страницах

Не знаю почему, но разработчики DLE сочли, что обычная страница сайта не может иметь комментариев. Жаль, но хозяин — барин, поэтому придется немного покопаться в коде, что бы перенести возможность стандартных комментариев на статичные страницы в DLE. Поэтому если Вы задаетесь вопросом «Как добавить комментарии на статичные страницы в DLE?» — прошу внимания!

Мне попалась версия 13.1 (файл config.php), но думаю это не принципиально. Отличая если и будут, то незначительные. И так начнем. Открываем файлы по следующим путям:

/engine/modules/show.full.php
/engine/modules/static.php
/engine/modules/addcomments.php
/engine/modules/functions.php

Смотрим файл static.php и ищем в нем строчку $tpl->compile( ‘content’ ); и перед ней вставляем две строчки:

$tpl->set( '{comments}', "<!--dlecomments-->" );
$tpl->set( '{addcomments}', "<!--dleaddcomments-->" );

$tpl->compile( 'content' ); //строка которую нашли

Дальше смотрим show.full.php и ищем блок (он скорей всего в конце).

if( $allow_comments AND $news_found) { 
... 
...
...
} 

Cодержимое данного блока (без условия if и последней скобки ‘}’ !) может отличаться в разных версиях DLE. Поэтому Вы можете скопировать его из моего примера, или же из своего файла show.full.php . Его нужно вставить после строчки $tpl->compile( ‘content’ ); в static.php .

Дальше нам нужно привести перенесенный код, в рабочий вид относительно окружения в файле static.php . Я вырежу часть проверок и функционала, которые в моем случае были не нужны. Вы же можете, ориентируясь на мой пример, доработать код под свои нужды. Так же нам понадобится добавить пару переменных, которые используются в файле show.full.php, но которых нет в файле static.php (перед $tpl->compile( ‘content’ ); ). В итоге получится вот такой код:

$tpl->set( '{comments}', "<!--dlecomments-->" );
$tpl->set( '{addcomments}', "<!--dleaddcomments-->" );

$allow_add = true; //Добавлена вручную
$comments_num = isset($static_result['comments_num']) ? $static_result['comments_num'] : 0; //Добавлена вручную
$news_id = -1 * $static_result['id']; //Добавлена вручную
$tpl->set( '{comments-num}', $comments_num ); //Добавлена вручную

$tpl->compile( 'content' ); //строка которую нашли

	if( $comments_num > 0 ) {

		include_once (DLEPlugins::Check(ENGINE_DIR . '/classes/comments.class.php'));
		$comments = new DLE_Comments( $db, $comments_num, intval($config['comm_nummers']) );

		if( $config['comm_msort'] == "" OR $config['comm_msort'] == "ASC" ) $comm_msort = "ASC"; else $comm_msort = "DESC";

		if( $config['tree_comments'] ) $comm_msort = "ASC";
		
		if( $config['allow_cmod'] ) $where_approve = " AND " . PREFIX . "_comments.approve=1";
		else $where_approve = "";

		$comments->query = "SELECT " . PREFIX . "_comments.id, post_id, " . PREFIX . "_comments.user_id, date, autor as gast_name, " . PREFIX . "_comments.email as gast_email, text, ip, is_register, " . PREFIX . "_comments.rating, " . PREFIX . "_comments.vote_num, " . PREFIX . "_comments.parent, name, " . USERPREFIX . "_users.email, news_num, comm_num, user_group, lastdate, reg_date, signature, foto, xfields FROM " . PREFIX . "_comments LEFT JOIN " . USERPREFIX . "_users ON " . PREFIX . "_comments.user_id=" . USERPREFIX . "_users.user_id WHERE " . PREFIX . "_comments.post_id = '$news_id'" . $where_approve . " ORDER BY " . PREFIX . "_comments.id " . $comm_msort;

		if ( $allow_full_cache AND $config['allow_comments_cache'] ) $allow_full_cache = $news_id; else $allow_full_cache = false;

		$comments->build_comments('comments.tpl', 'news', $allow_full_cache, $full_link );

		unset ($tpl->result['comments']);

		if( isset($_GET['news_page']) AND $_GET['news_page'] ) $user_query = "newsid=" . $newsid . "&news_page=" . intval( $_GET['news_page'] ); else $user_query = "newsid=" . $newsid;

		$comments->build_navigation('navigation.tpl', $link_page . "{page}," . $news_name . ".html#comment", $user_query, $full_link);		

		unset ($comments);
		unset ($tpl->result['commentsnavigation']);
	
	}

      
	if (!isset($member_id['restricted'])) $member_id['restricted'] = false;
	
	if( $member_id['restricted'] AND $member_id['restricted_days'] AND $member_id['restricted_date'] < $_TIME ) {
		
		$member_id['restricted'] = 0;
		$db->query( "UPDATE LOW_PRIORITY " . USERPREFIX . "_users SET restricted='0', restricted_days='0', restricted_date='' WHERE user_id='{$member_id['user_id']}'" );
	
	}
	       
	if( $user_group[$member_id['user_group']]['allow_addc'] AND $config['allow_comments'] AND $allow_add AND ($member_id['restricted'] != 2 AND $member_id['restricted'] != 3) ) {

		if( !$comments_num ) {		
			if( strpos ( $tpl->result['content'], "<!--dlecomments-->" ) !== false ) {
	
				$tpl->result['content'] = str_replace ( "<!--dlecomments-->", "\n<div id=\"dle-ajax-comments\"></div>\n", $tpl->result['content'] );
	
			} else $tpl->result['content'] .= "\n<div id=\"dle-ajax-comments\"></div>\n";
		}
		
		$tpl->load_template( 'addcomments.tpl' );

		if ($config['allow_subscribe'] AND $is_logged AND $user_group[$member_id['user_group']]['allow_subscribe']) $allow_subscribe = true; else $allow_subscribe = false;
		
		if( strpos( $tpl->copy_template, "[catlist=" ) !== false ) {
			$tpl->copy_template = preg_replace_callback ( "#\\[(catlist)=(.+?)\\](.*?)\\[/catlist\\]#is", "check_category", $tpl->copy_template );
		}
								
		if( strpos( $tpl->copy_template, "[not-catlist=" ) !== false ) {
			$tpl->copy_template = preg_replace_callback ( "#\\[(not-catlist)=(.+?)\\](.*?)\\[/not-catlist\\]#is", "check_category", $tpl->copy_template );
		}
		
		$text='';
		
		if( $config['allow_comments_wysiwyg'] > 0 ) {
			
			$p_name = urlencode($member_id['name']);
			$p_id = 0;
			include_once (DLEPlugins::Check(ENGINE_DIR . '/editor/comments.php'));
			$bb_code = "";
			$allow_comments_ajax = true;
			
		} else {
			
			include_once (DLEPlugins::Check(ENGINE_DIR . '/modules/bbcode.php'));
			
		}

		if ( $is_logged AND $user_group[$member_id['user_group']]['disable_comments_captcha'] AND $member_id['comm_num'] >= $user_group[$member_id['user_group']]['disable_comments_captcha'] ) {
		
			$user_group[$member_id['user_group']]['comments_question'] = false;
			$user_group[$member_id['user_group']]['captcha'] = false;
		
		}

		if( $user_group[$member_id['user_group']]['comments_question'] ) {

			$tpl->set( '[question]', "" );
			$tpl->set( '[/question]', "" );

			$question = $db->super_query("SELECT id, question FROM " . PREFIX . "_question ORDER BY RAND() LIMIT 1");
			$tpl->set( '{question}', "<span id=\"dle-question\">".htmlspecialchars( stripslashes( $question['question'] ), ENT_QUOTES, $config['charset'] )."</span>" );

			$_SESSION['question'] = $question['id'];

		} else {

			$tpl->set_block( "'\\[question\\](.*?)\\[/question\\]'si", "" );
			$tpl->set( '{question}', "" );

		}
		
		if( $user_group[$member_id['user_group']]['captcha'] ) {

			if ( $config['allow_recaptcha'] ) {

				$tpl->set( '[recaptcha]', "" );
				$tpl->set( '[/recaptcha]', "" );

				$tpl->set( '{recaptcha}', "<div class=\"g-recaptcha\" data-sitekey=\"{$config['recaptcha_public_key']}\" data-theme=\"{$config['recaptcha_theme']}\"></div>" );

				$tpl->set_block( "'\\[sec_code\\](.*?)\\[/sec_code\\]'si", "" );
				$tpl->set( '{reg_code}', "" );

			} else {

				$tpl->set( '[sec_code]', "" );
				$tpl->set( '[/sec_code]', "" );
				$path = parse_url( $config['http_home_url'] );
				$tpl->set( '{sec_code}', "<a onclick=\"reload(); return false;\" title=\"{$lang['reload_code']}\" href=\"#\"><span id=\"dle-captcha\"><img src=\"" . $path['path'] . "engine/modules/antibot/antibot.php\" alt=\"{$lang['reload_code']}\" width=\"160\" height=\"80\"></span></a>" );
				$tpl->set_block( "'\\[recaptcha\\](.*?)\\[/recaptcha\\]'si", "" );
				$tpl->set( '{recaptcha}', "" );
			}

		} else {
			$tpl->set( '{sec_code}', "" );
			$tpl->set( '{recaptcha}', "" );
			$tpl->set_block( "'\\[recaptcha\\](.*?)\\[/recaptcha\\]'si", "" );
			$tpl->set_block( "'\\[sec_code\\](.*?)\\[/sec_code\\]'si", "" );
		}

		if( $config['allow_comments_wysiwyg'] > 0 ) {

			$tpl->set( '{editor}', $wysiwyg );

		} else {
			$tpl->set( '{editor}', $bb_code );

		}
		
		$tpl->set( '{title}', $lang['news_addcom'] );

		if( ! $is_logged ) {
			$tpl->set( '[not-logged]', '' );
			$tpl->set( '[/not-logged]', '' );
		} else $tpl->set_block( "'\\[not-logged\\](.*?)\\[/not-logged\\]'si", "" );
		
		if( $is_logged ) $hidden = "<input type=\"hidden\" name=\"name\" id=\"name\" value=\"{$member_id['name']}\"><input type=\"hidden\" name=\"mail\" id=\"mail\" value=\"\">";
		else $hidden = "";
		
		$tpl->copy_template = "<form  method=\"post\" name=\"dle-comments-form\" id=\"dle-comments-form\" >" . $tpl->copy_template . "
		<input type=\"hidden\" name=\"subaction\" value=\"addcomment\">{$hidden}
		<input type=\"hidden\" name=\"post_id\" id=\"post_id\" value=\"{$news_id}\"><input type=\"hidden\" name=\"user_hash\" value=\"{$dle_login_hash}\"></form>";

		$onload_scripts[] = <<<HTML
$('#dle-comments-form').submit(function() {
	doAddComments();
	return false;
});
HTML;


		if ( $user_group[$member_id['user_group']]['captcha'] AND $config['allow_recaptcha'] ) {

		$tpl->copy_template .= <<<HTML
<script src='https://www.google.com/recaptcha/api.js?hl={$lang['wysiwyg_language']}' async defer></script>
HTML;
		
		}
		
		$tpl->compile( 'addcomments' );
		$tpl->clear();

		if ( strpos ( $tpl->result['content'], "<!--dleaddcomments-->" ) !== false ) {

			$tpl->result['content'] = str_replace ( "<!--dleaddcomments-->", $tpl->result['addcomments'], $tpl->result['content'] );

		} 

		unset ($tpl->result['addcomments']);

	} elseif( $member_id['restricted'] ) {
		
		$tpl->load_template( 'info.tpl' );
		
		if( $member_id['restricted_days'] ) {
			
			$lang['news_info_2'] = str_replace('{date}', langdate( "j F Y H:i", $member_id['restricted_date'] ), $lang['news_info_2'] );
			
			$tpl->set( '{error}', $lang['news_info_2'] );
			$tpl->set( '{date}', langdate( "j F Y H:i", $member_id['restricted_date'] ) );
		
		} else $tpl->set( '{error}', $lang['news_info_3'] );
		
		$tpl->set( '{title}', $lang['all_info'] );
		$tpl->compile( 'comments_not_allowed' );
		$tpl->clear();

		if ( strpos ( $tpl->result['content'], "<!--dleaddcomments-->" ) !== false ) {

			$tpl->result['content'] = str_replace ( "<!--dleaddcomments-->", $tpl->result['comments_not_allowed'], $tpl->result['content'] );

		} 

		unset ($tpl->result['comments_not_allowed']);
		
	} elseif( !$allow_add ) {

		$tpl->load_template( 'info.tpl' );
		$tpl->set( '{error}', $lang['news_info_6'] );
		$tpl->set( '{days}', $config['max_comments_days'] );
		$tpl->set( '{title}', $lang['all_info'] );
		$tpl->compile( 'comments_not_allowed' );
		$tpl->clear();

		if ( strpos ( $tpl->result['content'], "<!--dleaddcomments-->" ) !== false ) {

			$tpl->result['content'] = str_replace ( "<!--dleaddcomments-->", $tpl->result['comments_not_allowed'], $tpl->result['content'] );

		} else {

			$tpl->result['content'] .= $tpl->result['comments_not_allowed'];

		}

		unset ($tpl->result['comments_not_allowed']);
	
	} elseif( $config['allow_comments'] ) {
		
		$lang['news_info_1'] = str_replace('{group}', $user_group[$member_id['user_group']]['group_name'], $lang['news_info_1'] );
		
		$tpl->load_template( 'info.tpl' );
		$tpl->set( '{error}', $lang['news_info_1'] );
		$tpl->set( '{group}', $user_group[$member_id['user_group']]['group_name'] );
		$tpl->set( '{title}', $lang['all_info'] );
		$tpl->compile( 'comments_not_allowed' );
		$tpl->clear();
		
		if ( strpos ( $tpl->result['content'], "<!--dleaddcomments-->" ) !== false ) {

			$tpl->result['content'] = str_replace ( "<!--dleaddcomments-->", $tpl->result['comments_not_allowed'], $tpl->result['content'] );

		} else {

			$tpl->result['content'] .= $tpl->result['comments_not_allowed'];

		}

		unset ($tpl->result['comments_not_allowed']);
	
	}

Примечание: обратите внимание что переменная $news_id создается со знаком минус. Это нужно для того, что бы отличать комментарии записей от комментариев статической страницы. Id последних будут со знаком минус!

Теперь нам необходимо открыть базу данных сайта. Перейти в таблицу dle_static (префикс dle_ у вас может быть другой) и добавить к структуре поля еще один столбец с именем «comments_num» типа INT со значением по умолчанию 0 .

Теперь переходим к файлу addcomments.php . В нем ищем строку:

$row = $db->super_query( "SELECT id, date, allow_comm, approve, access, user_id FROM " . PREFIX . "_post LEFT JOIN " . PREFIX . "_post_extras ON (" . PREFIX . "_post.id=" . PREFIX . "_post_extras.news_id) WHERE id='{$post_id}'" );

и меняем ее на следующую:

$sql =  $post_id > 0
  ? "SELECT id, date, allow_comm, approve, access, user_id FROM " . PREFIX . "_post LEFT JOIN " . PREFIX . "_post_extras ON (" . PREFIX . "_post.id=" . PREFIX . "_post_extras.news_id) WHERE id='{$post_id}'"
  : "SELECT (id*-1) as id, from_unixtime(date, '%Y-%m-%d %h:%i:%s') as date, 1 as allow_comm, 1 as approve, '' as access, 1 as user_id FROM " . PREFIX . "_static WHERE id='".(-$post_id)."'";
$row = $db->super_query($sql);

так же ищем:

$row = $db->super_query( "SELECT id, short_story, title, date, alt_name, category FROM ".PREFIX."_post WHERE id = '{$post_id}'" );

и меняем ее на следующую:

$sql = $post_id > 0 
  ? "SELECT id, short_story, title, date, alt_name, category FROM ".PREFIX."_post WHERE id = '{$post_id}'"
  : "SELECT id,	descr as short_story, metatitle as title, from_unixtime(date, '%Y-%m-%d %h:%i:%s') as date, name as alt_name, '' as category FROM ".PREFIX."_static WHERE id = '".(-$post_id)."'"; 
$row = $db->super_query($sql);

так же ищем:

if ( $config['allow_subscribe'] AND $where_approve ) {

и меняем ее на следующую:

if ( $config['allow_subscribe'] AND $where_approve AND $post_id > 0 ) { //механизм подписок нам не нужен

так же ищем:

if ( $config['allow_subscribe'] AND $is_logged AND $_POST['allow_subscribe'] AND $user_group[$member_id['user_group']]['allow_subscribe']) {

и меняем ее на следующую:

if ($post_id  > 0 AND $config['allow_subscribe'] AND $is_logged AND $_POST['allow_subscribe'] AND $user_group[$member_id['user_group']]['allow_subscribe']) { //механизм подписок нам не нужен

так же ищем:

if( $where_approve ) $db->query( "UPDATE " . PREFIX . "_post SET comm_num=comm_num+1 WHERE id='{$post_id}'" );

и меняем ее на следующую:

if( $where_approve ) {
  if($post_id > 0) $db->query( "UPDATE " . PREFIX . "_post SET comm_num=comm_num+1 WHERE id='{$post_id}'" );
  else $db->query( "UPDATE " . PREFIX . "_static SET comments_num=comments_num+1 WHERE id='".(-$post_id)."'" );
}

Забавно, но так же в процессе всего этого я обнаружил ошибку в SQL запросе вывода комментариев. Возможно у Вас ее не будет.

MySQL error in file: /engine/classes/comments.class.php at line 792
Unknown column 'fullname' in 'field list'
SELECT dle_comments.id, post_id, dle_comments.user_id, date, autor as gast_name, dle_comments.email as gast_email, text, ip, is_register, dle_comments.rating, dle_comments.vote_num, name, dle_users.email, news_num, comm_num, user_group, lastdate, reg_date, signature, foto, fullname, land, xfields FROM dle_comments LEFT JOIN dle_users ON dle_comments.user_id=dle_users.user_id WHERE dle_comments.id = '1'

Что бы ее исправить перейдите в файл /engine/ajax/addcomments.php и сотрите из указанного запроса вот этот кусок «fullname, land,».

Теперь переходим к файлу /engine/modules/functions.php и ищем в нем функцию с именем deletecomments в ней ищем:

if($row['approve']) $db->query( "UPDATE " . PREFIX . "_post SET comm_num=comm_num-1 WHERE id='{$row['post_id']}'" );

и меняем ее на следующую:

if($row['approve']) {
  if($row['post_id'] > 0) $db->query( "UPDATE " . PREFIX . "_post SET comm_num=comm_num-1 WHERE id='{$row['post_id']}'" );
  else $db->query( "UPDATE " . PREFIX . "_static SET comments_num=comments_num-1 WHERE id='".(-$row['post_id'])."'" );
}

На этом можно сделать выдох, все готово! 🙂 Теперь на статичных страницах DLE должны работать теги, связанные с работой комментариев.

Запись опубликована в рубрике PHP, Другие языки и технологии. Добавьте в закладки постоянную ссылку.