Проблема с хуком

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
inline
phpBB 1.2.0
Сообщения: 19
Стаж: 13 лет 6 месяцев

Проблема с хуком

Сообщение inline »

Вот мой хук

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

<?php
include ("connect.php");
function my()
{
    global $template;
 
    if (isset($template->_tpldata['postrow']))
    {
        // Применяем функцию do_replace() к каждому члену массива postrow, содержащего тексты сообщений
        array_walk($template->_tpldata['postrow'], 'do_replace');
    }
}
 
function dealers($brend,$city)
{
$sql_dealers = mysql_query("select * from ado where city='".$city."' and auto='".$brend."'");
$count_dealers = mysql_num_rows($sql_dealers);

for ($i=0;$i<$count_dealers;$i++)
{
$dealer = mysql_fetch_array($sql_dealers);
//$content.= iconv("windows-1251","utf-8",$dealer['name'])."<br>";
$content.= iconv("windows-1251","utf-8",$dealer['name'])."<br>";
}

return $content;
}

function do_replace(&$item)
{
    // Составляем список знаков препинания
   


   preg_match("/%brend=(.*) city=(.*)%/isU",$item['MESSAGE'],$result);
	$content = dealers($result[1],$result[2]);
	$item['MESSAGE'] = str_replace("%city=".$result[1]."%",$content,$item['MESSAGE']);

}
 
// Регистрируем хук
$phpbb_hook->register(array('template', 'display'), 'my');
 
?>
в итоге %brend=Renault city=Воронеж% как было в посте так и осталось - замена не прошла
в тоже время $content = dealers($result[1],$result[2]); имеет нужное значение (проверено print спереди - все выводит)


В чем проблема? Почему не проходит замена %brend=Renault city=Воронеж% на текст из переменной $content = dealers($result[1],$result[2]); ?

Хук должен заменять в постах конструкции типа %brend=Renault city=Воронеж%
Последний раз редактировалось Sheer 10.04.2013 14:38, всего редактировалось 1 раз.
Причина: bb-код
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

Re: Проблема с хуком

Сообщение rxu »

inline
Возможно, перекодировка не проходит. Попробуйте

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

$content.= iconv("cp1251", "UTF-8", $dealer['name']) . "<br>";
Изображение
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 13 лет 9 месяцев
Благодарил (а): 42 раза
Поблагодарили: 251 раз

Re: Проблема с хуком

Сообщение c61 »

inline,

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

array_walk($template->_tpldata['postrow'], 'do_replace');
замените на

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

 		foreach($template->_tpldata['postrow'] as $key => $val)
		{
			do_replace($template->_tpldata['postrow'][$key]['MESSAGE']);
		}
И в do_replace удалите везде ['MESSAGE'].
Вы брали код из hook_replace, я отправлял Татьяна5 исправленный вариант, она его пока не выложила. Видимо, тестирует.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

Re: Проблема с хуком

Сообщение rxu »

c61
Так не выйдет, в do_replace() индекс 'MESSAGE' используется повторно, тогда функцию надо переписывать.
Должно работать как есть.
Изображение
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 13 лет 9 месяцев
Благодарил (а): 42 раза
Поблагодарили: 251 раз

Re: Проблема с хуком

Сообщение c61 »

rxu писал(а):в do_replace() индекс 'MESSAGE' используется повторно
Учтено, см. мой предыдущий пост
c61 писал(а):И в do_replace удалите везде ['MESSAGE'].
Здесь array_walk нормально работать не будет (или вероятностно). Проверено.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

Re: Проблема с хуком

Сообщение rxu »

Точно, пропустил. А какой смысл в этой замене?
Изображение
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 13 лет 9 месяцев
Благодарил (а): 42 раза
Поблагодарили: 251 раз

Re: Проблема с хуком

Сообщение c61 »

rxu писал(а):А какой смысл в этой замене?
Если про do_replace конкретно от inline - мне не известно, что он придумал. Пока вроде тестирует.

Если про замену array_walk - то эта фунция не для этого случая, поскольку предназначена для обхода массива по всем элементам, то есть всего дерева "до листиков", а нам нужны "сучочки" и до "листиков" доходить не надо, ибо нужно значение элемента крайнего массива по ключу 'MESSAGE'.
inline
phpBB 1.2.0
Сообщения: 19
Стаж: 13 лет 6 месяцев

Re: Проблема с хуком

Сообщение inline »

Вот так работает

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

<?php
include ("connect.php");
function my()
{
    global $template;
 
    if (isset($template->_tpldata['postrow']))
    {
        // Применяем функцию do_replace() к каждому члену массива postrow, содержащего тексты сообщений
        array_walk($template->_tpldata['postrow'], 'do_replace');
    }
}
 
function dealers($brend,$city)
{
$sql_dealers = mysql_query("select * from ado where city='".$city."' and auto='".$brend."'");
$count_dealers = mysql_num_rows($sql_dealers);

for ($i=0;$i<$count_dealers;$i++)
{
$dealer = mysql_fetch_array($sql_dealers);
//$content.= iconv("windows-1251","utf-8",$dealer['name'])."<br>";
$content.= iconv("windows-1251","utf-8",$dealer['name'])."<br>";
}

return $content;
}

function do_replace(&$item)
{
    
    if (preg_match("/%brend=(.*) city=(.*)%/isU",$item['MESSAGE'],$result))
	{
	$content = dealers($result[1],iconv("utf-8","windows-1251",$result[2]));
	$item['MESSAGE'] = str_replace("%brend=".$result[1]." city=".$result[2]."%",$content,$item['MESSAGE']);
	}

}
 
// Регистрируем хук
$phpbb_hook->register(array('template', 'display'), 'my');
 
?>
поправил

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

$content = dealers($result[1],[b]iconv("utf-8","windows-1251",$result[2])[/b]);
$item['MESSAGE'] = str_replace("[b]%brend=".$result[1].[/b]" city=".$result[2]."%",$content,$item['MESSAGE']);
и добавил

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

if (preg_match("/%brend=(.*) city=(.*)%/isU",$item['MESSAGE'],$result))
Последний раз редактировалось Sheer 11.04.2013 18:23, всего редактировалось 2 раза.
Причина: ббкод

Вернуться в «Для авторов (phpBB 3.0.x)»