Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Я подумал, что проще всего завести "закрытый" раздел, доступный только определённой группе "авторов". Темы или посты из этого раздела будем превращать в странички со своими красивыми URL-ами. То есть рядовой пользователь не сможет добраться напрямую к такой теме, но как специальную отдельную страницу будет видеть.
Эти странички должны использовать общий механизм шаблонов форума и его парсер BBcode.
Преимущества:
Авторы могут вносить правки, исправлять ошибки и для этого не надо иметь отдельных скриптов. Всё делается существующими средствами
Если в пункт меню добавился пункт, если обновлённая версия форума что-то поменяла в расположении элементов и т.д. всё это автоматически применится и к "страничкам".
Свой .htaccess который будет перехватывать обращения к несуществующим страницам и отправлять их на нах обработчик:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} \.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+) page.php?alias=$1
все ненайденные странички будут обрабатываться page.php, адрес страницы будет в GET-параметре alias
Скрипт page.php который по адресу (алиасу) будет определять какой пост надо считать, затем текст сообщения обрамлять в шаблон и выводить.
(Код обработчика я приведу ниже)
Таблица пар алиас-адрес_реальной_страницы_viewtopic. Сюда можно добавить еще одну возможность: если адрес нацелен не на viewtopic, делать простой редирект.
CREATE TABLE `p_aliases` (
`alias` varchar(255) NOT NULL,
`link` varchar(255) NOT NULL,
`template` varchar(255) NOT NULL,
PRIMARY KEY (`alias`)
);
Префикс p_ замените на свой
Обратите внимание, в .htaccess я отлавливаю только адреса с расширением .html. Это сделано, чтобы скрипт-обработчик не делал лишнюю работу например когда браузер запрашивает иконку favicon.ico или каку-то опечатку с форумным адресом вроде viewtop.php?id=123. Вы можете изменить правило как захотите. Я себя ограничил алиасами *.html. Сам скрипт-обработчик способен переваривать любые адреса.
<?php
function not_found()
{
header('HTTP/1.0 404 Not Found');
exit('404 File not found');
}
$alias = isset($_GET['alias']) ? $_GET['alias'] : '';
if (empty($alias)) {
not_found();
}
define('PUN_ROOT', dirname(__FILE__).'/');
require PUN_ROOT.'include/common.php';
$alias = $db->escape($alias);
$result = $db->query("SELECT a.* FROM {$db_prefix}aliases AS a WHERE a.alias='{$alias}'");
$alias_data = $db->fetch_assoc($result);
if (empty($alias_data['link'])) {
not_found();
}
// Is post? Read it.
if (preg_match('#viewtopic\.php\?pid=(\d+)#', $alias_data['link'], $matches)) {
$pid = intval($matches[1]);
$result = $db->query("SELECT t.subject, p.* FROM {$db_prefix}posts AS p INNER JOIN {$db_prefix}topics AS t ON p.topic_id=t.id WHERE p.id={$pid}");
$post_data = $db->fetch_assoc($result);
// Is topic? Read it's first post.
} elseif (preg_match('#viewtopic\.php\?id=(\d+)#', $alias_data['link'], $matches)) {
$tid = intval($matches[1]);
$result = $db->query("SELECT t.subject, p.* FROM {$db_prefix}topics AS t INNER JOIN {$db_prefix}posts AS p ON t.first_post_id=p.id WHERE t.id={$tid}");
$post_data = $db->fetch_assoc($result);
// Otherwise just redirect to link.
} else {
header('Location: ' . $alias_data['link']);
exit;
}
if (empty($post_data['message'])) {
not_found();
}
require PUN_ROOT.'include/parser.php';
$self_url = $_SERVER['REQUEST_URI'];
$subject = pun_htmlspecialchars($post_data['subject']);
$message = parse_message($post_data['message'], $post_data['hide_smilies']);
$tpl_file = $alias_data['template'];
$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $subject);
define('PUN_ALLOW_INDEX', 1);
define('PUN_ACTIVE_PAGE', 'index');
require PUN_ROOT.'header.php';
?>
<div class="linkst">
<div class="inbox crumbsplus">
<ul class="crumbs">
<li><a href="<?php echo $self_url ?>"><strong><?php echo $subject ?></strong></a></li>
</ul>
<div class="clearer"></div>
</div>
</div>
<div class="box">
<div class="inbox">
<div class="postmsg">
<?php echo $message ?>
</div>
</div>
</div>
<?php
require PUN_ROOT.'footer.php';
Чтобы всё закрутилось, нам понадобится создать таблицу алиасов и ввести в нее хотябы одну пару для проверки. Можно это сделать в phpmyadmin или в любом другом менеджере БД. На своем тестовом серваке я ввел такую пару:
alias: about.html
link: http_://mysite.loc/forum/viewtopic.php?pid=1#p1
т.е. я просто скопировал URL первой тестовой записи, которая появляется после установки форума.
(адрес http_://mysite.loc/forum/about.html):
Обратите внимание на поле template в таблице и на строку
$tpl_file = $alias_data['template'];
в обработчике. Я оставил возможность задавать свой не-дефолтовый шаблон вывода. Чтобы это работало надо понадобится внести правку в файл header.php. Найдем там первое упоминание $tpl_file и добавим своё условие:
if (empty($tpl_file)) {
if (defined('PUN_ADMIN_CONSOLE'))
$tpl_file = 'admin.tpl';
else if (defined('PUN_HELP'))
$tpl_file = 'help.tpl';
else
$tpl_file = 'main.tpl';
}
Вот в целом портал готов! Не хватает только удобного плагина для прописывания пар алиас-страница. Чтобы не лазить в phpmyadmin. Это я напишу как-нибудь позже.
Раньше тема называлась "Портал от artoodetoo". P.S. Очень жаль, что (_image_shack_) скурвился и картинки потеряны.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Offline
Сделал плагин для добавления связок алиас->страница
Скачать с файлообменника: ссылка не актуальна — см. ниже
Таблицу придется создавать вручную, никакого инсталятора я не делал.
Прошу тестить!
Edited: залил версию посвежее с English + Russian языками. Инструкция только по английски. Нафиг вам инструкция, я всё уже описал в этой теме
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Немного усовершенствовал плагин, добавил создание таблицы связей в install и db_update.
Инсталятор добавляет в главное меню пункт About -- это "страничка из сообщения". Для таких страниц инсталятор создает отдельную доску с правами только у модераторов.
Еще фишка: шаблон 2col.tpl с левым сайдбаром. В include/user/sidebar.php вы можете поместить любой текст/код какой вам нужен.
Скачать дистрибутив с ссылка не актуальна — см. ниже
(обновлено 2011-06-11 15:56 MSK)
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Если надо сайдбар поместить справа, создаем копируем шаблон 2col.tpl в 2col-r.tpl.
В новом шаблоне меняем название класса "block2col" на "block2colr".
В стилях находим секцию Profile / Admin, добавляем туда новый класс с правой колонкой. Для примера Air.css:
.pun .block2col .blockmenu {
width: 13em;
float: left;
padding-bottom: 12px;
}
.pun .block2colr .blockmenu {
width: 13em;
float: right;
padding-bottom: 12px;
}
.pun .block2col .blockform, .pun .block2col .block {
margin-left: 15em;
}
.pun .block2colr .blockform, .pun .block2colr .block {
margin-right: 15em;
}
Теперь если в плагине указать для странички шаблон 2col-r.tpl, она будет иметь правую колонку.
Edited: в архив в предыдущем посте я поместил несколько шаблонов для двухколоночной верстки. Также добавил include/portal.php - здесь добыча инфы типа "посление сообщения" для сайдбара.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
@artoodetoo, а можешь немного более точно сформулировать целевую аудиторию? т.е. это те, для кого основное это именно форум, но так же важна возможность новости писать или файлы выкладывать как в на стандартных сайтах?
Offline
@Luca, да. для тех случаев когда форум это почти все, что нужно. но хочется чуть-чуть добавить
см. рабочий пример: http://nf74.ru/index.html
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
@artoodetoo, Спасибо за труд! почитаем=)
Offline
@artoodetoo, Можешь еще раз добавить "Полный дистрибутив с инсталятором" ?
Offline
Видимо дистрибутив надо уже с актуальной версией fluxbb? Ok, это займет некоторое время.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
я пока на 1.4.7
Offline
не повезло ))) у меня нет старого архива
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
но все равно буду благодарен и для нового,может решу перейти,начну пока допиливать )
Offline
@ artoodetoo: а есть дистрибутив 1.4.8 со уже встроенным порталом?
Offline
я вчера начал двигаться в этом направлении ))) подогнал перевод под 1.4.8. следующий шаг будет накатываение моих модов. в т.ч. портал
счастье есть!
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
не хочу показаться назойливым ) когда примерно можно ожидать появления сборки?
Offline
Готова новая версия Портала. Я создал ветку v1.4.8-with-mods, пока из модов и плагинов там только портальные расширения. Остальное накачу постепенно. Итак, ревизия 67 это
* актуальная версия 1.4.8
* русский перевод
* портал + генерация превью
идите по ссылке выше и находите внизу страницы ссылку Zip Archive - полный дистрибутив. Таблица pages включена в install и db_update. При установке форума с нуля ничего колдовать не надо.
Если у вас уже установлен 1.4.8, то db_update не поймет чего не хватает. Подсказываю трюк: зайдите через PMA в таблицу config и уменьшите номер ревизии базы, тогда db_update начнет работать.
полный список изменений rev.67 по сравнению с "русской сборкой"
Пришлось немного править стили. Старые стили а-ля Oxygen просто удалил чтобы не заморачиваться. Кому нужно это г* мамонта?
Что дальше — добавлю моды что были в сборке 1.4.5.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Проще всего страничку создать по ссылке в соощении
откроется страница плагина, где можно задать алиас и шаблон
сама страница тоже имеет полезные ссылки
Конечно ссылки присутствуют только если достаточно прав. Еще новшество: если страница сделана на базе темы форума, то каждое сообщение темы будет как страница статьи, (см. нижнюю картинку).
Права сейчас определяются просто: если плагин имеет имя AP_Pages.php, значит с ним могут работать только админы, если AMP_Pages.php, то админы и модераторы. Кому доступно, тот и видит нужные ссылки.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
up!
Я не понял! Нет, ну конечно fluxbb не так популярен, как WordPress, но чтобы вообще никакого фидбэка, это удручает.
Пробовали портал? Что понравилось, что нет, чего не хватает — пишите!
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Для портала пишу файловую свалку.
Интересует ваше мнение — что можно улучшить и как можно взломать предложенную схему.
Задача:
Отдавать файлы только имеющим право. Нет цели повторить rapidshare или типа того. Саму отдачу надо переложить на сервер, а не прокачивать через скрипт. То есть ссылки оформляю на скрипт в виде download.php?id=###, он проверяет права и если все ок, редиректит на "секретную ссылку" реальной отдачи. Решение должно быть переносимым, т.к. портал будет ставиться много куда и нельзя требовать слишком многого от хостинга.
Вариант с созданием симлинков отпадает, настройки в httpd.conf тоже. Должно работать на серверах Apache с mod_rewrite, в т.ч. и на Windows (например Денвер).
Рабочая идея:
Секретная ссылка содержит ключ доступа, соответствующий временному файлу-ключу. Временный файл создается скриптом download.php после проверки прав. Этот же скрипт будет удалять просроченные файлы-ключи. Сервер проверяет есть ли нужный ключевой файл и разрешает/не разрешает закачку.
Пусть файлы на отдачу хранятся в реальной папке /upload/, имена как FFFF.ext (имя уникальное синтетическое, ext - реальное расширение файла)
файлы-ключи лежат там же, имена как FFFF-AAAA.acs (расширение "acs" от "access"-доступ)
а секретная ссылка выглядит как
mysite.xx/download/FFFF-AAAA/File.ext
В корне сайта помещаем .htaccess
RewriteEngine on
# Allow access via secret link with access key
# 1.prefix 2.fileId 3.accessId 4.name 5.ext
RewriteCond %{REQUEST_URI} (.*)/download/([0-9a-f]+)-([0-9a-f]+)/(.*?)(\.[0-9a-z]*)?$
RewriteCond %{DOCUMENT_ROOT}%1/upload/%2-%3.acs -f
RewriteRule download/.* upload/%2%5 [L]
Второй RewriteCond проверяет существует ли файл-ключ.
в папке /upload/ будет свой .htaccess
#Deny from All
Options -Indexes
php_flag engine 0
Options -ExecCGI
<Files ~ ".(php*|phtml|pl|py|jsp|asp|htm*|shtml|sh|cgi)">
ForceType text/plain
</Files>
RewriteEngine on
RewriteCond %{THE_REQUEST} !^(GET|HEAD)\ ([^?]*)/download/
RewriteRule .* - [F,L]
К сожалению Deny from All я не могу включить, т.к. тогда вообще не получается качать из этой папки. Вместо этого я проверяю что ссылка на файл была "правильная", а не прямая. После первого .htaccess %{REQUEST_URI} содержит вместо /download/ уже /upload/, поэтому здесь я тестирую %{THE_REQUEST}, он по прежнему выглядит как "GET /download/FFFF-AAAA/File.ext HTTP..."
Ваши комментарии?
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Почему отпадает вариант с симлинками, ведь их поддерживают все современные ОС?
Offline
Половина компов в мире работает под Windows XP.
Симлинки на Windows только под NTFS, только начиная с Vista и в PHP-на-Windows поддерживаются начиная с v5.3.
а fluxbb совместим с PHP 4.4+
я встречал упоминания, что из-за возможности обхода openbase_dir на shared-хостингах запрещают symlink()
Этого достаточно чтобы рассматривать другие варианты кроме симлинков. Хотя они хороши для этой задачи, да.
На developer очень даже может встретиться XP. Или Win7 но с FAT-диском. Не могу же я дать средство и сказать "это будет работать, поверьте! хотя на вашем Денвере|XAMPP оно скорее всего заглючит". Поэтому вот так.
А как было бы прекрасно, если бы мы знали, что Apache работает за прокси nginx. Там можно просто вернуть правильный заголовок и будет отдаваться указанный файл уже средствами nginx — без лишних редиректов!
Лично для себя можно писать как угодно, настраивать сервер под задачу, но в public domain продуктах придется быть скромнее.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Портал просто огонь!! Автор подскажи пожалуйста можно ли на версии 1.5.2, воспользовавшись первым постом, поднять такой портал? Это прям то что я искал в течении трех месяцев.
Offline
можно. для этого существует эта тема - изучай и действуй.
пожалуйста не пиши мне в личку, если не собираешся заплатить денег.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline