• XSS.stack #1 – первый литературный журнал от юзеров форума

Изменение внешнего вида форума

Статус
Закрыто для дальнейших ответов.

Quake3

TPU unit
Забанен
Регистрация
03.11.2010
Сообщения
4 529
Решения
4
Реакции
5 305
Депозит
0.046
Пожалуйста, обратите внимание, что пользователь заблокирован
Это не статья, а что-то типа мини-заметки. Бывает ситуация, когда какой-то контент на каком-то сайте хочется убрать/изменить. Для простой ерунды вида рекламных баннеров существует adblock, но для более сложных случаев он не подойдет. Здесь поможет язык javascript, который имеет полный доступ к контенту в браузере, и может его модифицировать как угодно - удалять/изменять/добавлять нужные вам элементы.

Возьмем простой пример. При нажатии на ссылку "новые сообщения" на этом форуме выводится список непрочитанных тем. Лично меня не интересует всевозможный скамерц, и я бы не хотел видеть эти темы в выдаче. Для этого пишу скрипт:

Код:
//получаем все ячейки таблицы из столбца "Форум"
var table = document.getElementsByClassName("forumdesc");
for (var i=0; i < table.length; i++)
	{
	var title = table[i].firstChild.title.toLowerCase(); //получаем собственно имя форума
	if (title.indexOf("услуг") != -1 || title.indexOf("продаж") != -1)
  { //если одно из слов встречается в имени форума
  var tr = (table[i].parentNode).parentNode //получаем ссылку на строку таблицы
  tr.style.display = "none"; //скрываем нафиг всю строку
  }
	}
Для того, чтобы этот скрипт выполнялся при поиске новых тем, нужно установить расширение для браузера. Для firefox это Greasemonkey, для хрома - Tampermonkey, а для других браузеров ищите аналоги в гугле. Как устанавливать эти расширения и добавлять туда новые скрипты, я думаю, объяснять нет смысла. Приведу пример итогового скрипта для этих расширений:

Код:
// ==UserScript==
// @name        dlab
// @namespace   test
// @description dlab remover
// @include     *xss.pro/*
// @version     1
// @grant       none
// ==/UserScript==
/*alert('debug'); */
var table = document.getElementsByClassName("forumdesc");
for (var i=0; i < table.length; i++)
	{
	var title = table[i].firstChild.title.toLowerCase();
	if (title.indexOf("услуг") != -1 || title.indexOf("продаж") != -1)
  {
  var tr = (table[i].parentNode).parentNode
  tr.style.display = "none";
  }
	}

Параметры скрипта не суть важны, кому интересно, может почитать в справке. Единственное, на что стоит обратить внимание - это параметр @include, т.е. собственно на каких страницах должен срабатывать скрипт.
Javascript дает возможность управлять страницей как угодно, можно, например, выделять темы из интересующих вас форумов другим цветом, или подсвечивать темы от определенного автора. Можно усовершенствовать вышеприведенный скрипт, чтобы он показывал, сколько тем скрыл, и добавить кнопку которая будет открывать скрытые разделы. Можно, в конце концов, сортировать таблицу по именам разделов. Возможностей множество, все зависит от ваших желаний и знаний.

Я не гуру js, возможнго код выше кривой/медленный и так далее. Любую критику по коду или по идеи в целом пишите в теме.
 
Хотелось бы чтобы такая опция все таки была на уровне форума, и об этом говорилось уже не раз к тому же. Спасибо квак за инфу)
 
Ar3s, Я к сожалению не вэб кодер.
А кодес, что привел квак внедрить в сорц не вариант?
 
Не вариант. Ибо он работает на уровне браузера, что для cms не логично. Удобнее делать выборку из БД на уровне форумного движка, что разумнее.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
В теории, написать такое на уровне сервера несложно. Как я предполагаю, выборка новых сообщений происходит примерно так. Каждому разделу в базе данных отвечает какая-то цифра - ее можно узнать из ссылки на раздел, т.е. https://xss.pro/index.php?board=53, вот 53 - тот самый id раздела. Когда пользователь входит на форум и жмет "показать новые сообщения", то идет выборка сообщений, которые были написаны после последнего визита пользователя. С условием выборки из определенных разделов, доступных этому пользователю. Т.е. что-то вида
Код:
SELECT * FROM `messages` WHERE `forum_id` IN ( 1,2, 3... все доступные юзеру разделы )
Соответственно, делаем список игнорируемых разделов (например 20,25 и 38), и тогда запрос преобразуется в
Код:
SELECT * FROM `messages` WHERE `forum_id` IN ( 1,2, 3... все доступные юзеру разделы ) AND NOT `forum_id`
IN ( 20,25 и другие игнорируемые)

Сложно это встроить в уже существующий форум, так как лично я не кодил никогда под IPB форум. В теории, могу сделать, если это кому-то реально нужно.
 
Статус
Закрыто для дальнейших ответов.
Верх