Перейти к содержанию

Альтернатива Hide


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

Ребята, добрый день!

Снова за помощью, за неделю голову сломал в поисках решения следующего вопроса.

На форуме появилась необходимость скрывать некоторые сообщения от незарегистрированных пользователей. Сразу что попалось на глаза, так это хук Hide, который как вы знаете не работает корректно.

Далее попадались еще различные хуки, такие как (SJ33)_Hide_posts_100, Hide Content 3.0.6 [IP.Board 3.2-3.4] и еще какие-то уже не помню.

Остановился на (BIM34) Hide link and code 1.0.5.

Скажите получится ли заточить функция «скрытия кода от гостей», под скрытие конкретного поста.

Я пока вижу это таким образом, создаешь пост в визуальном редакторе и помещаешь его в тэги [code]

Можно ли как-то сделать что бы ссылки, смайлы и т.д. в тэге [code] отображались нормально, а не в виде кода?

Спасибо!

P.s. Буду рад любым советам по скрытию контента от гостей (сообщения, изображения). Полностью темы закрывать не можем.

Ссылка на комментарий
Поделиться на другие сайты

Если нужен только функционал скрытия от гостей (без отсечки по репутации, количеству постов и т.д., как в хуке hide), то можно написать простенький bb-код [hide].

Предлагаю такой вариант:

 

Создаем ВВ-код:

АЦ - Внешний вид - Сообщения - BB-коды - добавить 
BB-код:  Хайд содержимого
Полное описание: Содержимое доступно только зарегистрированным пользователям
Пример использования: [hide]Скрытый текст[/hide]
Тэг: hide
Шаблон замены BB-кода:
ИЛИ PHP файл для исполнения: hide.php
Подсказка для content: Содержимое

Далее в папку / админка / sources / classes / text / parser / bbcode / положить файл hide.php следующего содержания

<?php
if( !class_exists('bbcode_parent_main_class') )
{
 require_once( IPS_ROOT_PATH . 'sources/classes/text/parser/bbcode/defaults.php' );/*noLibHook*/
}
class bbcode_plugin_hide extends bbcode_parent_main_class
{
    public function __construct( ipsRegistry $registry, $_parent=null )
 {
  $this->currentBbcode = 'hide';
  
  parent::__construct( $registry, $_parent );
 }
    
    protected function _replaceText($txt)
    {
        $_tags = $this->_retrieveTags();
        foreach($_tags as $_tag)
        {
   if ( $this->memberData['member_id'] )
   {
    $txt = preg_replace("/\[{$_tag}\](?s)(.*?)\[\/{$_tag}\]/i", "$1", $txt);
   }
   else
   {
    $txt = preg_replace("/\[{$_tag}\](?s)(.*?)\[\/{$_tag}\]/i", "<span style='display: block; font-weight: normal; clear: none; color: #f00;'>Содержание видно только зарегистрированным пользователям.<br /><a href='/index.php?app=core&amp;module=global&amp;section=login' title='Войти' id='sign_in'>Войти</a> или <a href='/index.php?app=core&amp;module=global&amp;section=register' title='Регистрация' id='register_link'>Зарегистрироваться</a>.</span>", $txt);
   }
  }
        return $txt;
 }
 
 protected function _getOption(){
 }
    
}
?>

Само собой в <span style='...'> можно дописать свои css свойства для оформления теста, видимого гостям. Или прописать класс и далее через css оформить - дело вкуса.

Вот так это выглядит у меня ( css чуть оформил ) 

для гостей:

1.thumb.jpg.427f53ad1bfb9e484d72d06bfa3d

для пользователей:

0.thumb.jpg.e62934f928082e4247d42dac0f50

в редакторе:

2.thumb.jpg.5066df9c1233262d7c141ddcfa04

 

Собственно, ВВ-код простой и выполняет только одну функцию и не имеет настроек (опций). Если же нужен расширенный функционал, то проще взять хук hide и допилить его.

---

В принципе хук Hide link and code можно заточить под [hide], надо лишь в его коде правильно переписать

$post['post']['post'] = preg_replace(..............., $post['post']['post']);

 

 

 

