Скрываем контент от гостей

Скрываем контент от гостей

От автора: На форумах и всевозможных сайтах Вы могли не раз видеть некий скрытый контент — ссылку, картинку и пр. — для просмотра которого необходимо авторизоваться. Гости вместо скрытого содержимого видят что-то типа «Авторизуйтесь для просмотра скрытого содержимого». Авторизованные же пользователи без проблем видят скрытый контент.

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

Внимание!!! В связи со спецификой публикации (при публикации используются BB-теги, которые пересекаются с публикуемыми BB-тегами) рекомендуется просмотреть текстовую версию.

Детали учебника

Тема: PHP, регулярные выражения

Сложность: Средняя

Урок: Видео версия (.mp4)

Время: 00:30:06

Размер архива: 67 Mb

скачать исходникискачать урок

Итак, соединив исходники из обоих указанных уроков, я получил примерно такую картину:

Здесь форма авторизации нам нужна как раз для того, чтобы отличать авторизованного пользователя от гостя. Если пользователь успешно авторизован, то в сессии создается переменная $_SESSION['admin']. Конечно же, если на сайте будет множественная регистрация/авторизация, то переменную логичнее назвать $_SESSION['user'], но у нас предусмотрен 1 пользователь. Создание же системы регистрации не есть темой данного урока.

Теперь о том, как бы мы хотели публиковать скрытое содержимое. Как правило, для этого используются BB-теги HIDE. Не будем оригинальными и воспользуемся традиционным названием. Таким образом, публикация скрытой ссылки будет иметь следующий вид:

[HIDE]<a href="http://google.com/">Скрытая ссылка</a>[/HIDE]

Пока что, независимо от того гость или авторизованный пользователь просматривает страницу, мы увидим одно и то же:

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

$pattern = '#\[hide].*?\[/hide]#is';

Данный шаблон ищет в тексте BB-теги HIDE и все, что в них содержится. При этом шаблон будет регистронезависимым (благодаря модификатору «i») и мультистрочным (благодаря модификатору «s», обеспечивающему совпадение метасимвола точки с переносом строки). Стоит также обратить внимание, что после квантификатора «*» мы поставили еще один квантификатор — «?» — тем самым делая первый квантификатор «ленивым». Это обеспечивает корректную работу шаблона с двумя и более блоками HIDE в тексте.

Итак, шаблон готов и мы можем приступить к написанию несложной функции:

function hide_content($content){
	if(!$_SESSION['admin']){
		$pattern = '#\[hide].*?\[/hide]#is';
		$content = preg_replace($pattern, '<div class="hide">Авторизуйтесь для просмотра скрытого содержимого</div>', $content);
		return $content;
	}else{
		return $content;
	}
}

И несколько правил для класса hide:

.hide{
	border: 1px solid #765858;
	background: #ffeded;
	color: #7f5354;
	padding: 3px;
}

И вызовем функцию hide_content() для выводимого текста. В нашем случае это будет иметь следующий вид:

$text = hide_content($item['text']);
echo code_content($text);

В переменную $text попадет пропущенный через функцию hide_content() выводимый текст. Ну а строкой ниже он будет выведен.

Теперь вместо BB-тегов HIDE и их содержимого гость будет видеть то, что мы и хотели:

С гостями мы «разобрались», но авторизованные пользователи видят скрытое содержимое в не совсем приглядном виде — хотелось бы убрать BB-теги HIDE и как-то оформить данный блок. Немного допишем функцию hide_content():

function hide_content($content){
	if(!$_SESSION['admin']){
		$pattern = '#\[hide].*?\[/hide]#is';
		$content = preg_replace($pattern, '<div class="hide">Авторизуйтесь для просмотра скрытого содержимого</div>', $content);
		return $content;
	}else{
		$pattern = '#\[hide](.*?)\[/hide]#is';
		$content = preg_replace($pattern, '<div class="show">$1</div>', $content);
		return $content;
	}
}

Здесь мы немного изменили шаблон. Поскольку нам нужно показывать содержимое тегов HIDE, мы воспользовались запоминающими скобками — (.*?). Ну а в функции preg_replace(), соответственно, ссылаемся на запомненное — $1.

И несколько правил для класса show:

.show{
	border: 1px solid #adc092;
	background: #f0faf1;
	color: #58715e;
	padding: 3px;
}
.show a{
	color: #58715e;
}

Теперь можно оценить результат и для авторизованного пользователя:

Вот и все. Задача реализована и, как видите, реализуется она довольно просто. Удачи и до новых встреч!

Хотите изучить регулярные выражения на PHP?

Прямо сейчас посмотрите 12-ти часовой курс по регулярным выражениям на PHP!

Смотреть курс

Метки: ,

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (4)

  1. Павел

    Здравствуйте, Андрей!
    Это всё замечательно, но, у всех этих способов, есть один существенный минус, который еще не удалось решить никому в мире. Скрытый контент, прекрасно виден через поиск wordpress то есть, если в поисковом запросе будет слово из скрытого содержимого, скажем слово «ссылка» в вашем случае, то поиск выдаст страницу где будет статья с этим самым скрытым содержимым, пусть даже в самой статье слово «ссылка» и не встречается. Вот так…

    • Андрей Кудлай

      Здравствуйте, Павел.
      Вы меня, конечно, извините, но при чем здесь WordPress? В уроке я ни словом не обмолвился об этой CMS :) И если уж на то пошло, то заявление «не удалось решить никому в мире» на самом деле ошибочно:
      1) во-первых, если уж взяли WP, то будет выдана статья, в которой будет все тот же скрытый контент, поскольку для вывода результатов поиска используется все та же функция the_content(), что и для показа статьи… саму ссылку он не увидит в любом случае;
      2) ну а, во-вторых, кто мешает перед тем, как отдать результаты поиска, обработать эти самые результаты, и удалить из объекта posts все статьи (или просто не выводить их в цикле), в которых встречается тег HIDE и содержимое тега совпадает с поисковым запросом? Мне кажется, что никто не мешает и все в руках ваших ;)

  2. Татьяна

    А как сделать вот такое окно, которое всплыло перед тем, как прочесть эту запись? Это скрипт Попова? Или другой? Я очень хочу что-то подобное, но у меня нет платного аккаунта в смарте :(
    Андрей, не подскажете как можно это реализовать?
    Спасибо

    • Андрей Кудлай

      Реализовать можно без проблем, но в комментариях показать, как это можно сделать, конечно же, невозможно… для этого нужен, как минимум, отдельный урок.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree