Перейти к содержимому


Модуль :) навигации в "обсуждениях"


  • Вы не можете ответить в тему
Сообщений в теме: 21

#1 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 04 June 2012 - 04:15 PM

Модуль состоит из трех частей, каждую из которых можно использовать по отдельности:

- блок, где показаны N последних ссылок
- добавление "навигации" в обсуждения товара
- модуль вывода сообщений-обсуждений без привязки к товару, т.е. всех сообщений сразу.
Тоже с навигацией и возможностью удаления сообщений


1. файл core/includes/product_discussion.php

1.1 вставляем в него нижеследующую функцию


function disc_getNavigation( $list,$productID)
{
$lim = 3; // Messages limit on page
$count = mysql_query("SELECT count(*) FROM ".DISCUSSIONS_TABLE." WHERE productID=".$productID);
$count = mysql_result($count, 0, 0);
$total = intval(($count - 1) / $lim) + 1;
$list = intval($list);
if(empty($list) or $list < 0) $list = 1;
if($list > $total) $list = $total;
$start = $list * $lim - $lim;
if($total > 1)
{
$url = "product_".$productID.".html&discuss=yes";
if ($list != 1) $pervpage = '<a href="'.$url.'&list=1"><<<</a>&nbsp;<a href= "'.$url.'&list='.($list - 1).'"><</a>';
if ($list != $total) $nextpage = ' <a href="'.$url.'&list='.($list + 1).'">></a>&nbsp;<a href="'.$url.'&list='.$total. '">>>></a>';
if($list - 2 > 0) $page2left = ' <a href="'.$url.'&list='. ($list - 2).'">'. ($list - 2) .'</a> | ';
if($list - 1 > 0) $page1left = '<a href="'.$url.'&list='. ($list - 1) .'">'. ($list - 1) .'</a> | ';
if($list + 2 <= $total) $page2right = ' | <a href="'.$url.'&list='. ($list + 2) .'">'. ($list + 2) .'</a>';
if($list + 1 <= $total) $page1right = ' | <a href="'.$url.'&list='. ($list + 1) .'">'. ($list + 1) .'</a>';
$navstr = "<br /><center>";
$navstr .= $pervpage.'&nbsp;&nbsp;'.$page2left.$page1left.'<b>'.$list.'</b>'.$page1right.$page2right.'&nbsp;&nbsp;'.$nextpage;
$navstr .= "</center><br />";
}
$result[0] = $navstr;
$result[1] = $start;
$result[2] = $lim;
return $result;
}


1.2. изменяем нижеследующее.
Закомментированное это старый код, а не закомментрованное - новый.


#$q = db_query(
#"select Author, Body, add_time, DID, Topic FROM ".DISCUSSIONS_TABLE.
#" WHERE productID=".$productID." ORDER BY add_time DESC");
$nav = disc_getNavigation($_GET["list"], $productID);
$smarty->assign("nav", $nav[0]);
$q = db_query("select Author, Body, add_time, DID, Topic FROM ".DISCUSSIONS_TABLE.
" WHERE productID=".$productID." ORDER BY add_time DESC LIMIT ".$nav[1].",".$nav[2]);


2. файл product_discussion.tpl.html
вставляем {$nav} до и после секции с дискуссией.


{$nav}
{section name=i loop=$product_reviews}
..................
{/section}
{$nav}



3. блок, показывающий последние N сообщений в дискуссиях, откуда можно перейти на выбранную дисуссию
либо на общую таблицу всех дискуссий. его надо скопировать в /core/tpl/user/[шаблон]/block
и подключить в админке как "блок из файла".


{php}
$data = db_query("SELECT d.add_time, d.productID, d.body, d.topic, p.name FROM ".DISCUSSIONS_TABLE." AS d
LEFT JOIN ".PRODUCTS_TABLE." AS p USING (productID)
ORDER BY DID DESC LIMIT 5");
while( $row[] = db_fetch_assoc( $data ))
$this->assign("disc_array", $row);
{/php}

{if $disc_array}
{section name=u loop=$disc_array}
{if $smarty.section.u.index ne 0}<br>{/if}
<table cellspacing="0" cellpadding="0" width="100%">
<tr>
<td align="left" valign="top" width="100%">
<a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$disc_array[u].productID}.html{else}index.php?product={$disc_array[u].productID}{/if}" class="cl12">{$disc_array[u].name|truncate:30}</a>
</td>
</tr>
<tr>
<td align="left" valign="top" style="padding-top: 1px;">{$disc_array[u].add_time}</td>
</tr>
<tr>
<td align="left" valign="top" width="100%">
<a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$disc_array[u].productID}.html?discuss=yes{else}index.php?product={$disc_array[u].productID}&discuss=yes{/if}" class="cl12">{$disc_array[u].topic|truncate:30}</a>
<div class="fil1"></div>
{$disc_array[u].body|truncate:100}
</td>
</tr>
</table>
{/section}
<br>
<table cellspacing="0" cellpadding="0" width="100%">
<tr>
<td align="left" valign="top" width="100%"><a href="index.php?alldisc=yes" class="cl12">Все обсуждения</a>
</tr>
</table>
{else}
<div align="center">No messages</div>
{/if}



4. Все обсуждения "в одну кучу", а не "потоварно". С навигацией. Ссылка - index.php?alldisc=yes.
В вышеописанном блоке она уже есть. Если текущий логин админский, то можно удалять сообщения.

4.1 файл /core/includes/all_discussion.php:


