Параметры search.php

Проблемы с установкой или работой phpBB 3.0.x? Получите помощь здесь!
С 1 января 2017 года phpBB Group прекращает поддержку phpBB версии 3.0.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.0 до 1 июля 2017 года.
Подробнее: Окончание поддержки phpBB 3.0.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
alaon
phpBB 1.4.3
Сообщения: 83
Стаж: 13 лет 2 месяца
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Параметры search.php

Сообщение alaon »

Здравствуйте. Есть такой вопрос. Я у себя на форуме сделал подобие системы меток Джумлы - специальные ББ-коды, две штуки, которые доступны админам и позволяют протегать статью-гайд-голосование, в первом сообщении темы. А чтобы по нажатию на тег можно было искать темы с похожими тегами, я передал всё это дело в search.php. Для большей наглядности приведу мои ББ-коды:

Код: Выделить всё

[tagfield]{TEXT}[/tagfield]

Код: Выделить всё

<table align="left" cellpadding="1" cellspacing="1" style="border: none;">
	<tbody>
		<tr>
			<td>{TEXT}</td>
		</tr>
	</tbody>
</table>
<!-- style="border-color:#212121; border: 1px dashed; width:99%;" -->
<br />

Код: Выделить всё

[tag]{INTTEXT}[/tag]

Код: Выделить всё

<a class="taglink" href="search.php?keywords=&bull;{INTTEXT}&terms=all&author=&sc=1&sf=firstpost&sk=t&sd=d&sr=topics&st=0&ch=300&t=0&submit=Поиск">&bull;{INTTEXT}&nbsp;</a>&nbsp;
Результат:
1399476409-clip-6kb[1].jpg
Как видите, второй код посылает на search.php с параметрами, среди которых "Поиск". Я так понимаю, если шаблон будет переключен на другой язык (хотя до смены языка форума далеко), то ссылка не отработает. Как унифицировать запрос к search?

И ещё вопрос. в первом теге я использую переменную {TEXT}, которая может содержать любые символы. Насколько это плохо и не будет ли представлять угрозу безопасности форума? Почему? Как сделать иначе?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
xisp
phpBB 3.0.0 RC7
Сообщения: 1798
Стаж: 14 лет 4 месяца
Благодарил (а): 152 раза
Поблагодарили: 215 раз
Забанен: Бессрочно

Re: Параметры search.php

Сообщение xisp »

alaon писал(а):Я так понимаю, если шаблон будет переключен на другой язык (хотя до смены языка форума далеко), то ссылка не отработает.
Что мешает вместо "Поиск" использовать языковую переменную? Берёте из шаблона поиска, из той же кнопки, будет работать железно. Наверное {L_SEARCH} должно подойти.
phpBBex
alaon
phpBB 1.4.3
Сообщения: 83
Стаж: 13 лет 2 месяца
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Параметры search.php

Сообщение alaon »

Вот, спасибо, то что надо! А насчёт использования {TEXT} что скажете?
Аватара пользователя
xisp
phpBB 3.0.0 RC7
Сообщения: 1798
Стаж: 14 лет 4 месяца
Благодарил (а): 152 раза
Поблагодарили: 215 раз
Забанен: Бессрочно

Re: Параметры search.php

Сообщение xisp »

Там можно. Нельзя внутри тегов, типа

Код: Выделить всё

<table align="{TEXT}" cellpadding="1" cellspacing="1" style="border: none;">
	<tbody>
О чём собственно и написано в справке.
phpBBex
alaon
phpBB 1.4.3
Сообщения: 83
Стаж: 13 лет 2 месяца
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Параметры search.php

Сообщение alaon »

Пост стёрт - туплю...

Спасибо! Ещё вопрос. Я не даром сделал именно 2 тега - я хочу передвигать теглайн в самый верх поста, вне зависимости от того, где теги были размещены. Подскажите, как и в каких функциях лучше это сделать?

Добавлено спустя 4 минуты 28 секунд:
В принципе, была идея повесить на обработчик формы ответа дополнительный скрипт, парсящий сообщение и передвигающий [tagfield] вверх. Было бы это правильно?
Аватара пользователя
xisp
phpBB 3.0.0 RC7
Сообщения: 1798
Стаж: 14 лет 4 месяца
Благодарил (а): 152 раза
Поблагодарили: 215 раз
Забанен: Бессрочно

Re: Параметры search.php

Сообщение xisp »

alaon писал(а):Подскажите, как и в каких функциях лучше это сделать?
message_parser же.
Впрочем, какой язык лучше понимаете- php или js, туда и вешаете.
phpBBex
alaon
phpBB 1.4.3
Сообщения: 83
Стаж: 13 лет 2 месяца
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Параметры search.php

Сообщение alaon »

Благодарю. Понимаю одинаково плохо =) Просто не хотелось лишний раз лезть в ядро движка, там у меня и так переделано много чего лишнего, вот и подумал про js. Посмотрим, может, регуляркой в message_parser сделаю. Отпишусь по результатам.
Аватара пользователя
xisp
phpBB 3.0.0 RC7
Сообщения: 1798
Стаж: 14 лет 4 месяца
Благодарил (а): 152 раза
Поблагодарили: 215 раз
Забанен: Бессрочно

Re: Параметры search.php

Сообщение xisp »

alaon писал(а):Просто не хотелось лишний раз лезть в ядро движка,
Тут или на ёлку сесть, или попу не ободрать. Одно из двух.
Вообще, в 3.1 это можно сделать красиво расширением, и никакого когда править не нужно, только следовать руководству, при базовых знаниях в пхп выйдет.
phpBBex
alaon
phpBB 1.4.3
Сообщения: 83
Стаж: 13 лет 2 месяца
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Параметры search.php

Сообщение alaon »

Не знаю, за полгода в своей 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);
Это

Код: Выделить всё

RebuildTagField($this->message);
Теперь, где бы не были расположены теги в теле сообщения, они собираются в кучу и расставляются в начале сообщения в алфавитном порядке. Всё, что между tagfield, вырезается. Вроде даже работает. Вот только php слабо знаю, наверное, накосячил где-либо. Проверите, кто знает? И две подряд регулярки мне что-то не нравятся.
alaon
phpBB 1.4.3
Сообщения: 83
Стаж: 13 лет 2 месяца
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Параметры search.php

Сообщение alaon »

Я тут подумал... Не хорошо делать такие проверки в parse_attachments :D Будет лучше, всё же, парсить сообщение в posting.php. Из message_parser.php пришлось всё убрать, создать файл tag_parser.php, в сам файл вставить это

Код: Выделить всё

<?php
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, $DropOutTags = False)
{
  $res = '';
  $arr = array();
  $arr = MakeTagArray($instr);
  if (count($arr) > 0 && !$DropOutTags)
  {
    $res = '[tagfield]';
		foreach ($arr as $tag)
		{
			$res = $res . '[tag]' . $tag . '[/tag]';
		}
		$res = $res . '[/tagfield]' . "\n";
    $instr = $res . $instr;
  }
}
?>
в posting.php заинклудить его

Код: Выделить всё

include($phpbb_root_path . 'includes/tag_parser.' . $phpEx);
и после

Код: Выделить всё

  $post_data['poll_max_options']	= request_var('poll_max_options', 1);
  $post_data['poll_vote_change']	= ($auth->acl_get('f_votechg', $forum_id) && $auth->acl_get('f_vote', $forum_id) && isset($_POST['poll_vote_change'])) ? 1 : 0;
}
добавить

Код: Выделить всё

$WithoutTags = $post_data['topic_first_post_id'] != $post_data['post_id'];
RebuildTagField($message_parser->message, $WithoutTags);
Как-то так... И да, $WithoutTags не позволяет вставлять теги в сообщение, если оно не первое в теме. Можно вовсе его убрать и вставлять теги в любых сообщениях, но мне лучше как есть.

Чукча не читатель, да :) Ну, извините за длинные портянки. Просто сам учусь, другим рассказываю.
Аватара пользователя
xisp
phpBB 3.0.0 RC7
Сообщения: 1798
Стаж: 14 лет 4 месяца
Благодарил (а): 152 раза
Поблагодарили: 215 раз
Забанен: Бессрочно

Re: Параметры search.php

Сообщение xisp »

alaon писал(а):в сам файл вставить это
Шапку из других файлов includes вставьте. Хотя хватит и этого сразу после открывающего тега php:

Код: Выделить всё

if (!defined('IN_PHPBB'))
{
	exit;
}
Это запретит вызов файла отдельно от движка.
phpBBex
alaon
phpBB 1.4.3
Сообщения: 83
Стаж: 13 лет 2 месяца
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Параметры search.php

