Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

Дизайн и модификация Invision Community

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

bbcode из php файла.

Версия 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. (с остальными опциями то же самое)

 

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

Рекомендованные сообщения

  • Автор

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

 

$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) - переводится как "Если группа пользователя равняется по айди группе гостей, то...

В таком случае не правильно применять 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>';
}
}

 

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

Кстати, тем, кому нужна аццкая регулярка для парсинга таких опций к тегу - 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];
       }
   }

  • Автор

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

  • Автор

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

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

  • Автор

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

Походу не работает из за этой строчки >

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

 

 

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

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

 

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

Создайте аккаунт или войдите в него для комментирования

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.