bbcode из php файла. - Дизайн и модификация Invision Power Board

Перейти к содержимому

 

Правила раздела

Здесь обсуждаются вопросы по настройке и администрированию форумов IPB 3.x.
Пожалуйста, не оффтопьте, если зашли сюда случайно, и обратите внимание на соседние разделы.
Установка, настройка и обслуживание форумов IPB 2.x.
Оформление форумов, включая верстку скинов.
Размещение рекламы на форумах.
SEO оптимизация форума.
Техническая поддержка наших скинов и модов.

СвернутьПрикрепленные теги

custom bbcode

Страница 1 из 1

bbcode из php файла. Вывод массива опций бб кода из php.

#1 Пользователь не на сайте   kasperskiy.pl ответил: »

 
 
  • Newbie
  • *
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 29-Июнь 13
  • Репутация: 0
  • IPB version:3.3.x
 

Отправлено 29 Июнь 2013 - 01:15

Версия ipb:3.3.4
В файле 'admin/sources/classes/bbcode/custom/defaults.php' как вы уже знаете обрабатываются наши бб коды. так вот:

class bbcode_test extends bbcode_parent_class implements bbcodePlugin
{

	public function __construct( ipsRegistry $registry, $_parent=null )
	{
		$this->currentBbcode	= 'test';
		
		parent::__construct( $registry, $_parent );
	}

protected function _replaceText($txt)
{
	$_tags = $this->_retrieveTags();

	foreach( $_tags as $_tag )
	{
		$txt = preg_replace( "/\[{$_tag}\](.+?)\[\/{$_tag}\]/i", "<div style='color:#00ff00;'>\\1</div>", $txt );

	
	}

	return $txt;
}
}


это бб код 'test' - при написании:
[test] content axaxa tra ta ta [/test]

он нам выведет контент красным цветом:
<div style='color:#00ff00;'> content axaxa tra ta ta </div>

Суть просьбы:
Необходимо добавить опции к тегу на пример:
[test message=15 reputation=23 data=55] content axaxa tra ta ta [/test]

из за чего если в 'defaults.php' написать (Приблизительный по смыслу контент php кода):

if ($options['message'])
{
	if ($options['message'] >= 0)
	{
		$message_return = "<li> {$options['message']} </li>";
	}
	else
	{
		break;
	}
}


Где $message_return будет равняться 15 так как мы указали в опции message - 15. (с остальными опциями то же самое)

Очень прошу помочь)
0

#2 Пользователь не на сайте   kasperskiy.pl ответил: »

 
 
  • Newbie
  • *
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 29-Июнь 13
  • Репутация: 0
  • IPB version:3.3.x
 

Отправлено 29 Июнь 2013 - 01:29

Кстати те кому нужно скрыть контент от незарегистрированных пользователей:

$txt = preg_replace( "/\[{$_tag}\](.+?)\[\/{$_tag}\]/i", "<div style='color:#00ff00;'>\\1</div>", $txt );


Поменять на:

if ($this->memberData['member_group_id'] == 2)
{
    $txt = preg_replace( "/\[{$_tag}\](.+?)\[\/{$_tag}\]/i", "<div style='color:#ff0000;'>Sign up or log in to your account</div>", $txt );
}
else
{
    $txt = preg_replace( "/\[{$_tag}\](.+?)\[\/{$_tag}\]/i", "<span>\\1</span>", $txt );
}


где if ($this->memberData['member_group_id'] == 2) - переводится как "Если группа пользователя равняется по айди группе гостей, то...
0

#3 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 271
  • Регистрация: 20-Март 09
  • Репутация: 2 077
  • IPB version:3.1.x
 

Отправлено 29 Июнь 2013 - 11:49

В таком случае не правильно применять preg_replace, а preg_replace_callback с функцией которая будет обрабатывать опции и подправить регулярное выражение чтобы они захватывалась одновременно.

Например:

$txt = preg_replace_callback( "/\[{$_tag}( [^\]]+)?\](.+?)\[\/{$_tag}\]/i", array($this, '_buildOutput'), $txt );

.....

/*
 * Согласно регулярному выражению
 * $match[1] - options
 * $match[2] - content
 */
