Сайт сообщества | Клуб пользователей | О проекте

Имя
Пароль
ПравилаРегистрацияСправка
Сообщения за деньПоиск

Вернуться   Клуб пользователей портальной системы RUNCMS > Портал > Модули и блоки > Модули форумов

Ответ
 
Опции темы Опции просмотра
ZlydenGL вне форума ZlydenGL
Напильникъ - наше все

Аватар для ZlydenGL

| Цитировать Старый #221 03-17-2010, 09:36

Нашел еще один смешной косячок - на этот раз с мета-генератором.

Достало меня уже, что даже при просмотре конкретной темы в форуме в заголовок страницы все равно шел заголовок вида "Название форума : Форум : Описание сайта". Это было неудобно и для пользователей (если открыто несколько страниц с разными темами одного форума - найти нужную только по заголовкам панели заголовкам в панели задач/предпросмотре мягко говоря проблематично), и для поисковых пауков (тот же Гугль регулярно рапортовал, что есть много страниц с дублирующимся заголовком).

Как обычно, ларчик открывался просто. Текущая реализация мета-генератора использует только ОДИН модуль для генерации заголовка и мета-тега, основываясь на следующем правиле:
1. Смотрим на директорию metagenerator в каталоге модуля
2. Если такой директории нет - идем по старому пути (т.е. в подпапке метагенератора в модуле system)
3. В директории метагенератора ищем ПЕРВЫЙ файл, название которого совпадает с именем одной из GET переменных.

Подход понятен и вполне работоспособен для новостей, глоссария, статей и многих других модулей - но дает сбой на нашем любимом (не у всех) newbb_plus - именно потому, что при отображении в дефолтном модуле темы форума мы имеем ДВЕ GET переменные: forum и topic_id. Соответственно во всех случаях (неважно, смотрим мы сам форум или тему форума) для генерации заголовка и мета-тега используется модуль forum.php. Эта неприятность неактуальна для доработки форума от Zormax'а, но что делать любителям дефолтных вещей или людей, у которых форум уже закастомизирован по самое не балуй?

Один из самых простых способов - это простейшая модернизация модуля метагенератора forum.php: анализируем внутри модуля наличие GET переменной topic_id, и если эта переменная задана - генерируем мету и заголовок для темы, если нет - то генерируем мету и заголовок для форума.

В результате получаем вот такое содержимое файла forum.php:
PHP код:
<?php
// ************************************************************/
// *                        RUNCMS                            */
// *               Simplicity & ease off use                  */
// *               < http://www.runcms.org >                  */
// ************************************************************/
// * Author Website : http://www.runcms.org                   */
// * License Type   : Proprietary:                            */
// * Proprietary: See /manual/LICENSES/Runcms.txt             */
// ************************************************************/
/**
 * @package     modules
 * @subpackage  newbb_plus
 */
// Forum Posts
 
