yura3d |
Отправлено: 16 августа 2009 — 21:37 • Тема: Дополнение: Выводим опрос на главную форума • Форум: Модификации и дополнения |
Ответов: 38 Просмотров: 33497
 |
Borman
С этим модом есть 2 нюанса, о которых нужно упомянуть:
- В некоторых темах после установки мода могут пропасть опросы, созданные методом добавления опроса в существующую тему. Этот баг связан с ошибкой в моде добавления опроса в существующую тему. Данный мод эту ошибку устраняет, но чтобы видеть опросы вновь, в админке в списке форумов напротив раздела, в котором есть темы с пропавшими опросами, нужно выбрать пункт Восстановить темы. Опросы можно также восстанавливать конкретно в какой-либо теме, выбрав пункт Восстановить тему в опциях темы. Разумеется, все результаты голосований будут полностью сохранены
- После переноса темы с опросом, который вынесен на главную страницу, в другой раздел, опрос снимается с главной страницы (разумеется, без потери результатов голосования). Для вынесения его на главную страницу снова необходимо вновь выбрать пункт Вынести опрос на главную страницу в опциях темы. В будущем данный недочёт будет устранён
|
yura3d |
Отправлено: 16 августа 2009 — 21:06 • Тема: Дополнение: Выводим опрос на главную форума • Форум: Модификации и дополнения |
Ответов: 38 Просмотров: 33497
 |