Сообщение alaon »

Спасибо за подсказку, сам не догадался. Хорошая идея.
Зачем всё это... 
Кстати, у меня вот стоит phpBB SEO Dynamic Meta Tags V 0.4.4, собственно, я для него и делал эти теги. Ведь мод выстраивает динамические ключевики и описание страницы из первых слов первого сообщения, таким образом, если в начале сообщения будут теги, его описывающие, мод сделает свою работу максимально правильно. Ну, а если тегов нет, то и так сойдёт. Следить за тегами - задача модеров. Хлопотно, но те моды, которые позволяют вводить это дело в специальное поле при редактировании сообщения, не краше - поди пойми, есть ли ключевики в посте или нет. Надо открывать на редактирование. А тут наглядно - видишь, что они есть, значит, есть.
Пока вопросов нет, спасибо за помощь.
alaon
phpBB 1.4.3
Сообщения: 83
Стаж: 13 лет 2 месяца
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Параметры search.php

Сообщение alaon »

Напишу доработки, если кому пригодится. Заметил проблему - после каждого редактирования сообщения скрипт добавляет перенос строки после теглайна. Это не красиво, исправил. И ещё добавил кнопку "Искать все теги". Добавил тайтлы к ссылкам - теперь на тегах всплывают подсказки. Мелочь, а красиво.
Скрытый текст
Содержимое файла tag_parser.php заменить на это:

Код: Выделить всё

<?php

if (!defined('IN_PHPBB'))
{
	exit;
}

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, $DropOutTags, $SearchAllBtn = True)
{
  $res = '';
  $all = '';
  $arr = array();
  $arr = MakeTagArray($instr);
  if (count($arr) > 0 && !$DropOutTags)
  {
    $res = '[tagfield]';
		foreach ($arr as $tag)
		{
			$res = $res . '[tag]' . $tag . '[/tag]';
			$all = $all . $tag . '+';
		}
		if ($SearchAllBtn)
		{
		  $res = $res . '[tag=' . $all . ']...[/tag]';
		}
		$res = $res . '[/tagfield]';
		if(substr($instr, 1, 1) != "\n\n")
		{
		  $res = $res . "\n";
		}
    $instr = $res . $instr;
  }
}
?>
В /language/ru/common.php добавить

Код: Выделить всё

'SEARCH_FOR_TAG'     => 'Искать по тегу',
'SEARCH_ALL_OF_THIS' => 'Искать все теги',
В posting.php заменить старый вызов на

Код: Выделить всё

$WithoutTags = $post_data['topic_first_post_id'] != $post_data['post_id'];
RebuildTagField($message_parser->message, $WithoutTags);
Если кнопка "Искать все" не нужна, то

Код: Выделить всё

$WithoutTags = $post_data['topic_first_post_id'] != $post_data['post_id'];
RebuildTagField($message_parser->message, $WithoutTags, False);
Ну, и сами ББ-коды:

Код: Выделить всё

[tag]{INTTEXT}[/tag]

<a class="taglink" href="search.php?keywords={INTTEXT}&terms=all&author=&sc=1&sf=firstpost&sk=t&sd=d&sr=topics&st=0&ch=300&t=0&submit={L_SEARCH}" title="{L_SEARCH_FOR_TAG}&nbsp;&#171;{INTTEXT}&#187;">&nbsp;{INTTEXT}&nbsp;</a>&nbsp;

[tag={INTTEXT}]{INTTEXT2}[/tag]

<a class="taglink" href="search.php?keywords={INTTEXT}&terms=all&author=&sc=1&sf=firstpost&sk=t&sd=d&sr=topics&st=0&ch=300&t=0&submit={L_SEARCH}" title="{L_SEARCH_ALL_OF_THIS}">&nbsp;{INTTEXT2}&nbsp;</a>&nbsp;

[tagfield]{TEXT}[/tagfield]

<table align="left" cellpadding="1" cellspacing="1" style="border: none;">
	<tbody>
		<tr>
			<td>{TEXT}</td>
		</tr>
	</tbody>
</table>
Результат может получиться такой:
1.png
А добавление тегов в post_body, на jQuery, с взятием тегов из базы - ещё симпатичнее:
2.png
Всё, похвастался, доволен :D У кого будут проблемы - пишите в личку, помогу с настройкой этого дела.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Вернуться в «Поддержка phpBB 3.0.х»