function get_meta($id$limit) {
global 
$db;
 
if (!isset(
$_GET['topic_id'])) // переменная не задана - значит пользователь/паук просматривает форум
{
$SQL =  "
    SELECT
    "
.$db->prefix("bbplus_forums.forum_name").",
    "
.$db->prefix("bbplus_topics.topic_title").",
    "
.$db->prefix("bbplus_forums.forum_desc")."
    FROM
    "
.$db->prefix("bbplus_forums").",
    "
.$db->prefix("bbplus_topics")."
    WHERE
    ("
.$db->prefix("bbplus_topics.forum_id")."=$id
    AND
    "
.$db->prefix("bbplus_forums.forum_id")."=$id)";
 
$query $db->query($SQL$limit);
while (list(
$forum_name$topic_title$forum_desc) = $db->fetch_row($query)) {
    
$result["title"]     = $forum_name;
    
$result["keywords"] .=  " "$forum_name ." "$topic_title ." "$forum_desc ." ";
}
}
else 
// пользователь/паук просматривает конкретную тему форума (ниже идет копипаст обработки из модуля метагенератора topic_id.php за исключением помеченной строки)
{
$SQL "
    SELECT
    T.topic_title,
    T.forum_id,
    P.subject,
    P.post_text,
    S.forum_name
    FROM
    "
.$db->prefix("bbplus_topics")." T,
    "
.$db->prefix("bbplus_posts")." P,
    "
.$db->prefix("bbplus_forums")." S
    WHERE P.topic_id = 
$id AND T.topic_id = " $_GET['topic_id'] . " AND S.forum_id = T.forum_id"// эта строка отличается от копипаста - вместо id форума передаем ей GET переменную, содержащую идентификатор темы просмотра
 
$query $db->query($SQL$limit);
 
while (list(
$topic_title$forum_id$subject$post_text$forum_name) = $db->fetch_row($query)) {
    
$result["title"]     = $topic_title ." : "$forum_name;
    
$result["keywords"] .= " "$forum_name ." "$topic_title ." "$subject ." "$post_text ." ";
}
}
return 
$result;
}
?>
Все, теперь заголовок и мета для тем форума будут тоже генерироваться правильно

Последний раз редактировалось ZlydenGL, 03-17-2010 в 09:50
Причина: Добавил простые примечания в код


Не ошибается только тот, кто ничего не делает. Ковчег построил любитель. Профессионалы строили Титаник.
  Сообщения: 777 c 22.09.2008 | Репутация: 92
ZlydenGL вне форума ZlydenGL
Напильникъ - наше все

Аватар для ZlydenGL

| Цитировать Старый #222 05-17-2010, 22:35

Продолжаем ковырять "старую" официальную версию форума

Есть в дефолтной инсталляции форума очень неприятный косяк: если производится перемещение сообщения пользователя в другой форум/тему, то тема-источник "прячется" и появляется в списке тем только после синхронизации сообщений и тем форума.

Исправляется это, впрочем, элементарно - в файле mcs_post.php после 116 строчки
PHP код:
       sync($to_forum_id'forum');
       
sync($from_forum_id'forum'); 
нужно добавить еще две строчки:
PHP код:
       sync($to_topic_id'topic');
       
sync($from_topic_id'topic'); 
Все, сообщения перемещаются абсолютно безболезненно для темы-истончика Есть у меня подозрение, что $result2 и $result3 тоже совершенно необязательно отрабатывать - но убирать не стал, ибо дополнительную нагрузку они создают минимальную (все-таки форма эта вызывается не очень часто).


Не ошибается только тот, кто ничего не делает. Ковчег построил любитель. Профессионалы строили Титаник.
  Сообщения: 777 c 22.09.2008 | Репутация: 92
iltmpz вне форума iltmpz
Младший участник


| Цитировать Старый #223 08-21-2010, 02:49

Всплыло при попытке обновить runcms до 1.6.2, в модуле newbb_plus ткнул свернуть категорию, и больше она не развернулась.
При копании выловил такой javascript:
modules/newbb_plus/include/newbbplus.js
Код:
function save_collapsed(objid, addcollapsed){
var collapsed = get_cookie("newbbplus_collapse");
var tmp = "";
if (collapsed != null){
collapsed = collapsed.split(",");
for (i in collapsed){
if (collapsed[i] != objid && collapsed[i] != ""){
tmp = tmp + collapsed[i];
tmp = tmp + ",";
}
}
}
if (addcollapsed) tmp = tmp + objid;
expires = new Date();
expires.setTime(expires.getTime() + (1000 * 86400 * 365));
set_cookie("newbbplus_collapse", tmp, expires);
}
Вопрос к разработчикам, что вы хотели выразить строкой: for (i in collapsed) ?
Javascript зачем-то перебирал все свойства объекта, конкретно в версии 1.6.2 выдавая явную чушь. Как следствие кука не обновлялась. Либо я что-то не понимаю, либо подразумевался цикл по элементам массива collapsed, а не по свойствам. Кстати, тут у вас на сайте по-прежнему тот же цикл по свойствам объекта, хотя кука и обновляется корректно, файл clientscript/vbulletin_global.js
Заменил цикл на: for (i = 0; i < collapsed.length; i++), все заработало: куки сохраняются.
Решил написать сюда: вдруг у кого тоже глюки возникнут, или вдруг я ошибаюсь и цикл все-таки по свойствам нужен...
Оценка сообщения (репутация)
+1 ZlydenGL положительно: Спасибо, давно искал корни этого косяка

Последний раз редактировалось iltmpz, 08-21-2010 в 02:57

  Сообщения: 50 c 02.08.2010 | Репутация: 14
iltmpz вне форума iltmpz
Младший участник


| Цитировать Старый #224 09-08-2010, 22:44

Еще вопрос по форуму:
при включенной в админке отладке, в форуме перед каждым сообщением того юзера, под которым залогинен, выдаются ошибки:
Цитата:
1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1: SELECT g.* FROM runcms_groups g LEFT JOIN runcms_groups_users_link l ON l.groupid=g.groupid WHERE l.uid=
1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1: INSERT INTO runcms_groups_users_link SET groupid=2, uid=
При этом на первый взгляд все на месте: кнопки, ссылки, число сообщений, аватара и т.п, однако все же интересно, что же оно пытается сделать этим запросом?
Пробовал подставлять в код запроса свой UID - разницы не заметил, вроде ничего нового в сообщении не появилось.
Все же что с этим делать? Забить или есть какой-то фикс?

Последний раз редактировалось iltmpz, 09-08-2010 в 22:46

  Сообщения: 50 c 02.08.2010 | Репутация: 14
LARK вне форума LARK
[исход]

Аватар для LARK

| Цитировать Старый #225 09-08-2010, 23:30

Цитата:
Сообщение от iltmpz Посмотреть сообщение
при включенной в админке отладке, в форуме перед каждым сообщением того юзера, под которым залогинен, выдаются ошибки:
Исправление ошибки класса XoopsUser в RUNCMS 1.6-1.6.1


Правила нашего Форума :: О клубе пользователей RUNCMS :: Рекомендации по публикации сообщений :: Прежде чем задать вопрос воспользуйтесь Поиском
-------------------------------------------------------------------
Если что-то не работает, задавая вопрос, ! ОБЯЗАТЕЛЬНО ! пишите версию RUNCMS/модуля/PHP/MySQL и текст самой ошибки.
Посетить домашнюю страницу LARK
  Сообщения: 4,182 c 20.09.2003 | Репутация: 223
iltmpz вне форума iltmpz
Младший участник


| Цитировать Старый #226 09-09-2010, 11:47

да, спасибо, ошибка исчезла

  Сообщения: 50 c 02.08.2010 | Репутация: 14
ZlydenGL вне форума ZlydenGL
Напильникъ - наше все

Аватар для ZlydenGL

| Цитировать Старый #227 09-20-2010, 09:37

Вестник Напильника - очередная заметка хозяйке тайги

Ситуация: есть форум, в котором анонимусы могут писать в один из разделов - в основном связанном с техническими проблемами (оно и понятно - как можно написать о проблеме к примеру с авторизацией, если не можешь авторизоваться?), но также в этом разделе обсуждаются общие технические вопросы (доработки, предлагаемые пользователями, обсуждения того или иного функционала и т.д.). И вот тут начинается хитрая засада: раз анонимусы могут оставлять сообщения в этом разделе, то и для спамеров этот раздел полностью открыт. Естественно, автоодобрение сообщений от анонимусов в пресловутом разделе отключено, но... Подписка! Если пользователи подписываются на технические темы (а таких, несмотря на вялые отзывы, оказывается немало), то и рассылку от спамеров они получают, поскольку отправку сообщений производит файл post.php, НЕ производя дополнительных проверок! А потом сисадмин долго чешет репу и бьет бубен, почему домен у некоторых почтовиков в черном списке. В то время как решение есть вполне простое...

Итак, берем файл modules/newbb_plus/post.php и правим его: заменяем фрагмент
PHP код:
//# Alert to all about new post START
        
if ($topic_id)
        {
            
$sql "SELECT usernotif_id FROM ".$bbTable['topics_mail']." WHERE topic_id = $topic_id";
            
$result $db->query($sql); 
на
PHP код:
//# Alert to all about new post START
        
if ($topic_id)
        {
            
$sql "SELECT usernotif_id FROM ".$bbTable['topics_mail']." WHERE topic_id = $topic_id";
            if (!isset(
$xoopsUser)) $sql .= " AND usernotif_id IN (Select uid From ".RC_GRP_USERS_LINK_TBL." Where groupid=1 Union SELECT user_id FROM ".$bbTable['forum_mods']." WHERE forum_id = ".$forum.")";
            
$result $db->query($sql); 
Все! Уведомления о любых сообщениях от анонимусов пойдут на мыло только администраторов и модераторов, которые и будут принимать решение: одобрить сообщение (если оно от полезных пользователей) или удалить (если это спам). Конечно, в текущей реализации подписанные пользователи не увидят уведомление об одобренном сообщении анонимуса, но это ИМХО меньшее из зол, да и дальнейшей доработке напильничком вполне себе подлежит


Не ошибается только тот, кто ничего не делает. Ковчег построил любитель. Профессионалы строили Титаник.
  Сообщения: 777 c 22.09.2008 | Репутация: 92
iltmpz вне форума iltmpz
Младший участник


| Цитировать Старый #228 07-03-2014, 16:32

Цитата:
Сообщение от ZlydenGL Посмотреть сообщение
Ситуация: есть форум, в котором анонимусы могут писать в один из разделов - в основном связанном с техническими проблемами
Я пошел другим путем: поскольку админ я ленивый, то одобрением мне заниматься неохота. Поэтому автоодобрение у меня включено, а проблему спамеров я решил по-другому:
тот же файл: файл modules/newbb_plus/post.php
PHP код:
else if ( empty($_POST['message']) )
{
redirect_header("javascript:history.go(-1)"2_MD_ERRORMESSAGE);
exit();
}
else {
$sql "SELECT * FROM ".$bbTable['forums']." WHERE forum_id = ".$_POST['forum']."";
if (!
$result $db->query($sql)) {
redirect_header("index.php"2_MD_CANTGETFORUM);
exit();
}
$forumdata $db->fetch_array($result);
$permissions = new Permissions($forumdata['forum_id']);
$user_noguest = ($xoopsUser) ? $xoopsUser->getvar('uid') : 0// added by il
if(!$user_noguest && ( preg_match("#http://#",$_POST['message']) || preg_match("#https://#",$_POST['message']))) // added by il
{
redirect_header("viewforum.php?order=".$_POST['order']."&viewmode=".$_POST['viewmode']."&forum=".$_POST['forum']."",2,_MD_NORIGHTTOPOST);
exit();

// added by il - это добавленные мной строчки.
Смысл в том, что 99,9% спамеры постят на форум ссылки. И 99,9%, реальный гость постить ссылку не будет. Если же сильно надо, то он всегда ее изменит, чтобы она не выглядела как ссылка.

Вот при отправке сообщения я проверяю, содержит ли отправляемый анонимусом текст ссылку и если да, то возвращает ошибку о запрете сообщений для гостей.

Все. После этого спам пропал весь. Ни капчей, ни чего другого не надо.
2 раза за месяца постили какие-то бессмысленные буквы - просто удалил вручную.

  Сообщения: 50 c 02.08.2010 | Репутация: 14
iltmpz вне форума iltmpz
Младший участник


| Цитировать Старый #229 07-03-2014, 16:43

Созрел вопрос по newbb_plus:
У меня версия 0.81, но админка не изменилась.
В общем, мой окончательно умерший-было форум внезапно оживился, и появилась необходимость в разделении тем, переносе сообщений из темы в тему и т.п.
Есть ли такой функционал где-нибудь? Посмотрел в базу - операции элементарные: поправить поля: pid topic_id forum_id в таблице _bbplus_posts для этого сообщения и pid для следующего сообщения.
Но писать это самому неохота - вдруг уже есть готовый скриптик?

  Сообщения: 50 c 02.08.2010 | Репутация: 14
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Рейтинг@Mail.ru Хостинг провайдер Majordomo. Powered by: vBulletin Version 3.0
Copyright ©2000-2018, Jelsoft Enterprises Ltd.
Все разделы прочитаны - Руководство форума - Архив - Вверх
Rambler's Top100
Output: 114.09 Kb. compressed to 106.68 Kb. by saving 7.41 Kb. (6.49%)
Page generated in 0.10143 seconds with 11 queries