- Код: Выделить всё
[list]
[*] Это
[*] сложный
[*] список
[*] Перечисление:
[list=1][*]Первое
[*]Второе
[*]Третье[/list]
[*]Пункты уехали влево
[*]Пункты уехали влево...
[*]Пункты уехали влево.......
[/list]
На практике это будет (до установки баг-фикса) выглядеть вот так:
________________________________________________________
Решение проблемы:
(в принципе я мог бы отправить это как ЛС гайдару, но так как проблема не в конкретном форуме, а вообще в phpBB, то думаю это будет интересно и другим (владельцам форумов) )
- Идём в папку /includes
- Открываем файл bbcode.php
- Прокручиваемся в конец - добавляем следующий код (2 функции):
- Код: Выделить всё
function bbcode_parse_list($posting, $uid)
{
global $list_type_stack;
global $list_uid;
$list_type_stack = array();
$list_uid = $uid;
$posting = preg_replace_callback('/\[(\*|\/list|list(|=([a1])))\]/i', "bbcode_list_parser_callback", $posting);
while(NULL!==($type_frame=array_pop(&$list_type_stack)))
{
$repl_mask = "[list{$type_frame[1]}:$uid]";
$posting = substr_replace($posting, "[list{$type_frame[1]}]", strrpos($posting,$repl_mask), strlen($repl_mask));
}
return $posting;
}
function bbcode_list_parser_callback($match_arr)
{
global $list_type_stack;
global $list_uid;
if($match_arr[1]=='*' && count($list_type_stack)>0)
{
return "[*:$list_uid]";
}
if(strtolower($match_arr[1])=='/list')
{
$last_type = array_pop(&$list_type_stack);
if($last_type==NULL)
{
// Лишний закрывающий тег, оставляем как есть
return $match_arr[0];
}
else
{
return "[/list:{$last_type[0]}:$list_uid]";
}
}
else
{
array_push(&$list_type_stack, array($match_arr[2]=='' ? 'u' : 'o', $match_arr[2]));
return "[{$match_arr[1]}:$list_uid]";
}
}
- Прокручиваемся выше - ищем следующий код:
- Код: Выделить всё
// [list] and [list=x] for (un)ordered lists.
// $open_tag[0]="[list]";
// unordered..
// $text = bbencode_first_pass_pda($text, $uid, $open_tag, "[/list]", "[/list:u]", false, 'replace_listitems');
echo $text;
$open_tag[0] = "[list=1]";
$open_tag[1] = "[list=a]";
// ordered.
$text = bbencode_first_pass_pda($text, $uid, $open_tag, "[/list]", "[/list:o]", false, 'replace_listitems');
- Удаляем его, или комментируем.
- Вместо удалённого (или после закомментированног) когда вставляем следующее:
- Код: Выделить всё
$text = bbcode_parse_list($text, $uid);
- Радуемся...
ЗЫ. Спасибо GSerg'у за найденый баг.