Posted 7 июня, 20159 yr 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. Буду рад любым советам по скрытию контента от гостей (сообщения, изображения). Полностью темы закрывать не можем.
7 июня, 20159 yr 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&module=global&section=login' title='Войти' id='sign_in'>Войти</a> или <a href='/index.php?app=core&module=global&section=register' title='Регистрация' id='register_link'>Зарегистрироваться</a>.</span>", $txt); } } return $txt; } protected function _getOption(){ } } ?> Само собой в <span style='...'> можно дописать свои css свойства для оформления теста, видимого гостям. Или прописать класс и далее через css оформить - дело вкуса. Вот так это выглядит у меня ( css чуть оформил ) для гостей: для пользователей: в редакторе: Собственно, ВВ-код простой и выполняет только одну функцию и не имеет настроек (опций). Если же нужен расширенный функционал, то проще взять хук hide и допилить его. --- В принципе хук Hide link and code можно заточить под [hide], надо лишь в его коде правильно переписать $post['post']['post'] = preg_replace(..............., $post['post']['post']); Edited 7 июня, 20159 yr by Viktar83
7 июня, 20159 yr 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&module=global&section=login' title='Войти' id='sign_in'>Войти</a> или <a href='/index.php?app=core&module=global&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&module=global&section=login', 'publicNoSession' ) . "' title='Войти' id='sign_in'>Войти</a> или <a href='" . $this->registry->output->buildUrl( 'app=core&module=global&section=register', 'publicNoSession' ) . "' title='Регистрация' id='register_link'>Зарегистрироваться</a>.</span>"; } else { $return = $m[2]; } return $return; } Можно будет юзать как просто [hide] для зарегистрированных пользователей так и [hide=3] для количество сообщений. При желании и небольшой модификации можно добавить поддержку полноценных опции для валидации всевозможных условий. Проблема ббкода только в том, что он кешируется. Чтоб он хайд работал нормально скорее всего придется отключать кеш постов. Поэтому и был написан модуль скрытого текста который используется совсем другой принцип работы.
8 июня, 20159 yr Author comment_88581 Можно будет юзать как просто [hide] для зарегистрированных пользователей так и [hide=3] для количество сообщений. При желании и небольшой модификации можно добавить поддержку полноценных опции для валидации всевозможных условий. Проблема ббкода только в том, что он кешируется. Чтоб он хайд работал нормально скорее всего придется отключать кеш постов. Поэтому и был написан модуль скрытого текста который используется совсем другой принцип работы. Спасибо, попробую предложенным Вами вариантом доработать код! Пока вроде нужен самый простой, только от не зарегестированных пользователей. Я добавил BB код предложенный в первом варианте, вроде скрывает/открывает но только после чистки кэша( как вы и писали Не подскажете, каким образом можно отключить кэш постов, я так понимаю в моем случае это единственный вариант? Как это скажется на работе форума в целом (из вашей практики)? Спасибо!
9 июня, 20159 yr Author comment_88595 Дополню. При редактировании BB-кода, пишет "Кеширование содержимого включено". После выполнения очистки, код на форуме работает несколько кликов, потом снова не обновляется.
11 июня, 20159 yr Author comment_88751 Дополню предыдущее сообщение, вот какое сообщение выводит при редактировании BB-кода. Попытался в планировщике зада выставить очистку кэша, не чистит( да и чистка каждую минуту не выход, если бы каждую секунду
11 июня, 20159 yr comment_88752 Дополню предыдущее сообщение, вот какое сообщение выводит при редактировании BB-кода. Попытался в планировщике зада выставить очистку кэша, не чистит( да и чистка каждую минуту не выход, если бы каждую секунду Вы не умеете пользоваться живым поиском в АЦ? Настройки Ручное удаление кеша Edited 11 июня, 20159 yr by LvsF
11 июня, 20159 yr Author comment_88754 Если честно, нет. Теперь буду знать про живой поиск в АЦ. Спасибо большое за ответ!
2 июля, 20159 yr 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&module=global&section=login', 'publicNoSession' ) . "' title='Войти' id='sign_in'>Войти</a> или <a href='" . $this->registry->output->buildUrl( 'app=core&module=global&section=register', 'publicNoSession' ) . "' title='Регистрация' id='register_link'>Зарегистрироваться</a>.</span>"; } else { $return = $m[2]; } return $return; } protected function _getOption(){ } } ?>
4 июля, 20159 yr 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&module=global&section=login', 'publicNoSession' ) . "' title='Войти' id='sign_in'>Войти</a> или <a href='" . $this->registry->output->buildUrl( 'app=core&module=global&section=register', 'publicNoSession' ) . "' title='Регистрация' id='register_link'>Зарегистрироваться</a>."; $return = "<span style='display: block; font-weight: normal; clear: none; color: #f00;'>" . implode( '<br />', $error ) . "</span>";
4 июля, 20159 yr 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&module=global&section=login', 'publicNoSession' ) . "' title='Войти' id='sign_in'>Войти</a> или <a href='" . $this->registry->output->buildUrl( 'app=core&module=global&section=register', 'publicNoSession' ) . "' title='Регистрация' id='register_link'>Зарегистрироваться</a>." : "" ) . "</span>";
6 июля, 20159 yr Author comment_90104 Спасибо большое! Он правда в скрытых постах стал дублировать два раза "Войти или Зарегистрироваться" Сейчас что-нибудь придумаю!
24 января, 20186 yr Author comment_142652 Добрый вечер! Я все продолжаю мучать хайд Помогите пожалуйста "допилить код"! Проблема с которой столкнулся заключается в следующем. Если поставить после начинающим тэга [hide] Enter, либо перед закрывающим [/hide], то исполняемый код тут же не отрабатывает, если без enter'ов, то вск ок отрабатывает. Код хайда имеет следующий вид <?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§ion=login">Войти</a> под своим логином или <a href="forum/index.php?app=core&module=global§ion=register">Зарегистрироваться</a> и иметь '. intval( $args ) . ' или более сообщений.'; } } else { if( ! $this->memberData['member_id'] ) { $error[] = 'Скрытый текст доступен только зарегистрированным пользователям.'."<br /><a href='" . $this->registry->output->buildUrl( 'app=core&module=global&section=login', 'publicNoSession' ) . "' title='Войти' id='sign_in'>Войти</a> или <a href='" . $this->registry->output->buildUrl( 'app=core&module=global&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.