<?php
if (isset($_GET["alldisc"]))
{
if (isset($_GET["remove_topic"]) && in_array(100, checklogin()))
{
discDeleteDiscusion( $_GET["remove_topic"] );
Redirect("index.php?alldisc=yes".(isset($_GET['list'])?("&list=".$_GET['list']):""));
}
$smarty->assign("main_content_template", "all_discussion.tpl.html");
$smarty->assign("product_name", "Все товары");
$q = db_query("select count(*) from ".DISCUSSIONS_TABLE);
$cnt = db_fetch_row($q);
if ($cnt[0])
{
$nav = all_getNavigation($_GET["list"]);
$smarty->assign("nav", $nav[0]);
$q = db_query("SELECT d.Author, d.Body, d.add_time, d.Topic, d.DID, d.productID, p.name FROM ".DISCUSSIONS_TABLE. " AS d
LEFT JOIN ".PRODUCTS_TABLE." AS p USING (productID)
ORDER BY add_time DESC LIMIT ".$nav[1].",".$nav[2]);
$result = array();
while ($row = db_fetch_row($q))
{
$row["add_time"]= format_datetime( $row["add_time"] );
$result[] = $row;
}
$smarty->assign("product_reviews", $result);
$smarty->assign("list_num", (isset($_GET['list'])?("&list=".$_GET['list']):""));
}
else
{
$smarty->assign("product_reviews", NULL);
}
}

function all_getNavigation($list)
{
$lim = 3; // Messages limit on page
$count = mysql_query("SELECT count(*) FROM ".DISCUSSIONS_TABLE);
$count = mysql_result($count, 0, 0);
$total = intval(($count - 1) / $lim) + 1;
$list = intval($list);
if(empty($list) or $list < 0) $list = 1;
if($list > $total) $list = $total;
$start = $list * $lim - $lim;
if($total > 1)
{
$url = "index.php?alldisc=yes";
if ($list != 1) $pervpage = '<a href="'.$url.'&list=1"><<<</a>&nbsp;<a href= "'.$url.'&list='.($list - 1).'"><</a>';
if ($list != $total) $nextpage = ' <a href="'.$url.'&list='.($list + 1).'">></a>&nbsp;<a href="'.$url.'&list='.$total. '">>>></a>';
if($list - 2 > 0) $page2left = ' <a href="'.$url.'&list='. ($list - 2).'">'. ($list - 2) .'</a> | ';
if($list - 1 > 0) $page1left = '<a href="'.$url.'&list='. ($list - 1) .'">'. ($list - 1) .'</a> | ';
if($list + 2 <= $total) $page2right = ' | <a href="'.$url.'&list='. ($list + 2) .'">'. ($list + 2) .'</a>';
if($list + 1 <= $total) $page1right = ' | <a href="'.$url.'&list='. ($list + 1) .'">'. ($list + 1) .'</a>';
$navstr = "<br /><center>";
$navstr .= $pervpage.'&nbsp;&nbsp;'.$page2left.$page1left.'<b>'.$list.'</b>'.$page1right.$page2right.'&nbsp;&nbsp;'.$nextpage;
$navstr .= "</center><br />";
}
$result[0] = $navstr;
$result[1] = $start;
$result[2] = $lim;
return $result;
}
?>


4.2 файл /core/tpl/user/[шаблон]/all_discussion.tpl.html:


{include file="header.tpl.html" header="`$smarty.const.DISCUSSION_TITLE`: Все продукты"}
<table cellspacing="0" cellpadding="0" width="100%">
<tr>
<td class="hmin" align="left">
{if $product_reviews ne NULL}
{$nav}
{section name=i loop=$product_reviews}
{if $smarty.section.i.index ne 0}
<div class="fil1 white"></div>
{/if}
<table cellspacing="1" cellpadding="0" width="100%" class="gre">
<tr>
<td class="lt padt" valign="middle" align="right" nowrap="nowrap">Товар:</td>
<td width="99%" class="padt" align="left"><a href="product_{$product_reviews[i].productID}.html"><b>{$product_reviews[i].name}</b></td>
</tr>
<tr>
<td class="lt padt" valign="middle" align="right" nowrap="nowrap">{$smarty.const.DISCUSSION_SUBJECT}:</td>
<td width="99%" class="padt" align="left"><b>{$product_reviews[i].Topic}</b></td>
</tr>
<tr>
<td class="lt padt" valign="middle" align="right" nowrap="nowrap">{$smarty.const.DISCUSSION_NICKNAME}:</td>
<td width="99%" class="padt" align="left">{$product_reviews[i].Author}</td>
</tr>
<tr>
<td class="lt padt" valign="middle" align="right" nowrap="nowrap">{$smarty.const.DISCUSSION_DATE}:</td>
<td width="99%" class="padt" align="left">{$product_reviews[i].add_time}</td>
</tr>
<tr>
<td class="lt padt" valign="middle" align="right" nowrap="nowrap">{$smarty.const.DISCUSSION_BODY}:</td>
<td width="99%" class="padt" align="left">{$product_reviews[i].Body}</td>
</tr>
{if $isadmin eq "yes"}
<tr>
<td class="padt" valign="middle" align="right" nowrap="nowrap">&nbsp;</td>
<td width="99%" class="padt" align="left"><a href="index.php?alldisc=yes&amp;remove_topic={$product_reviews[i].DID}{$list_num}">{$smarty.const.DISCUSSION_DELETE_POST_LINK}</a></td>
</tr>
{/if}
</table>
{/section}
{$nav}
{else}
<div align="center" class="padt">{$smarty.const.DISCUSSION_NO_POSTS_ON_ITEM_STRING}</div>
{/if} </td>
</tr>
</table>


4.3 если хотим привязывать показ (или непоказ) в админке каких-либо блоков к этому шаблону,
то в файл core/tpl/admin/conf_blocks_edit.tpl.html после строки


<option value="visit_history.tpl.html" {if in_array("visit_history.tpl.html", $blocks_edit.pages)}selected{/if}>{$smarty.const.BLOCK_EDIT_PAGE_35}</option>


добавляем строку


<option value="all_discussion.tpl.html" {if in_array("all_discussion.tpl.html", $blocks_edit.pages)}selected{/if}>Все дискуссии</option>


Посмотреть пример работы, как всегда, можно на http://cpu.badisoft.ru, справа внизу
  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#2 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 05 June 2012 - 09:16 PM

Сделал заодно и "все обсуждения одной кучей с навигацией". При админском логине можно удалять сообщения, как и в штатной дискуссии. Подозреваю, что это удобно, когда надо ежедневно удалять по нескольку сообщений из дискуссий к разным товарам. Отсюда из плясалось.
В шапке добавился пункт 4, это оно и есть. Два совершенно отдельных новых файла.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#3 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 07 June 2012 - 09:21 PM

Чуть поменял блок последних N сообщений (по умолчанию - пять сообщений).
Добавил ссылку на исходный товар у каждого сообщения.
В шапке уже исправленная версия.
  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#4 paradoxUA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 31 сообщений
Репутация: 0
Начинающий

Отправлено 08 April 2014 - 09:30 PM

badisoft,
подскажите, пожалуйста. делал табы, через include вставляю отзывы, но почему-то отображается только форма для отправки отзыва, сами отзывы не отображаются(хотя я их понаписывал). Но если добавить к ссылке гет-параметр &discuss=yes - отзывы видны. Не посоветуете, в чем косяк? Может сталкивались...
  • 0

#5 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 08 April 2014 - 09:32 PM

Значит этот "гет-параметр" проверяется на наличие в инклюде.
а хотя я ж не badisoft, не обращайте внимания ))
  • 0
