От автора: На форумах и всевозможных сайтах Вы могли не раз видеть некий скрытый контент — ссылку, картинку и пр. — для просмотра которого необходимо авторизоваться. Гости вместо скрытого содержимого видят что-то типа «Авторизуйтесь для просмотра скрытого содержимого». Авторизованные же пользователи без проблем видят скрытый контент.
Сегодня я поделюсь с Вами способом, как организовать подобную вещь на сайте. В качестве исходников к данному уроку я воспользуюсь исходниками из урока Установка визуального редактора с файловым менеджером и исходниками из урока Создание простой системы авторизации. Также Вы можете написать собственное решение для управления контентом страницы и разграничения гостей и авторизованных пользователей.
Внимание!!! В связи со спецификой публикации (при публикации используются BB-теги, которые пересекаются с публикуемыми BB-тегами) рекомендуется просмотреть текстовую версию.
Детали учебника
Тема: PHP, регулярные выражения
Сложность: Средняя
Урок: Видео версия (.mp4)
Время: 00:30:06
Размер архива: 67 Mb
Итак, соединив исходники из обоих указанных уроков, я получил примерно такую картину:
Здесь форма авторизации нам нужна как раз для того, чтобы отличать авторизованного пользователя от гостя. Если пользователь успешно авторизован, то в сессии создается переменная $_SESSION[‘admin’]. Конечно же, если на сайте будет множественная регистрация/авторизация, то переменную логичнее назвать $_SESSION[‘user’], но у нас предусмотрен 1 пользователь. Создание же системы регистрации не есть темой данного урока.
Теперь о том, как бы мы хотели публиковать скрытое содержимое. Как правило, для этого используются BB-теги HIDE. Не будем оригинальными и воспользуемся традиционным названием. Таким образом, публикация скрытой ссылки будет иметь следующий вид:
1 |
[HIDE]<a href="//google.com/">Скрытая ссылка</a>[/HIDE] |
Пока что, независимо от того гость или авторизованный пользователь просматривает страницу, мы увидим одно и то же:
Прежде всего, поработаем с гостем и добьемся того, чтобы вместо текущего результата он видел сообщение о скрытом контенте. Как Вы, наверное, уже догадались, нам потребуются возможности регулярных выражений. Итак, давайте составим шаблон:
1 |
$pattern = '#\[hide].*?\[/hide]#is'; |
Данный шаблон ищет в тексте BB-теги HIDE и все, что в них содержится. При этом шаблон будет регистронезависимым (благодаря модификатору «i») и мультистрочным (благодаря модификатору «s», обеспечивающему совпадение метасимвола точки с переносом строки). Стоит также обратить внимание, что после квантификатора «*» мы поставили еще один квантификатор — «?» — тем самым делая первый квантификатор «ленивым». Это обеспечивает корректную работу шаблона с двумя и более блоками HIDE в тексте.
Итак, шаблон готов и мы можем приступить к написанию несложной функции:
1 2 3 4 5 6 7 8 9 |
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:
1 2 3 4 5 6 |
.hide{ border: 1px solid #765858; background: #ffeded; color: #7f5354; padding: 3px; } |
И вызовем функцию hide_content() для выводимого текста. В нашем случае это будет иметь следующий вид:
1 2 |
$text = hide_content($item['text']); echo code_content($text); |
В переменную $text попадет пропущенный через функцию hide_content() выводимый текст. Ну а строкой ниже он будет выведен.
Теперь вместо BB-тегов HIDE и их содержимого гость будет видеть то, что мы и хотели:
С гостями мы «разобрались», но авторизованные пользователи видят скрытое содержимое в не совсем приглядном виде — хотелось бы убрать BB-теги HIDE и как-то оформить данный блок. Немного допишем функцию hide_content():
1 2 3 4 5 6 7 8 9 10 11 |
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:
1 2 3 4 5 6 7 8 9 |
.show{ border: 1px solid #adc092; background: #f0faf1; color: #58715e; padding: 3px; } .show a{ color: #58715e; } |
Теперь можно оценить результат и для авторизованного пользователя:
Вот и все. Задача реализована и, как видите, реализуется она довольно просто. Удачи и до новых встреч!
Комментарии (4)