Jump to content

Featured Replies

Posted
comment_88492

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

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

На форуме появилась необходимость скрывать некоторые сообщения от незарегистрированных пользователей. Сразу что попалось на глаза, так это хук 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. Буду рад любым советам по скрытию контента от гостей (сообщения, изображения). Полностью темы закрывать не можем.

comment_88494

Если нужен только функционал скрытия от гостей (без отсечки по репутации, количеству постов и т.д., как в хуке 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']);

 

 

 

Edited by Viktar83

comment_88524

Собственно, ВВ-код простой и выполняет только одну функцию и не имеет настроек (опций). Если же нужен расширенный функционал, то проще взять хук 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] для количество сообщений. При желании и небольшой модификации можно добавить поддержку полноценных опции для валидации всевозможных условий.

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

  • Author
comment_88581

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

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

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

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

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

Спасибо!

  • Author
comment_88595

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

 

  • Author
comment_88751

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

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

 

ВВхайд.jpg

кэш.jpg

comment_88752

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

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

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

Настройки

cache.thumb.png.9517a24a990d6920daf0c412

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

cache2.thumb.png.de7f8f2eb64fb8484a664b7

Edited by LvsF

  • Author
comment_88754

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

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

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

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

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

Продолжаю мучить альтернативу 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

comment_90021

$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>";

 

comment_90023

или 

$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>";

 

  • Author
comment_90104

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

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

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

  • 2 years later...
  • Author
comment_142652

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

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

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

Если поставить после начинающим тэга [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(){
 }
    
}
?>

Спасибо!!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.


Guest
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.