502 Bad Gateway

#6 paradoxUA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 31 сообщений
Репутация: 0
Начинающий

Отправлено 08 April 2014 - 09:42 PM

Значит этот "гет-параметр" проверяется на наличие в инклюде.
а хотя я ж не badisoft, не обращайте внимания ))

нет-нет, всё же обращу)
Не совсем понимаю. Ниже написал, что я имел в виду.
<div id="prod_tab2" class="tabs prod-reviews">{include file="product_discussion.tpl.html"}</div>
Каким же образом он может проверяться?
  • 0

#7 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 08 April 2014 - 09:47 PM

Каким же образом он может проверяться?

Ну ты не забывай что tpl файлы это "верхушка айсберга" :)
а сама магия творится в соответствующих им инклюдах и вызываемых функциях.

инклюдах из папки includes я имел в виду.
  • 0
502 Bad Gateway

#8 paradoxUA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 31 сообщений
Репутация: 0
Начинающий

Отправлено 08 April 2014 - 09:55 PM

Каким же образом он может проверяться?

Ну ты не забывай что tpl файлы это "верхушка айсберга" :)
а сама магия творится в соответствующих им инклюдах и вызываемых функциях.

инклюдах из папки includes я имел в виду.

я понял, о чём вы. Я персемотрел "product_discussion.php" . С точно таким же содержимым на другом сайте всё замечательно работало. Вот это и непонятно. (
  • 0

#9 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 08 April 2014 - 10:01 PM

product_discussion.php работает для product_discussion.tpl
для product_detailed есть соответствующий файл.
а вообще посмотри лучше сюда http://vsupport.club/topic/429-%D0%BE%D1%82%D0%B7%D1%8B%D0%B2%D1%8B-%D0%B2-%D0%BF%D0%BE%D0%B4%D1%80%D0%BE%D0%B1%D0%BD%D0%BE%D0%BC-%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B8/
  • 0
502 Bad Gateway

#10 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 08 April 2014 - 10:14 PM

Каким же образом он может проверяться?

product_discussion.php:

if (isset($productID) && $productID>0 && (isset($_GET["discuss"]) || isset($_POST["discuss"])))

я понял, о чём вы. Я персемотрел "product_discussion.php" . С точно таким же содержимым на другом сайте всё замечательно работало. Вот это и непонятно. (

Куда более непонятно, как оно "работало на другом сайте" с "точно таким же содержимым". :)

а вообще посмотри лучше сюда http://vsupport.club....club/t...BDии/

Тогда уж сразу сюда :).
http://vsupport.club...краткоеполноео/
Там нет навигации, но ее куда проще приспособить из этой темы к тому модулю, чем разобраться с нормальным поведением блока с дискуссиями в этом.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#11 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 08 April 2014 - 10:18 PM

Тогда уж сразу сюда

Так а я куда отправил ? :)
  • 0
502 Bad Gateway

#12 paradoxUA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 31 сообщений
Репутация: 0
Начинающий

Отправлено 08 April 2014 - 10:19 PM

product_discussion.php работает для product_discussion.tpl
для product_detailed есть соответствующий файл.
а вообще посмотри лучше сюда http://vsupport.club....club/t...BDии/

спасибо, начинаю разбираться. Как вас тут лайкнуть?
  • 0

#13 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 08 April 2014 - 10:20 PM

Так а я куда отправил ?

Акела промахнулся :). Исправил.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#14 paradoxUA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 31 сообщений
Репутация: 0
Начинающий

Отправлено 08 April 2014 - 10:22 PM

Каким же образом он может проверяться?

product_discussion.php:

if (isset($productID) && $productID>0 && (isset($_GET["discuss"]) || isset($_POST["discuss"])))

я понял, о чём вы. Я персемотрел "product_discussion.php" . С точно таким же содержимым на другом сайте всё замечательно работало. Вот это и непонятно. (

Куда более непонятно, как оно "работало на другом сайте" с "точно таким же содержимым". :)

а вообще посмотри лучше сюда http://vsupport.club....club/t...BDии/

