1. подготовим нашу страницу для приема ответа от сервера, для этого добавим в html код элемент с уникальным идентификатором.
В функцию build_comments добавим следующий код:
после:
$tpl->load_template( $template );
добавим:
$tpl->copy_template = '<div id="comm___">' .$tpl->copy_template;
в конце функции найдем переменную $tpl->result['content'] = "......................."; и добавим закрывающий тег </div>
$tpl->result['content'] = ".......................</div>";
Для того чтобы задействовать js каждой ссылке из блока навигации по страницам мы назначим событие onclick вызывающие функцию которую мы напишем в конце.Так как мы не знаем какая страница будет запрошена пользователем то будем назначать данное событие всем ссылкам блоке навигации.
В функцию build_navigation вносим следующие изменения
чтото вроде этого
$pages .="........ onclick="CommNav('{$j}','{$news_id}'); return false;.............."
Имя вызываемой функции будет CommNav,
аргументами будет номер страницы и идентификатор новости.
2. Создадим файл в папке engine/ajax/ с произвольным именем к которому будем обращаться за новыми комментариями
@session_start();
@error_reporting(7);
@ini_set('display_errors', true);
@ini_set('html_errors', false);
define('DATALIFEENGINE', true);
define('ROOT_DIR', '../..');
define('ENGINE_DIR', '..');
include ENGINE_DIR . '/data/config.php';
require_once ENGINE_DIR . '/modules/functions.php';
if ($config['http_home_url'] == "")
{
$config['http_home_url'] = explode("engine/ajax/имя файла.php", $_SERVER['PHP_SELF']);
$config['http_home_url'] = reset($config['http_home_url']);
$config['http_home_url'] = "http://" . $_SERVER['HTTP_HOST'] . $config['http_home_url'];
}
require_once ENGINE_DIR . '/classes/mysql.php';
require_once ENGINE_DIR . '/data/dbconfig.php';
if ($_COOKIE['dle_skin'])
{
if (@is_dir(ROOT_DIR . '/templates/' . $_COOKIE['dle_skin']))
{
$config['skin'] = $_COOKIE['dle_skin'];
}
}
if ($config["lang_" . $config['skin']])
{
include_once ROOT_DIR . '/language/' . $config["lang_" . $config['skin']] . '/website.lng';
}
else
{
include_once ROOT_DIR . '/language/' . $config['langs'] . '/website.lng';
}
include_once ENGINE_DIR . '/classes/templates.class.php';
require_once ENGINE_DIR . '/modules/sitelogin.php';
$user_group = get_vars("usergroup");
if (!$user_group)
{
$user_group = array();
$db->query("SELECT * FROM " . USERPREFIX . "_usergroups ORDER BY id ASC");
while ($row = $db->get_row())
{
$user_group[$row['id']] = array();
foreach ($row as $key => $value)
{
$user_group[$row['id']][$key] = $value;
}
}
set_vars("usergroup", $user_group);
$db->free();
}
if (!$is_logged)
$member_id['user_group'] = 5;
$tpl = new dle_template;
в данном участке мы определили пользователя, или гостя для формирования комментариев определенного содержания, вы ведь не хотите чтобы
пользователь имел права администратора и мог производить нежелательные действия с комментариями)).
Также мы объявили переменную для работы с шаблонизатором и присвоили ей методы класса шаблонизатора, кто знаком с
ООП все поймет и без объяснений, кто же не знаком ссылка выше поможет вам понять основы данного метода программирования.
далее вы можете воспользоваться классом DLE_Comments и попробовать вывести комментарии в ответе), я же просто выполню в файле весь процесс создания блока комментариев в цикле.
$news_id = intval($_REQUEST['news_id']); //id новости
$tpl->dir = ROOT_DIR . '/templates/' . $config['skin'] . '/';
$end = 2; //кол-во комм
if (!$_REQUEST['start_query'])
{
$start = 0;
}
else
{
$start = ($_REQUEST['start_query'] - 1) * $end;
}
$query_count = "SELECT COUNT(*) as count FROM " . PREFIX . "_comments WHERE post_id='{$news_id}'";
$result_count = $db->super_query($query_count);
$all_count_comm = $result_count['count'];
$sql_result = $db->query("SELECT " . PREFIX . "_comments.id, post_id, " . PREFIX . "_comments.user_id," . PREFIX . "_comments.moderation_comm," . PREFIX . "_comments.rating," . PREFIX . "_comments.log_rating,date, autor as gast_name, " . PREFIX . "_comments.email as gast_email," . USERPREFIX . "_users.moderation, text, ip, is_register, name, " . USERPREFIX .
"_users.email, news_num, comm_num, user_group, reg_date,banned, signature, foto, fullname, land, icq, 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 date " . $config['comm_msort'] . " LIMIT {$start},{$end}");
$tpl->load_template('comments.tpl');
/**
* цикл формирования комментария, ничем не отличается от используемого в классе, в качестве дополнения
* вывод иконки забаненой группы ).
*
* */
while ($row = $db->get_row($sql_result))
{
$intern_count++;
$row['date'] = strtotime($row['date']);
$row['gast_name'] = stripslashes($row['gast_name']);
$row['gast_email'] = stripslashes($row['gast_email']);
$row['name'] = stripslashes($row['name']);
if (!$row['is_register'] or $row['name'] == '')
{
if ($row['gast_email'] != "")
{
$tpl->set('{author}', "<a href="mailto:" . htmlspecialchars($row['gast_email'], ENT_QUOTES) . "">" . $row['gast_name'] . "</a>");
}
else
{
$tpl->set('{author}', $row['gast_name']);
}
$tpl->set('{login}', $row['gast_name']);
$tpl->set('[profile]', "");
$tpl->set('[/profile]', "");
}
else
{
if ($config['ajax'])
$go_page = "onclick="DlePage('subaction=userinfo&user=" . urlencode($row['name']) . "'); return false;" ";
else
$go_page = "";
if ($config['allow_alt_url'] == "yes")
{
$go_page .= "href="" . $config['http_home_url'] . "user/" . urlencode($row['name']) . "/"";
$tpl->set('[profile]', "<a href="" . $config['http_home_url'] . "user/" . urlencode($row['name']) . "/">");
}
else
{
$go_page .= "href="$PHP_SELF?subaction=userinfo&user=" . urlencode($row['name']) . """;
$tpl->set('[profile]', "<a href="$PHP_SELF?subaction=userinfo&user=" . urlencode($row['name']) . "">");
}
$go_page = "onclick="return dropdownmenu(this, event, UserMenu('" . htmlspecialchars($go_page) . "', '" . $row['user_id'] . "', '" . $user_group[$member_id['user_group']]['admin_editusers'] . "'), '170px')" onmouseout="delayhidemenu()"";
if ($config['allow_alt_url'] == "yes")
$tpl->set('{author}', "<a {$go_page} href="" . $config['http_home_url'] . "user/" . urlencode($row['name']) . "/">" . $row['name'] . "</a>");
else
$tpl->set('{author}', "<a {$go_page} href="$PHP_SELF?subaction=userinfo&user=" . urlencode($row['name']) . "">" . $row['name'] . "</a>");
$tpl->set('{login}', $row['name']);
$tpl->set('[/profile]', "</a>");
}
if ($is_logged and $member_id['user_group'] == '1')
$tpl->set('{ip}', "IP: <a onclick="return dropdownmenu(this, event, IPMenu('" . $row['ip'] . "', '" . $lang['ip_info'] . "', '" . $lang['ip_tools'] . "', '" . $lang['ip_ban'] . "'), '190px')" onmouseout="delayhidemenu()" href="https://www.nic.ru/whois/?ip={$row['ip']}" target="_blank">{$row['ip']}</a>");
else
$tpl->set('{ip}', '');
if ($is_logged and (($member_id['name'] == $row['name'] and $row['is_register'] and $user_group[$member_id['user_group']]['allow_editc']) or $user_group[$member_id['user_group']]['edit_allc']))
{
$tpl->set('[com-edit]', "<a onclick="return dropdownmenu(this, event, MenuCommBuild('" . $row['id'] . "', '" . $area . "'), '170px')" onmouseout="delayhidemenu()" href="" . $config['http_home_url'] . "index.php?do=comments&action=comm_edit&id=" . $row['id'] . "&area=" . $area . "">");
$tpl->set('[/com-edit]', "</a>");
$allow_comments_ajax = true;
}
else
$tpl->set_block("'[com-edit](.*?)[/com-edit]'si", "");
if ($is_logged and (($member_id['name'] == $row['name'] and $row['is_register'] and $user_group[$member_id['user_group']]['allow_delc']) or $member_id['user_group'] == '1' or $user_group[$member_id['user_group']]['del_allc']))
{
$tpl->set('[com-del]', "<a href="javascript:confirmDelete('" . $config['http_home_url'] . "index.php?do=comments&action=comm_del&id=" . $row['id'] . "&dle_allow_hash=" . $dle_login_hash . "&area=" . $area . "')">");
$tpl->set('[/com-del]', "</a>");
}
else
$tpl->set_block("'[com-del](.*?)[/com-del]'si", "");
if ($user_group[$member_id['user_group']]['del_allc'])
{
$tpl->set('{mass-action}', "<input name="selected_comments[]" value="{$row['id']}" type="checkbox" />");
}
else
{
$tpl->set('{mass-action}', "");
}
if ($area == 'lastcomments')
{
$tpl->set_block("'[fast](.*?)[/fast]'si", "");
}
else
{
if (($user_group[$member_id['user_group']]['allow_addc']) and $config['allow_comments'] == "yes")
{
if (!$row['is_register'] or $row['name'] == '')
$row['name'] = $row['gast_name'];
else
$row['name'] = $row['name'];
$tpl->set('[fast]', "<a onmouseover="dle_copy_quote('" . str_replace(array(" ", "'"), array(" ", "&#039;"), $row['name']) . "');" href="#" onclick="dle_ins('" . str_replace(array(" ", "'"), array(" ", "&#039;"), $row['name']) . "'); return false;">");
$tpl->set('[/fast]', "</a>");
}
else
$tpl->set_block("'[fast](.*?)[/fast]'si", "");
}
$tpl->set('{mail}', $row['email']);
if (date(Ymd, $row['date']) == date(Ymd, $_TIME))
{
$tpl->set('{date}', $lang['time_heute'] . langdate(", H:i", $row['date']));
} elseif (date(Ymd, $row['date']) == date(Ymd, ($_TIME - 86400)))
{
$tpl->set('{date}', $lang['time_gestern'] . langdate(", H:i", $row['date']));
}
else
{
$tpl->set('{date}', langdate($config['timestamp_comment'], $row['date']));
}
$tpl->copy_template = preg_replace("#{date=(.+?)}#ie", "langdate('1', '{$row['date']}')", $tpl->copy_template);
if ($xfound)
{
$xfieldsdata = xfieldsdataload($row['xfields']);
foreach ($xfields as $value)
{
$preg_safe_name = preg_quote($value[0], "'");
if ($value[5] != 1 or $member_id['user_group'] == 1 or ($is_logged and $row['is_register'] and $member_id['name'] == $row['name']))
{
if (empty($xfieldsdata[$value[0]]))
{
$tpl->copy_template = preg_replace("'[xfgiven_{$preg_safe_name}](.*?)[/xfgiven_{$preg_safe_name}]'is", "", $tpl->copy_template);
}
else
{
$tpl->copy_template = preg_replace("'[xfgiven_{$preg_safe_name}](.*?)[/xfgiven_{$preg_safe_name}]'is", "1", $tpl->copy_template);
}
$tpl->copy_template = preg_replace("'[xfvalue_{$preg_safe_name}]'i", stripslashes($xfieldsdata[$value[0]]), $tpl->copy_template);
}
else
{
$tpl->copy_template = preg_replace("'[xfgiven_{$preg_safe_name}](.*?)[/xfgiven_{$preg_safe_name}]'is", "", $tpl->copy_template);
$tpl->copy_template = preg_replace("'[xfvalue_{$preg_safe_name}]'i", "", $tpl->copy_template);
}
}
}
if ($area == 'ajax')
{
$tpl->set('{comment-id}', "--");
} elseif ($area == 'lastcomments')
{
$tpl->set('{comment-id}', $total_comments - $cstart - $intern_count + 1);
}
else
{
if ($config['comm_msort'] == "ASC")
$tpl->set('{comment-id}', $cstart + $intern_count);
else
$tpl->set('{comment-id}', $total_comments - $cstart - $intern_count + 1);
}
if ($row['foto'])
$tpl->set('{foto}', $config['http_home_url'] . "uploads/fotos/" . $row['foto']);
else
$tpl->set('{foto}', "{THEME}/images/noavatar.png");
if ($row['is_register'] and $row['icq'])
$tpl->set('{icq}', stripslashes($row['icq']));
else
$tpl->set('{icq}', '--');
if ($row['is_register'] and $row['land'])
$tpl->set('{land}', stripslashes($row['land']));
else
$tpl->set('{land}', '--');
if ($row['is_register'] and $row['fullname'])
$tpl->set('{fullname}', stripslashes($row['fullname']));
else
$tpl->set('{fullname}', '--');
if ($row['is_register'] and $row['reg_date'])
$tpl->set('{registration}', langdate("j.m.Y", $row['reg_date']));
else
$tpl->set('{registration}', '--');
if ($row['is_register'] and $row['signature'] and $user_group[$row['user_group']]['allow_signature'])
{
$tpl->set_block("'[signature](.*?)[/signature]'si", "1");
$tpl->set('{signature}', stripslashes($row['signature']));
}
else
{
$tpl->set_block("'[signature](.*?)[/signature]'si", "");
}
$tpl->set('{news_title}', "");
if (!$row['user_group'])
$row['user_group'] = 5;
if ($row['banned'] == "yes")
{ // иконка забаненой группы
$tpl->set('{group-icon}', "<img src="" . $config['http_home_url'] . "templates/" . $config['skin'] . "/images/icon/banned.png" border="0" alt="" />");
} elseif ($user_group[$row['user_group']]['icon'])
{
$tpl->set('{group-icon}', "<img src="" . $user_group[$row['user_group']]['icon'] . "" border="0" alt="" />");
}
else
$tpl->set('{group-icon}', "");
$tpl->set('{group-name}', $user_group[$row['user_group']]['group_prefix'] . $user_group[$row['user_group']]['group_name'] . $user_group[$row['user_group']]['group_suffix']);
$tpl->set('{news-num}', intval($row['news_num']));
$tpl->set('{comm-num}', intval($row['comm_num']));
if (count($extras_rules))
{
foreach ($extras_rules as $rules)
{
if ($rules[0] == 'set')
{
$tpl->set($rules[1], $rules[2]);
}
else
{
$tpl->set_block($rules[1], $rules[2]);
}
}
}
$tpl->set('{THEME}', ROOT_DIR . '/templates/' . $config['skin']);
$tpl->set('{comment}', "<div id='comm-id-" . $row['id'] . "'>" . stripslashes($row['text']) . "</div>");
$tpl->compile('content');
}
$buffer .= $tpl->result['content']; //готовый блок html
$tpl->clear();
также нужна навигация с учетом текущего местонахождения пользователя на странице комм.
/**
* псевдо навигация)
* для оформления можно использовать css (#ajax_nav)
* */
$enpages_count = @ceil($all_count_comm / $end);
$enpages_start_from = 0;
if ($enpages_count != 1)
{
$enpages .= '<div id="ajax_nav" align="center">';
if ($enpages_count <= 10)
{
for ($j = 1; $j <= $enpages_count; $j++)
{
if ($enpages_start_from != $start)
{
$enpages .= "<span class="nav_1" onclick="CommNav('{$j}','{$_REQUEST['news_id']}')">{$j}</span> ";
}
else
{
$enpages .= "<span class="nav_0">{$j}</span>";
}
$enpages_start_from += $end;
}
}
else
{
$cstart = ($start / $end) + 1;
$start_s = 1;
$end_s = 10;
$nav_prefix .= "<span class="nav_0">...</span>";
if ($cstart > 0)
{
if ($cstart > 6)
{
$start_s = $cstart - 4;
$end_s = $start_s + 8;
if ($end_s >= $enpages_count)
{
$start_s = $enpages_count - 9;
$end_s = $enpages_count - 1;
$nav_prefix = "";
}
else
{
if ($start_s >= 2)
{
$enpages .= "<span class="nav_1" onclick="CommNav('1','{$_REQUEST['news_id']}')">1</span> ";
}
$enpages .= "<span class="nav_0">...</span>";
}
}
}
for ($j = $start_s; $j <= $end_s; $j++)
{
if ($j != $cstart)
{
$f++;
$enpages .= "<span class="nav_1" onclick="CommNav('{$j}','{$_REQUEST['news_id']}')">{$j}</span> ";
}
else
{
$enpages .= "<span class="nav_0">{$j}</span>";
}
$enpages_start_from += $end;
}
if ($cstart != $enpages_count)
{
$enpages .= $nav_prefix . "<span class="nav_1" onclick="CommNav('{$enpages_count}','{$_REQUEST['news_id']}')">{$enpages_count}</span>";
}
else
$enpages .= "<span>{$enpages_count}</span> ";
}
$buffer .= $enpages . '</div>';
}
В данном варианте будут выведены все страницы.
Выведем полученные результаты
@header("Content-type: text/css; charset=" . $config['charset']);
echo $buffer;
Функция CommNav будет выглядеть следующим образом
function CommNav (id,news_id){
var ajax = new dle_ajax();
var varsString = "";
ajax.onShow();
ajax.setVar("action", "show_comm"); //передаваемый параметр будет в $_POST['action']
ajax.setVar("start_query",id);//страница
ajax.setVar("news_id", news_id); // id новости
if(document.getElementById('navigation_block')){//скроем стандартную навигацию
var hidden_block = document.getElementById('navigation_block');
hidden_block.style.display='none'
}
ajax.requestFile = dle_root + "engine/ajax/cимя файла.php";
ajax.method = 'POST';
ajax.element = 'comm___';//добавленный в начале урока элемент
ajax.execute = true;
ajax.sendAJAX(varsString);
return false;
}
Для того чтобы убрать стандартную навигацию по страницам заключите весь код в файле navigation.tpl в div с id navigation_block, также вы можете
обозначит область действия данного кода применив следующие условие
if ($_REQUEST['action'] == 'show_comm')
{
сам код
}else{
die;
}