|
Показать HTML | Показать BBCode
BBCode для шахматистов
Увидел на одном из шахматных форумов тег [chess], выводящий шахматную доску с расставленными фигурами. Захотел реализовать этот тег в xBB. Оказалось несложно.
Самая большая сложность - найти хорошую шахматную ходилку на JavaScript. Нашел ее на rsdn.ru. Лицензия не указана. От автора: "Написал alpha-версию перемещалки шахматных фигур на JavaScript. Может кому сгодится". Очень сгодилась. Большое спасибо автору. Правда, найденный скрипт пришлось самую малость изменить под мою задачу. Надеюсь, что и мой труд кому-нибудь сгодится.
Раз есть ходилка, то дальше все просто.
Во-первых. Заливаем шахматную ходилку куда-нибудь на свой сайт. (Должна появиться папка chessJs)
Во-вторых. Пишем PHP-класс, ответственный за тег [chess]. Вот вариант для PHP 5:
<?php
// Класс для тега [chess]
class Xbb_My_Chess extends bbcode
{
public $behaviour = 'div';
private $_defaultFen = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1';
private static $_jsIsLoad = false;
private $_pathToJs = '/путь/от/главной/сайта/до/chessJs/';
function get_html($tree = null)
{
$fen = htmlspecialchars(trim(parent::get_html($tree)));
if (! $fen) {
$fen = $this->_defaultFen;
}
$html = '';
if (! self::$_jsIsLoad) {
self::$_jsIsLoad = true;
$html = '<script language="javascript" type="text/javascript" src="'
. $this->_pathToJs . 'chess.js"></script>'
. '<script language="javascript" type="text/javascript" src="'
. $this->_pathToJs . 'chessGui.js"></script>'
. '<script language="javascript" type="text/javascript">'
. 'config.pieceDir = "' . $this->_pathToJs . '" + config.pieceDir;'
. '</script>';
}
$rand = rand();
$formId = 'chessFormId' . $rand;
$divId = 'chessDivId' . $rand;
$undoId = 'chessUndoId' . $rand;
$html .= '<form name="' . $formId . '" id="' . $formId . '">'
. '<div align="center">'
. '<div id="' . $divId . '" style="width:328px"></div>'
. '<p><strong>BBCode:</strong> <font color="red">[chess]'
. '<span id="' . $divId . 'Span" style="color:green"></span>'
. '[/chess]</font></p>'
. '<input id="' . $undoId . '" type="button" value="Отменить ход"/>'
. '<input name="btnSetFen" type="button" value="Задать FEN" '
. 'onclick="SetFen(\'' . $divId . '\', \'' . $undoId . '\')" />'
. '</div>'
. '</form>'
. '<script language="javascript" type="text/javascript">'
. 'SetDiagram("' . $divId . '", "' . $fen . '", "' . $undoId . '");'
. '</script>';
return $html;
}
}
Вот вариант для PHP 4 (для несчастных, вынужденных с ним работать):
<?php
// Класс для тега [chess]
class Xbb_My_Chess extends bbcode
{
var $behaviour = 'div';
var $_defaultFen = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1';
var $_pathToJs = '/путь/от/главной/сайта/до/chessJs/';
function get_html($tree = null)
{
$fen = htmlspecialchars(trim(parent::get_html($tree)));
if (! $fen) {
$fen = $this->_defaultFen;
}
$html = '';
if (! isset($_GLOBALS['_XbbMyChessJsIsLoad']) || ! $_GLOBALS['_XbbMyChessJsIsLoad']) {
$_GLOBALS['_XbbMyChessJsIsLoad'] = true;
$html = '<script language="javascript" type="text/javascript" src="'
. $this->_pathToJs . 'chess.js"></script>'
. '<script language="javascript" type="text/javascript" src="'
. $this->_pathToJs . 'chessGui.js"></script>'
. '<script language="javascript" type="text/javascript">'
. 'config.pieceDir = "' . $this->_pathToJs . '" + config.pieceDir;'
. '</script>';
}
$rand = rand();
$formId = 'chessFormId' . $rand;
$divId = 'chessDivId' . $rand;
$undoId = 'chessUndoId' . $rand;
$html .= '<form name="' . $formId . '" id="' . $formId . '">'
. '<div align="center">'
. '<div id="' . $divId . '" style="width:328px"></div>'
. '<p><strong>BBCode:</strong> <font color="red">[chess]'
. '<span id="' . $divId . 'Span" style="color:green"></span>'
. '[/chess]</font></p>'
. '<input id="' . $undoId . '" type="button" value="Отменить ход"/>'
. '<input name="btnSetFen" type="button" value="Задать FEN" '
. 'onclick="SetFen(\'' . $divId . '\', \'' . $undoId . '\')" />'
. '</div>'
. '</form>'
. '<script language="javascript" type="text/javascript">'
. 'SetDiagram("' . $divId . '", "' . $fen . '", "' . $undoId . '");'
. '</script>';
return $html;
}
}
Не забудьте исправить строчку
$_pathToJs = '/путь/от/главной/сайта/до/chessJs/';
на реальный путь к chessJs.
В-третьих. Нужно сохранить этот класс в bbcode/Xbb/My/Chess.php с точностью до регистра.
В-четвертых. Откройте файл bbcode/config/tags.php. Найдите в нем строки
'center' => 'Xbb_Tags_Align' ,
'cite' => 'Xbb_Tags_Simple' ,
и замените их на
'center' => 'Xbb_Tags_Align' ,
'chess' => 'Xbb_My_Chess' ,
'cite' => 'Xbb_Tags_Simple' ,
Теперь все должно работать.
Как должно работать
Код [chess][/chess] выводит шахматную доску с расставленными фигурами:
Фигуры можно таскать по доске мышкой. Сходить неправильно - невозможно . Между тегами [chess][/chess] можно указать позиции шахматных фигур в нотации FEN. Пример:
[chess]rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1[/chess].
Этот код покажет такой расклад:
Очень удобно для шахматных турниров и их обсуждений на любом форуме.
Если хотите реализовать BBCode с тегом [chess] на своем сайте, то
- Скачайте с SF библиотеку xBB v0.29 для PHP 5 или для PHP 4.
- Скачайте архив со скриптами для создания тега
[chess]. Для PHP 5 или для PHP 4.
- Еще раз прочитайте эту статью и сделайте, как в ней написано. Удачи!
Дмитрий Скоробогатов
Последнее редактирование: 2010-03-10 11:27:10
Метки материала:
примеры bbcode, bbcode, bbcodes, бб-коды, bb-code, bb-код, bb-коды, тег, теги, tag, tags, теги bbcode, скрипт, php, php4, php5, компьютерные игры, js, javascript, скрипт bbcode, скрипт php, форум, script, xbb, класс, программирование
10 комментариев
Vitus
dima Вот вариант для PHP 4 (для несчастных, вынужденных с ним работать):
Ы!
Предыдущий текст по идее в оффтопе (когда такой тег реализуешь?)
А так... Что-то я по-моему пропустил сию шахматную приблуду. Щас сяду, буду смотреть и много думать
dima
Предыдущий текст по идее в оффтопе (когда такой тег реализуешь?)
Будет скоро. Но не люблю я его - читать мешает.
А про "шахматную приблуду" я и сам много думал, где заюзать. Может быть шахматный форум замутить?  Но это надо к шахматам интерес иметь, а меня мало прикалывает.
dima
Я не фрилансер. Заказов со стороны не беру. Советом помогу бесплатно.
У Вас форум на PHP-Fusion. Там свой парсер BBCode, к xBB отношения не имеющий. Там надо либо парсер целиком менять, либо к родному шахматы по мотивам этих прикручивать.
Первое трудоемко и нежелательно, - может осложнить вам обновление движка в будущем.
Второе - довольно несложная задача. Даете фрилансеру ссылку на эту страницу и говорите, что хотите видеть такое на своем форуме. За день сделает.
Гость kosmodrom
Я не знаю, кто такой "фрилансер", и где его найти.
dima
Фрилансер (от freelancer) — человек, выполняющий работу без заключения долговременного договора с работодателем, нанимаемый только для выполнения определённого перечня работ (внештатный работник).
Его можно найти на любом из следующих сайтов:
http://www.free-lance.ru/
http://www.free-lancers.net/
http://www.weblancer.net/
и т.п.
Гость ПерС
Спасибо за интересный скрипт.
Ошибка JS возникает только после превращения фигуры (появления окна "Select piece")
"Требуется объект", код, похоже, этот:
var position = div.position;
в chessGUI.js
Сам навскидку поправить не смог, написал сюда, вдруг подскажете?
dima
Найдите файл chessGui.js и откройте его для редактирования. Замените в нем 131-134 строки на следующее:
// var position = div.position;
// if (div.isPromotion) {
// return;
// }
if (! div || div.isPromotion) {
return;
}
var position = div.position;
Ошибка должна исчезнуть.
Гость ПерС
Большое спасибо
А я уже после того, как написал Вам, постваил перед "критической" строкой тупо
if (div==null) { return; } - тоже вроде помогло
dima
Вам тоже спасибо за тестирование и сообщение о найденной ошибке
Оставьте, пожалуйста, свой комментарий к публикации
|