Borman пишет:Установил, но при попытке установить выдал это
Проверьте ещё раз правильность изменений файла postings.php, в частности, этот этап:
Спойлер (Отобразить)Затем в этом же файле находим строку:
CODE:function poll_edit() {
И над ней размещаем строки:
CODE:// Main Page Poll Mod by yura3d (http://www.exbb.org/)
function mainpoll() {
global $fm;
$fm->_Intvals(array('forum', 'topic', 'postkey'));
$fm->_GetModerators($fm->input['forum'], $fm->_Read(FM_ALLFORUMS));
if ($fm->_Moderator !== TRUE)
die;
$mainpoll = $fm->_Read2Write($fp_mainpoll, FM_MAINPOLL);
if ($mainpoll && $mainpoll[0] == $fm->input['forum'] && $mainpoll[1] == $fm->input['topic'])
$mainpoll = array();
else
if (file_exists('forum'.$fm->input['forum'].'/'.$fm->input['topic'].'-poll.php'))
$mainpoll = array($fm->input['forum'], $fm->input['topic']);
else
$fm->_Message($fm->LANG['MainPoll'], $fm->LANG['PollNotFound']);
$fm->_Write($fp_mainpoll, $mainpoll);
$fm->_Message($fm->LANG['MainPoll'], ($mainpoll) ? $fm->LANG['MainPollOk'] : $fm->LANG['MainPollNo'],
'topic.php?forum='.$fm->input['forum'].'&topic='.$fm->input['topic'].
(($fm->input['postkey']) ? '&postid='.$fm->input['postkey'].'#'.$fm->input['postkey'] : ''));
} |
yura3d |
Отправлено: 16 августа 2009 — 19:59 • Тема: Руководство: Добавление собственных бб-кодов • Форум: Модификации и дополнения |
Ответов: 203 Просмотров: 170220
 |
electron пишет:CODE:<right>{$fm->LANG['bbYourText']}</right>
Тега <right>, в отличие от <center>, не существует. Вместо этого создаётся слой с выравниванием содержимого по правому краю:
CODE:<div align="right">{$fm->LANG['bbYourText']}</div> |
yura3d |
Отправлено: 16 августа 2009 — 19:54 • Тема: Дополнение: Выводим опрос на главную форума • Форум: Модификации и дополнения |
Ответов: 38 Просмотров: 33497
 |
Borman пишет:Опросник на главной форума!?
Честно говоря, возможность достаточно специфическая и не думаю что многим пригодится. Опросы на форумах обычно сопроваждаются полемикой и дискуссиями в соответствующих темах, где, собственно, эти опросы и размещаются. Ведь очень часто бывает, что предложенных вариантов недостаточно или человек хочет проголосовать за несколько вариантов, ровно как и высказать свою точку зрения в теме опроса
Borman пишет:А может сделать возможность вывода нужного опроса из какой либо темы на главную, добавив в скрипте "создания опроса" строку "вывести на главную страницу" и установив галочку. Причем опрос должен быть только один, т.е. если попытаться вывести больше, то выводится только последний последний а предыдущие возвращаются в свои темы.
А вот этот вариант мне уже нравится больше. Только слегка его подкорректируем, в итоге получив такие возможности:
- На главную страницу форума можно вынести один опрос из любой темы форума
- Вынесенный на главную страницу опрос продолжает размещаться в своей теме (для наглядности)
- Рядом с вынесенным на главную страницу опросом размещается ссылка на тему опроса (на случай, если голосующий захочет продолжить обсуждение вопроса)
Реализация описанных возможностей (Отобразить)Вот набросал минут за 15
Открываем файл include/common.php, находим строку:
CODE:define("FM_SEARCH_EXC", "data/search_exc.php");
И после неё размещаем строку:
CODE:define("FM_MAINPOLL", "data/mainpoll.php");
Теперь открываем файл index.php, находим строку:
CODE:$allforums = array_filter($fm->_Read(FM_ALLFORUMS),"Filter_Cat");
После неё добавляем строки:
CODE:// Main Page Poll Mod by yura3d (http://www.exbb.org/)
$poll_html = (($mainpoll = $fm->_Read(FM_MAINPOLL)) && $mainpoll) ? poll($mainpoll[0], $mainpoll[1]) : '';
Далее в этом же файле находим строки:
CODE: $todayvisit = sprintf($fm->LANG['TodayVisit'], $today['guests'] + $members + $hiddens, $today['guests'], $members,
($hiddens) ? sprintf($fm->LANG['HiddensOnline'], $hiddens) : '', ($was) ? '<br>'.implode(', ', $was) : '');
}
После них добавляем строки:
CODE:// Main Page Poll Mod by yura3d (http://www.exbb.org/)
function poll($forum_id,$topic_id) {
global $fm, $allforums;
$pollfile = 'forum'.$forum_id.'/'.$topic_id.'-poll.php';
if (!file_exists($pollfile)) return '';
$topic = reset($fm->_Read('forum'.$forum_id.'/'.$topic_id.'-thd.php'));
$fm->_GetModerators($forum_id, $allforums);
$_icon['divider'] = ($fm->exbb['text_menu'] === TRUE) ? ' : ' : '';
$_icon['edit'] = ($fm->exbb['text_menu'] === TRUE) ? $fm->LANG['IconEdit'] : '<img src="./templates/'.DEF_SKIN.'/im/'.DEF_LANG.'/edit.gif" title='.$fm->LANG['IconEdit'].' alt='.$fm->LANG['IconEdit'].' border="0">';
$_icon['del'] = ($fm->exbb['text_menu'] === TRUE) ? $fm->LANG['IconDel'] : '<img src="./templates/'.DEF_SKIN.'/im/'.DEF_LANG.'/delete.gif" border="0">';
$poll_data = $fm->_Read($pollfile,FALSE);
if (!$poll_data['pollname']) $poll_data['pollname'] = $topic['name'];
$poll_title = $poll_data['pollname'];
$moderlinks = $pollch = $do = '';
if ($fm->user['id'] ===0)
$pollch = '<tr><td>'.$fm->LANG['PollNeedLogin'].'</td></tr>';
elseif (isset($poll_data['ids'][$fm->user['id']]) || $topic['state'] == 'closed') {
foreach ($poll_data['choices'] as $choice) {
$pid = $choice[0];
$ptext = $choice[1];
$votes = $choice[2];
if (!$ptext) continue;
$percent = ($votes == 0) ? 0 : $votes / $poll_data['votes'] * 100;
$percent = sprintf( '%.2f' , $percent ).'%';
$width = ($percent > 0) ? (int) $percent * 2 : 0;
include('./templates/'.DEF_SKIN.'/poll_data.tpl');
}
$do = '<b>'.$fm->LANG['VoteCount'].$poll_data['votes'].'</b>';
} else {
foreach ($poll_data['choices'] as $choice) {
$pid = $choice[0];
$ptext = $choice[1];
if (!$ptext) continue;
include('./templates/'.DEF_SKIN.'/poll_view.tpl');
}
$do = '<input type="submit" name="submit" value="'.$fm->LANG['Vote'].'" class="button" />';
}
$edit = '<a href="postings.php?action=poll&forum='.$forum_id.'&topic='.$topic_id.'">'.$_icon['edit'].'</a>'.$_icon['divider'];
$del = '<a href="postings.php?action=poll&delpoll=yes&savepoll=yes&forum='.$forum_id.'&topic='.$topic_id.'">'.$_icon['del'].'</a>';
$moderlinks = ($fm->_Moderator === TRUE) ? '<a href="postings.php?action=mainpoll&forum='.$forum_id.'&topic='.$topic_id.'">'.$fm->LANG['MainPagePollOff'].'</a> '.$edit.' '.$del : null;
include('./templates/'.DEF_SKIN.'/poll.tpl');
unset($poll_data,$pollch);
return '<br />'.$poll_html.'<center>'.$fm->LANG['MainPagePollTopic'].' <a href="topic.php?forum='.$forum_id.'&topic='.$topic_id.'">'.$topic['name'].'</a></center>';
}
Далее открываем файл topic.php, находим строку:
CODE:$topic['poll'] = (isset($topic['poll'])) ? TRUE : FALSE;
И заменяем её строкой:
CODE:$topic['poll'] = (isset($topic['poll'])) ? $topic['poll'] : FALSE;
Затем в этом же файле находим строку:
CODE:if ($topic['poll']) $poll_html = poll($forum_id,$topic_id);
И после неё размещаем строку:
CODE: else $poll_html = '';
Далее в этом же файле находим строку:
CODE:$pin = ($topic['pinned'] === TRUE) ? '<option value="unpin">'.$fm->LANG['UnPin'].'</option>' : '<option value="pin">'.$fm->LANG['Pin'].'</option>';
И после неё размещаем строки:
CODE:// Main Page Poll Mod by yura3d (http://www.exbb.org/)
$mainpoll = $fm->_Read(FM_MAINPOLL);
$mainpoll_html = ($topic['poll']) ? '<option value="mainpoll">'.(($mainpoll && $mainpoll[0] == $forum_id && $mainpoll[1] == $topic_id) ? $fm->LANG['MainPagePollOff'] : $fm->LANG['MainPagePollSet']).'</option>' : '';
Теперь открываем файл postings.php, находим строки:
CODE:case 'addpoll' : addpoll();
break;
И после них размещаем строки:
CODE:case 'mainpoll': mainpoll();
break;
Далее в этом же файле находим строку:
CODE:$fm->_Message($fm->LANG['AdditionPoll'], $fm->LANG['PollAdded'], 'topic.php?forum='.$forum_id.'&topic='.$topic_id);
И над ней размещаем строки:
CODE:$list = $fm->_Read2Write($fp_list, 'forum'.$forum_id.'/list.php');
$list[$topic_id]['poll'] = TRUE;
$fm->_Write($fp_list, $list);
Затем в этом же файле находим строку:
CODE:function poll_edit() {
И над ней размещаем строки:
CODE:// Main Page Poll Mod by yura3d (http://www.exbb.org/)
function mainpoll() {
global $fm;
$fm->_Intvals(array('forum', 'topic', 'postkey'));
$fm->_GetModerators($fm->input['forum'], $fm->_Read(FM_ALLFORUMS));
if ($fm->_Moderator !== TRUE)
die;
$mainpoll = $fm->_Read2Write($fp_mainpoll, FM_MAINPOLL);
if ($mainpoll && $mainpoll[0] == $fm->input['forum'] && $mainpoll[1] == $fm->input['topic'])
$mainpoll = array();
else
if (file_exists('forum'.$fm->input['forum'].'/'.$fm->input['topic'].'-poll.php'))
$mainpoll = array($fm->input['forum'], $fm->input['topic']);
else
$fm->_Message($fm->LANG['MainPoll'], $fm->LANG['PollNotFound']);
$fm->_Write($fp_mainpoll, $mainpoll);
$fm->_Message($fm->LANG['MainPoll'], ($mainpoll) ? $fm->LANG['MainPollOk'] : $fm->LANG['MainPollNo'],
'topic.php?forum='.$fm->input['forum'].'&topic='.$fm->input['topic'].
(($fm->input['postkey']) ? '&postid='.$fm->input['postkey'].'#'.$fm->input['postkey'] : ''));
}
Далее открываем файл language/russian/lang_front_forums.php и находим строку:
CODE:$this->LANG['TopRestore'] = 'Восстановить тему';
И после неё размещаем строки:
CODE:$this->LANG['MainPagePollSet'] = 'Вынести опрос на главную страницу';
$this->LANG['MainPagePollOff'] = 'Убрать опрос с главной страницы';
Затем в этом же файле ищем строки:
CODE:$this->LANG['DeleteTopicOk'] = 'Тема успешно удалена!';
И после неё размещаем строки:
CODE:
/*
main page poll
*/
$this->LANG['MainPoll'] = 'Опрос на главной странице';
$this->LANG['MainPollOk'] = 'Опрос успешно вынесен на главную страницу';
$this->LANG['MainPollNo'] = 'Опрос успешно убран с главной страницы';
$this->LANG['PollNotFound'] = 'Опрос не найден';
Теперь открываем файл language/russian/lang_front_all.php, находим строки:
CODE:$this->LANG['YOUSEARCH'] = '<br>Вы искали "<b>%s</b>"<br>Красным выделены короткие слова, исключенные из поиска<br>';
И после них размещаем строки:
CODE:
/*
main page poll
*/
$this->LANG['Vote'] = 'Проголосовать';
$this->LANG['VoteCount'] = 'Всего проголосовало: ';
$this->LANG['Poll'] = 'Опрос';
$this->LANG['PollNeedLogin'] = 'Для голосования и просмотра результатов опроса войдите или зарегистрируйтесь';
$this->LANG['IconEdit'] = 'Правка';
$this->LANG['IconDel'] = 'Удалить';
$this->LANG['MainPagePollOff'] = 'Убрать опрос с главной страницы';
$this->LANG['MainPagePollTopic'] = 'Основная тема опроса:';
Далее открываем файл templates/ваш_скин/board_body.tpl, находим строки:
И над ней вставляем строку:
И, наконец, открываем файл templates/ваш_скин/topic_options.php, находим строку:
CODE:<option value="restore">{$fm->LANG['TopRestore']}</option>
И заменяем её строкой:
CODE:<option value="restore">{$fm->LANG['TopRestore']}</option>{$mainpoll_html}
Ну вот и всё.  Надеюсь, все изменения описал и ничего не забыл. После установки данного мода в опциях модератора появится пункт Вынести опрос на главную страницу. Выносить опросы могут только администраторы, супермодераторы и модераторы раздела, в котором находится тема с опросом |
yura3d |
Отправлено: 16 августа 2009 — 17:43 • Тема: Руководство: Добавление собственных бб-кодов • Форум: Модификации и дополнения |
Ответов: 203 Просмотров: 170220
 |
electron пишет:я так понимаю, если взять за основу инструкцию бб-кода "по правому краю" и все right сменить на left , то получится "инструкция по установке бб-кода выравнивания текста по левому краю". хотя смысла в "левой" кнопке наверно нету, тут и так по умолчанию текст налево ровняется.
Ход мыслей верный, хотя, учитывая что текст выравнивается по левому краю изначально, смысла в данном бб-коде нет
electron пишет:Юра, после этого форум падает в белый экран, убираешь строку - работает нормально
Да, там действительно есть ошибка. Правильный вариант этой строки:
CODE:"<div align=\"right\">$1</div>", |
yura3d |
Отправлено: 16 августа 2009 — 13:28 • Тема: Руководство: Добавление собственных бб-кодов • Форум: Модификации и дополнения |
Ответов: 203 Просмотров: 170220
 |
В продолжении этой и этой тем решил предложить реализацию ещё некоторых полезных бб-кодов
Выравнивание текста по центру (Отобразить)Скрытый текст:Для просмотра Вам необходимо авторизоваться и оставить не менее 20 сообщений
Выравнивание текста по правому краю (Отобразить)Скрытый текст:Для просмотра Вам необходимо авторизоваться и оставить не менее 20 сообщений
Этот список будет постоянно дополняться, следите за обновлениями  |
yura3d |
Отправлено: 16 августа 2009 — 12:38 • Тема: Простое расширение ExBBCodes • Форум: Обсуждаем |
Ответов: 8 Просмотров: 8237
 |
1Bot пишет:1Bot пишет:Может реализовать обработку ExBB кодов отдельным класом?
Не нужно будет писать моды для отдельных кодов и изменять проще наследованием при небольших правках
Нашелся целый самостоятельный проект xBB – скрипт PHP для BBCode
Цитата:Скрипт распространяется бесплатно по лицензии GNU GPL v 2. Согласно этой лицензии вы можете свободно использовать, распространять и менять этот скрипт при условии, что ваши собственные программные продукты, использующие этот скрипт, не будут распространяться, либо будут распространяться по той-же лицензии GNU GPL
Уже тестировал этот парсер. Производительность в некоторых случаях довольно низкая, некоторые страницы с сообщениями, в которых применяется многов бб-кодов, стали генерироваться по 0,5 - 1 с, хотя до этого генерация укладывалась в 0,02 - 0,1 с. Я уже говорил это в чате, повторюсь и сейчас, степень красоты PHP-кода обратно пропорциональна скорости его работы. Подобное справедливо и для многих других языков, но для интерпретируемых (коим и является PHP) особенно. Полный объём подкючаемых файлов этой библиотеки составляет ~110 Кб (не учитывая подсветки синтаксиса на базе geshi, в случае с geshi этот объём как минимум утрируется; для сравнения, всё ядро ExBB FM 1.0 RC1 занимает 78 Кб). Обработка каждого бб-кода вынесена в отдельные классы, разбитые по файлам, что с одной стороны удобно для добавления новых бб-кодов, с другой стороны на подключение этих файлов, выполнение наследования и инициализацию объекта родительского класса также тратиться некоторое время. Кстати, на форуме разработчика этой библиотеки производительность (причём, в сравнении с ExBB) обсуждалась: xBB vs ExBB bb
На мой взгляд, наилучшим решением будет сохранение текущего варианта обработки бб-кодов, а сложность его расширения можно компенсировать парсером модов, который встроен в RC2 (т.е. конечным пользователям не понадобится ковыряться в файлах для добавления новых тегов за счёт автоматизации установки модов) |
yura3d |
Отправлено: 14 августа 2009 — 10:22 • Тема: ExBB FM 1.0 RC1 • Форум: Релизы |
Ответов: 273 Просмотров: 257843
 |
electron пишет:пробовал разные бэкапы - картина та же.
RomAndry правильно говорит. Возможно, файл побился на этапе скачки/закачки по FTP
electron пишет:еще вопрос в догонку : какой адрес надо прописывать в boardinfo.php в случае размещения форума в локалке? примерно такой - Z:\home\test.ru\www\ ???
В параметре $this->exbb['boardurl'] файла data/boardinfo.php прописывается URL. Например, при размещении форума по адресу http://test1.ru/forum/ (возьмём пример из Денвера), именно этот адрес и должен быть прописан:
CODE:$this->exbb['boardurl'] = 'http://test1.ru/forum/';
Не забывайте прямой слеш (/) на конце адреса
Никаких путей к файлам на сервере типа C:\..., Z:\..., /home/... прописывать не нужно |
yura3d |
Отправлено: 13 августа 2009 — 21:08 • Тема: При использовании BB Code [code] удаляются начальные пробелы • Форум: Общие вопросы |
Ответов: 10 Просмотров: 8927
 |
1Bot пишет:А куда нужно внести исправления, чтобы отображало пробелы?
В файле include/fm.class.php находим строку:
CODE:$array[$key] = "<div class=\"block\"><b>CODE:</b><div class=\"htmlcode\">".$matches[1]."</div></div>";
И заменяем её строкой:
CODE:$array[$key] = "<div class=\"block\"><b>CODE:</b><div class=\"htmlcode\"><pre>".$matches[1]."</pre></div></div>";
Единственное, что несколько настораживает в варианте с <pre>, так это большое расстояние между строками в блоках [code][/code] (проявляется как в IE6, так и в Opera 9.52). Возможно, имеет место какой-то недочёт в стилях  |
yura3d |
Отправлено: 13 августа 2009 — 21:00 • Тема: NightExBB by DefenderYK • Форум: Темы оформления для ExBB FM 1.0 RC1 |
Ответов: 32 Просмотров: 33805
 |
buldozer-mapper пишет:Подскажите, что это и как решить?
В файле include/common.php найдите строки:
CODE:if (@$req_url[2] == @$set_url[2] && $req_url[1] != $set_url[1])
header('Location: http://'.$set_url[2].'/'.$req_url[3].(($_SERVER['QUERY_STRING'] ? '?'.$_SERVER['QUERY_STRING'] : '')));
И замените их строками:
CODE://if (@$req_url[2] == @$set_url[2] && $req_url[1] != $set_url[1])
//header('Location: http://'.$set_url[2].'/'.$req_url[3].(($_SERVER['QUERY_STRING'] ? '?'.$_SERVER['QUERY_STRING'] : ''))); |
yura3d |
Отправлено: 13 августа 2009 — 19:31 • Тема: Информер курсов валют и погода • Форум: PHP/Perl |
Ответов: 24 Просмотров: 21417
 |
Defenderyk пишет:Это возможно реализовать как-то?)
Возможно, для начала нужно выбрать сайт, откуда мы будем брать эти самые курсы (чаще всего это сайты банков). Далее пишется скрипт-парсер, который через определённые промежутки времени (допустим, раз в день) будет соединяться с выбранным сайтом и извлекать оттуда требуемую информацию, впоследствие информация сохраняется в отдельный файл на сервере и в дальнейшем для показа на Вашем сайте читается из него. Формат извлечения (парсинга) пишется под конкретный сайт, поэтому желательно с сайтом определится заранее
electron пишет:вот валялось давно на жестком диске, думал к сайту прикрутить. может пригодится
Вот наглядный пример скрипта-парсера. Единственный недостаток, соединение с банковским сайтом просходит при каждом запуске скрипта, а это уже чревато проблемами с производительностью. Также за частые одинаковые запросы с одного и того же IP администраторы банковского сайта могут забанить IP Вашего хостера, и тогда извлечение информации будет проблематичным |
yura3d |
Отправлено: 13 августа 2009 — 19:22 • Тема: При использовании BB Code [code] удаляются начальные пробелы • Форум: Общие вопросы |
Ответов: 10 Просмотров: 8927
 |