Тогда уж сразу сюда :).
http://vsupport.club....club/t...BEео/
Там нет навигации, но ее куда проще приспособить из этой темы к тому модулю, чем разобраться с нормальным поведением блока с дискуссиями в этом.

О, и вам спасибо большое) Тоже полезный топик)
  • 0

#15 Dbus

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 1116 сообщений
Репутация: 174
Мастер
  • ГородОдесса

Отправлено 08 April 2014 - 10:22 PM

Как вас тут лайкнуть?

Ну если с пивом бежать далеко, то вот справа есть зеленая кнопка ))
  • 0
502 Bad Gateway

#16 paradoxUA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 31 сообщений
Репутация: 0
Начинающий

Отправлено 08 April 2014 - 10:29 PM

Как вас тут лайкнуть?

Ну если с пивом бежать далеко, то вот справа есть зеленая кнопка ))

Та она не жмакается (( говорит, что исчерпал. А я даже не начинал исчерпывать...
  • 0

#17 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 08 April 2014 - 11:05 PM

Та она не жмакается (( говорит, что исчерпал. А я даже не начинал исчерпывать...

Насколько я помню, с нулевой репутацией зеленая кнопка недоступна. Оно и логично, иначе можно было бы сто раз зарегистрироваться и сто раз нажать на эту кнопку одному и тому же человеку. Обычно - своей же сто первой регистрации :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#18 paradoxUA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 31 сообщений
Репутация: 0
Начинающий

Отправлено 09 April 2014 - 01:40 PM

Здравствуйте.
После необходимых манипуляций в файле core/includes/product_discussion.php, при попытке перейти на следующую страницу в навигации выдаёт:

Not Found
The requested URL /product_2.html&discuss=yes&list=2 was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.


Подскажите, пожалуйста, на что стоит обратить внимание?
  • 0

#19 Den

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 117 сообщений
Репутация: 0
Начинающий

Отправлено 15 May 2014 - 10:44 AM

Здравствуйте.
После необходимых манипуляций в файле core/includes/product_discussion.php, при попытке перейти на следующую страницу в навигации выдаёт:

Not Found
The requested URL /product_2.html&discuss=yes&list=2 was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.


Подскажите, пожалуйста, на что стоит обратить внимание?


Замените в файле core/includes/product_discussion.php
$url = "product_".$productID.".html&discuss=yes";
на
$url = "index.php?productID=".$productID."&discuss=yes";

  • 0

#20 Den

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 117 сообщений
Репутация: 0
Начинающий

Отправлено 15 May 2014 - 02:48 PM

Заметил в навигации одну неприятность - 2 разных ссылки на одну и ту же страницу, т.н. дублирование контента, что поисковики не любят.

Первая страница в обсуждениях имеет ссылку:
1) "...index.php?productID=1&discuss=yes" (при переходе со страницы описания товара)
2) "...index.php?productID=1&discuss=yes&list=1" (при переходе со 2й, 3й, 4й и т.д. страниц обсуждения товара)

Для поисковиков это 2 разные страницы с одинаковым контентом, поэтому надо исправлять.

Методом "научного тыка" нашел такое решение:

- в файле core/includes/product_discussion.php заменить строку:
if ($list != 1) $pervpage = '<a href="'.$url.'&list=1"><<<</a>&nbsp;<a href= "'.$url.'&list='.($list - 1).'"><</a>';
на
if ($list != 1) $pervpage = '<a href="'.$url.'"><<<</a>&nbsp;<a href= "'.$url.'&list='.($list - 1).'"><</a>';

- в файле core/includes/product_discussion.php добавить 3 строки:
после строки
  if($list + 1 <= $total) $page1right = ' | <a href="'.$url.'&list='. ($list + 1) .'">'. ($list + 1) .'</a>';
добавить это:
  if ($page1left == '<a href="'.$url.'&list=1">1</a> | ') $page1left = '<a href="'.$url.'">1</a> | ';
  if ($page2left == '<a href="'.$url.'&list=1">1</a> | ') $page2left = '<a href="'.$url.'">1</a> | ';
  if ($pervpage == '<a href="'.$url.'"><<<</a>&nbsp;<a href= "'.$url.'&list=1"><</a>') $pervpage = '<a href="'.$url.'"><<<</a>&nbsp;<a href= "'.$url.'"><</a>';

Просьба к нашим гуру - проверьте корректно ли это или предложите более изящное решение.
  • 0