Не знаю, за полгода в своей 3.0.11 столько гранита сгрыз, что очень не хочется переходить на 3.1 с моим-то стилем и модами. Это ж ещё на полгода хлопот, мама дорогая...
В общем, поправил message_parser. Для тех, кому интересно, пишу.
В message_parser.php вставляем вот эту функцию:
Код: Выделить всё
function MoveTagField($instr)
{
$tagline = '';
$res = $instr;
$tagfieldin = '[tag]';
$tagfieldout = '[/tag]';
$posin = stripos($instr, $tagfieldin);
$posout = strripos($instr, $tagfieldout);
if ($posin === false or $posout === false) {
// Ни фига не нашёл.
} else {
$posout = $posout + strlen($tagfieldout);
$tagline = "[tagfield]" . substr($instr, $posin, $posout) . "[/tagfield]";
$othertext = substr_replace($res, "", $posin, $posout);
if (substr($othertext, 1, 1) != "\n") {
$othertext = "\n" . $othertext;
}
$res = $tagline . $othertext;
}
return $res;
}
Куда-нибудь перед
Код: Выделить всё
/**
* Main message parser for posting, pm, etc. takes raw message
* and parses it for attachments, bbcode and smilies
* @package phpBB3
*/
А вот это:
Код: Выделить всё
$this->message = MoveTagField($this->message);
Вставляем перед вот таким условием:
Код: Выделить всё
if ($submit && in_array($mode, array('post', 'reply', 'quote', 'edit')) && $upload_file)
Итог - при любом редактировании, добавлении, цитате будет вызываться функция MoveTagField, которая ищет первый и ББ код [tag], вырезает это дело из тела сообщения, обрамляет в [tagfield][/tagfield] и переносит в начало поста. Красиво получается. Есть, правда, недостаток, который устраню позже - при очередном добавлении новых тегов получается каша. Но это легко устранимо, в принципе. Передохну и позже сделаю.
Добавлено спустя 1 час 55 минут:
Пришлось использовать регулярки. Родился новый, усовершенствованный, вариант. Функцию MoveTagField выкидываем, вместо неё вставляем это:
Код: Выделить всё
function MakeTagArray(&$instr)
{
preg_match_all('!\[tag\](.*?)\[/tag\]!s', $instr, $matches);
$instr = preg_replace('!\[tag\](.*?)\[/tag\]!s', "", $instr);
$instr = str_ireplace(array('[tagfield]', '[/tagfield]'), array("", ""), $instr);
sort($matches[1]);
return $matches[1];
}
function RebuildTagField(&$instr)
{
$res = '';
$arr = array();
$arr = MakeTagArray($instr);
if (count($arr) > 0)
{
$res = '[tagfield]';
foreach ($arr as $tag)
{
$res = $res . '[tag]' . $tag . '[/tag]';
}
$res = $res . '[/tagfield]' . "\n";
}
$instr = $res . $instr;
}
Вместо
$this->message = MoveTagField($this->message);
Это
Теперь, где бы не были расположены теги в теле сообщения, они собираются в кучу и расставляются в начале сообщения в алфавитном порядке. Всё, что между tagfield, вырезается. Вроде даже работает. Вот только php слабо знаю, наверное, накосячил где-либо. Проверите, кто знает? И две подряд регулярки мне что-то не нравятся.