1Bot пишет:yura3d пишет:необходимо табуляцию и лишние пробелы заменять html-эквивалентами
может использовать html таг <pre>?
Можно и тег <pre>, это даже гораздо лучший вариант в плане простоты решения проблемы. Вот только нужно определиться, применять его только в блоках [code][/code], или в обычном тексте тоже? Я думаю второе излишне  |
yura3d |
Отправлено: 13 августа 2009 — 19:11 • Тема: При использовании BB Code [code] удаляются начальные пробелы • Форум: Общие вопросы |
Ответов: 10 Просмотров: 8927
 |
1Bot пишет:скорее всего где-то ошибка
Никакой ошибки нет, табуляция и лишние пробелы сохраняются и в последствие отдаются браузеру (см. исходный код страницы), другое дело, что браузеры обычно их игнорируют. Выход один, если необходимо сохранить оригинальный вид (с учётом табуляции и лишних пробелов), то необходимо табуляцию и лишние пробелы заменять html-эквивалентами |
yura3d |
Отправлено: 13 августа 2009 — 19:03 • Тема: Переезд к другому хостеру! • Форум: Хостинг |
Ответов: 20 Просмотров: 20387
 |
Borman пишет:Вроде как сегодня весь день ремонтировали, они признали что это у них проблемы.
Ну ещё бы, read-only file system не от лёгкой жизни. Я, признаться, только раз сталкивался с подобным в далёком 2004 году на бесплатном забугорном хостинге, когда вирус поразил некоторые сервера хостера, и они всё это чистили несколько дней, судя по их отпискам на e-mail. А заблокировать доступ на запись - самый простой (и, пожалуй, наиболее эффективный) способ избежать дальнейшего распространения заразы или продолжения атаки
Очень плохо, в движке не так давно были найдены ошибки с множественным доступом к некоторым файлам, которые проявлялись при попытке перемещения сообщений из одной темы в другую, в результате чего срабатывала защита от обнуления, приводящая к полной блокировке этих файлов (форум в итоге намертво подвисал, что лечилось только перезагрузкой сервера). Исправляющее обновление вышло практически сразу же. Рекомендую немедленно установить обновление, сейчас ссылку на тему с критическими обновлениями вынес на главную вместе с датой выхода последнего обновления, чтобы выходящие обновления были сразу видны |
|