Изменено пользователем Viktar83
Ссылка на комментарий
Поделиться на другие сайты

Собственно, ВВ-код простой и выполняет только одну функцию и не имеет настроек (опций). Если же нужен расширенный функционал, то проще взять хук hide и допилить его.

 

Хоть код немного кривоват можно допилить и этот бб-код, добавить как минимум поддержку постов. 

Замену в данном случае лучше всего делать по коллбэк функции.

  if ( $this->memberData['member_id'] )
   {
    $txt = preg_replace("/\[{$_tag}\](?s)(.*?)\[\/{$_tag}\]/i", "$1", $txt);
   }
   else
   {
    $txt = preg_replace("/\[{$_tag}\](?s)(.*?)\[\/{$_tag}\]/i", "<span style='display: block; font-weight: normal; clear: none; color: #f00;'>Содержание видно только зарегистрированным пользователям.<br /><a href='/index.php?app=core&amp;module=global&amp;section=login' title='Войти' id='sign_in'>Войти</a> или <a href='/index.php?app=core&amp;module=global&amp;section=register' title='Регистрация' id='register_link'>Зарегистрироваться</a>.</span>", $txt);
   }

Заменить на

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

И добавить новый метод

	protected function _callback( $m )
	{
		$args  = trim( ltrim( $m[1], '=' ) );
		$error = array();
		
		if( $args )
		{
			if( $this->memberData['posts'] < $args )
			{
				$error[] = 'You need '. intval( $args ) . ' posts for view this content.';
			}
		}
		else
		{
			if( ! $this->memberData['member_id'] )
			{
				$error[] = 'You need register for view this content.';
			}
		}
		
		if( count( $error ) )
		{
			$return = "<span style='display: block; font-weight: normal; clear: none; color: #f00;'>" . implode( '<br />', $error ) . "<br /><a href='" . $this->registry->output->buildUrl( 'app=core&amp;module=global&amp;section=login', 'publicNoSession' ) . "' title='Войти' id='sign_in'>Войти</a> или <a href='" . $this->registry->output->buildUrl( 'app=core&amp;module=global&amp;section=register', 'publicNoSession' ) . "' title='Регистрация' id='register_link'>Зарегистрироваться</a>.</span>";
		}
		else
		{
			$return = $m[2];
		}
		
		return $return;
	}

Можно будет юзать как просто [hide] для зарегистрированных пользователей так и [hide=3] для количество сообщений. При желании и небольшой модификации можно добавить поддержку полноценных опции для валидации всевозможных условий.

Проблема ббкода только в том, что он кешируется. Чтоб он хайд работал нормально скорее всего придется отключать кеш постов. Поэтому и был написан модуль скрытого текста который используется совсем другой принцип работы.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо большое! Сейчас буду пробовать на тестовом форуме!

Ссылка на комментарий
Поделиться на другие сайты

Можно будет юзать как просто [hide] для зарегистрированных пользователей так и [hide=3] для количество сообщений. При желании и небольшой модификации можно добавить поддержку полноценных опции для валидации всевозможных условий.

Проблема ббкода только в том, что он кешируется. Чтоб он хайд работал нормально скорее всего придется отключать кеш постов. Поэтому и был написан модуль скрытого текста который используется совсем другой принцип работы.

​Спасибо, попробую предложенным Вами вариантом доработать код! Пока вроде нужен самый простой, только от не зарегестированных пользователей.