protected function _buildOutput( $match )
{
	$options = array();
	$message = '';

	//----------------------------
	//build options
	//----------------------------

	if( $match[1] )
	{
		preg_match_all( '/([a-z]+)=([\w]+)/i', $match[1], $out );
		
		for( $i=0; $i<count($out[0]); $i++ )
		{
			$options[ $out[1][$i] ] = $out[2][$i];
		}
	}
	
	// Проверяем условия опций
	if( $options['message'] AND $this->memberData['posts'] < $options['message'] )
	{
		$message .= 'You need '.$options['message'].' posts <br>';
	}
	if( $options['reputation'] AND $this->memberData['pp_reputation_points'] < $options['reputation'] )
	{
		$message .= 'You need '.$options['reputation'].' reputation points <br>';
	}
	
	if( $message )
	{
		return '<div>'.$message.'</div>';
	}
	else
	{
		return '<div>'.$match[2].'</div>';
	}
}


Только эти регулярки создадут лишнюю нагрузку, так как пост будет парсится каждый раз при выводе. А чтобы он работал правильно кеширование сообщений придется отключить, иначе пост закешируется от текущего пользователя и в дальнейшим будет отдаваться кеш.
1

#4 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 271
  • Регистрация: 20-Март 09
  • Репутация: 2 077
  • IPB version:3.1.x
 

Отправлено 29 Июнь 2013 - 16:17

Кстати, тем, кому нужна аццкая регулярка для парсинга таких опций к тегу - posts=2 privet="1" text="dsd'sd dfs sdf":

    if( $match[1] )
    {
        preg_match_all( '/([a-z]+)=(["\']?)(?(2)(.+?|\w+))\\2/', $match[1], $out );
        
        for( $i=0; $i<count($out[0]); $i++ )
        {
            $options[ $out[1][$i] ] = $out[2][$i];
        }
    }

0

#5 Пользователь не на сайте   kasperskiy.pl ответил: »

 
 
  • Newbie
  • *
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 29-Июнь 13
  • Репутация: 0
  • IPB version:3.3.x
 

Отправлено 30 Июнь 2013 - 00:19

Вот что я понял надо написать, но он не работает почему то(((
0

#6 Пользователь не на сайте   kasperskiy.pl ответил: »

 
 
  • Newbie
  • *
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 29-Июнь 13
  • Репутация: 0
  • IPB version:3.3.x
 

Отправлено 30 Июнь 2013 - 00:31

Просмотреть сообщениеsiv1987 29 Июнь 2013 - 11:49 сказал(а):

А чтобы он работал правильно кеширование сообщений придется отключить

Кеширование я отключил)
0

#7 Пользователь не на сайте   kasperskiy.pl ответил: »

 
 
  • Newbie
  • *
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 29-Июнь 13
  • Репутация: 0
  • IPB version:3.3.x
 

Отправлено 30 Июнь 2013 - 00:45

Походу не работает из за этой строчки >< мб потому что не задан $out
0

#8 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 271
  • Регистрация: 20-Март 09
  • Репутация: 2 077
  • IPB version:3.1.x
 

Отправлено 30 Июнь 2013 - 11:14

Просмотреть сообщениеkasperskiy.pl сказал(а):

Походу не работает из за этой строчки >< мб потому что не задан $out

Работу ббкода я не тестировал, но код проверялся - все работает. Если нужно, возьмите строчку и протестируйте ее отдельно - $match[1] это строка с опциями.


Просмотреть сообщениеkasperskiy.pl сказал(а):

мб потому что не задан $out

А это разве не $out?

preg_match_all( '/([a-z]+)=([\w]+)/i', $match[1], $out );

0

Сообщить об этой теме:


Страница 1 из 1


Быстрый ответ

  

1 пользователей читают эту тему
0 зарегистрированных, 1 гостей, 0 скрытых


Контактная информация

Вопросы по работе сайта

+7 (917) 501-4765
C 10 до 20 в рабочие дни (время московское)

Техническая поддержка

Контактные данные специалистов

Дизайн форумов

IPB 3.x ¦ IPB 2.x

Бесплатные шаблоны

IPB 3.2 – 3.4 ¦ IPB 3.1 ¦ IPB 3.0 ¦ IPB 2.2 – 2.3 ¦ IPB 2.1 ¦ Клипарт
Лицензия на использование ¦ Ваша поддержка ¦ О проекте
Copyright © 2005-2016 IPBSkins.ru Team
При копировании материалов с сайта
прямая ссылка на источник обязательна