Я добавил BB код предложенный в первом варианте, вроде скрывает/открывает но только после чистки кэша( как вы и писали

Не подскажете, каким образом можно отключить кэш постов, я так понимаю в моем случае это единственный вариант? Как это скажется на работе форума в целом (из вашей практики)?

Спасибо!

Ссылка на комментарий
Поделиться на другие сайты

Дополню. При редактировании BB-кода, пишет "Кеширование содержимого включено". После выполнения очистки, код на форуме работает несколько кликов, потом снова не обновляется.

 

Ссылка на комментарий
Поделиться на другие сайты

Дополню предыдущее сообщение, вот какое сообщение выводит при редактировании BB-кода.

Попытался в планировщике зада выставить очистку кэша, не чистит( да и чистка каждую минуту не выход, если бы каждую секунду :)

 

ВВхайд.jpg

кэш.jpg

Ссылка на комментарий
Поделиться на другие сайты

Дополню предыдущее сообщение, вот какое сообщение выводит при редактировании BB-кода.

Попытался в планировщике зада выставить очистку кэша, не чистит( да и чистка каждую минуту не выход, если бы каждую секунду :)

​Вы не умеете пользоваться живым поиском в АЦ?

Настройки

cache.thumb.png.9517a24a990d6920daf0c412

Ручное удаление кеша

cache2.thumb.png.de7f8f2eb64fb8484a664b7

Изменено пользователем LvsF
Ссылка на комментарий
Поделиться на другие сайты

Если честно, нет. 

Теперь буду знать про живой поиск в АЦ.

Спасибо большое за ответ!

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Ребята, добрый день!

Продолжаю мучить альтернативу hide. Столкнулся со следующей проблемой, вроде просто как дважды два, но не получается(

Сделал все по инструкции как писал Viktar83 + добавил поддержку постов как посоветовал Soka

Hide работает, но чутка криво поддержка постов, не знаю как разделить зарегистрированного пользователя от не зарегистрированного, т.е. в случае когда пользователь зашел на форум  [hide=3]скрытый текст[hide] Hide предлагает пользователю помимо того что бы пользователь набрал 3 сообщения для просмотра скрытого текста, так еще и "Войти и Зарегистрироваться" (скрин 1).

Можно ли разделить мух от котлет?

Надеюсь не запутал вопросом.

Спасибо!

 

Код получился такой

<?php
if( !class_exists('bbcode_parent_main_class') )
{
 require_once( IPS_ROOT_PATH . 'sources/classes/text/parser/bbcode/defaults.php' );/*noLibHook*/
}
class bbcode_plugin_hide extends bbcode_parent_main_class
{
    public function __construct( ipsRegistry $registry, $_parent=null )
 {
  $this->currentBbcode = 'hide';
  
  parent::__construct( $registry, $_parent );
 }
    
    protected function _replaceText($txt)
    {
        $_tags = $this->_retrieveTags();
        foreach($_tags as $_tag)
        {
   


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

  }
        return $txt;
 }

protected function _callback( $m )
	{
		$args  = trim( ltrim( $m[1], '=' ) );
		$error = array();
		
		if( $args )
		{
			if( $this->memberData['posts'] < $args )
			{
				$error[] = 'Вы должны нафлудить :) '. intval( $args ) . ' постов для просмотра скрытого текста.';
			}
		}
		else
		{
			if( ! $this->memberData['member_id'] )
			{
				$error[] = 'Скрытый текст доступен только зарегестрированным пользователям.';
			}
		}
		
		if( count( $error ) )
		{
			$return = "<span style='display: block; font-weight: normal; clear: none; color: #f00;'>" . implode( '<br />', $error ) . "<br /><a href='" . $this->registry->output->buildUrl( 'app=core&amp;module=global&amp;section=login', 'publicNoSession' ) . "' title='Войти' id='sign_in'>Войти</a> или <a href='" . $this->registry->output->buildUrl( 'app=core&amp;module=global&amp;section=register', 'publicNoSession' ) . "' title='Регистрация' id='register_link'>Зарегистрироваться</a>.</span>";
		}
		else
		{
			$return = $m[2];
		}
		
		return $return;
	}

 protected function _getOption(){
 }
    
}
?>

 

не зарег.jpg

зарег.jpg

Ссылка на комментарий
Поделиться на другие сайты

$error[] = "Скрытый текст доступен только зарегестрированным пользователям.". "
Войти или Зарегистрироваться.";

И соответственно убрать из $return

$return = "" . implode( '
', $error ) ."
";

html отработал
 

$error[] = 'Скрытый текст доступен только зарегестрированным пользователям.'."
Войти или Зарегистрироваться.";

[/code]


[code]

$return = "" . implode( '
', $error ) . "";

[/code]

нда, парсер в 4x полный г
 

$error[] = 'Скрытый текст доступен только зарегестрированным пользователям.'."<br /><a href='" . $this->registry->output->buildUrl( 'app=core&amp;module=global&amp;section=login', 'publicNoSession' ) . "' title='Войти' id='sign_in'>Войти</a> или <a href='" . $this->registry->output->buildUrl( 'app=core&amp;module=global&amp;section=register', 'publicNoSession' ) . "' title='Регистрация' id='register_link'>Зарегистрироваться</a>.";
$return = "<span style='display: block; font-weight: normal; clear: none; color: #f00;'>" . implode( '<br />', $error ) . "</span>";

 

Ссылка на комментарий
Поделиться на другие сайты

или 

$return = "<span style='display: block; font-weight: normal; clear: none; color: #f00;'>" . implode( '<br />', $error ) . ( ( ! $this->memberData['member_id'] ) ? "<br /><a href='" . $this->registry->output->buildUrl( 'app=core&amp;module=global&amp;section=login', 'publicNoSession' ) . "' title='Войти' id='sign_in'>Войти</a> или <a href='" . $this->registry->output->buildUrl( 'app=core&amp;module=global&amp;section=register', 'publicNoSession' ) . "' title='Регистрация' id='register_link'>Зарегистрироваться</a>." : "" ) . "</span>";

 

Ссылка на комментарий
Поделиться на другие сайты

Спасибо большое! 

Он правда в скрытых постах стал дублировать два раза "Войти или Зарегистрироваться"

Сейчас что-нибудь придумаю!

Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...

Добрый вечер!

Я все продолжаю мучать хайд :)

Помогите пожалуйста "допилить код"! Проблема с которой столкнулся заключается в следующем.

Если поставить после начинающим тэга [hide] Enter, либо перед закрывающим [/hide], то исполняемый код тут же не отрабатывает, если без enter'ов, то вск ок отрабатывает.

5a68d50ad8640_hide2.jpg.ccbee7a82dac94d9a78e3f6b7178ef1d.jpg5a68d509c1e26_hide1.jpg.edab556bae7cb6dbaa23039c0852e3a1.jpg

 

Код хайда имеет следующий вид

<?php
if( !class_exists('bbcode_parent_main_class') )
{
 require_once( IPS_ROOT_PATH . 'sources/classes/text/parser/bbcode/defaults.php' );/*noLibHook*/
}
class bbcode_plugin_hide extends bbcode_parent_main_class
{
    public function __construct( ipsRegistry $registry, $_parent=null )
 {
  $this->currentBbcode = 'hide';
  
  parent::__construct( $registry, $_parent );
 }
    
    protected function _replaceText($txt)
    {
        $_tags = $this->_retrieveTags();
        foreach($_tags as $_tag)
        {
   


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

  }
        return $txt;
 }

protected function _callback( $m )
	{
		$args  = trim( ltrim( $m[1], '=' ) );
		$error = array();
		
		if( $args )
		{
			if( $this->memberData['posts'] < $args )
			{
				$error[] = 'Для просмотра скрытого текста вы должны <a href="forum/index.php?app=core&module=global&section=login">Войти</a> под своим логином или <a href="forum/index.php?app=core&module=global&section=register">Зарегистрироваться</a> и иметь '. intval( $args ) . ' или более сообщений.';
			}
		}
		else
		{
			if( ! $this->memberData['member_id'] )
			{
				$error[] = 'Скрытый текст доступен только зарегистрированным пользователям.'."<br /><a href='" . $this->registry->output->buildUrl( 'app=core&amp;module=global&amp;section=login', 'publicNoSession' ) . "' title='Войти' id='sign_in'>Войти</a> или <a href='" . $this->registry->output->buildUrl( 'app=core&amp;module=global&amp;section=register', 'publicNoSession' ) . "' title='Регистрация' id='register_link'>Зарегистрироваться</a>.";
			}
		}
		
		if( count( $error ) )
		{
			$return = "<span style='display: block; font-weight: normal; clear: none; color: #8F0018;'>" . implode( '<br />', $error ) . "</span>";
		}
		else
		{
			$return = $m[2];
		}
		
		return $return;
	}

 protected function _getOption(){
 }
    
}
?>

Спасибо!!

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...