Ограничение к контенту по возрасту пользователя (phpFOX)

Форум поддержки движка социальной сети phpFOX.
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Ограничение к контенту по возрасту пользователя (phpFOX)

Сообщение Slash » Ср июл 20, 2016 1:11 pm

Здравствуйте.
Начал разработку ограничения к контенту по возрасту, пока что сделал предупреждение в виде одной строчки под названием страницы (модуль pages), для зарегистрированных пользователей:
Вам нет восемнадцати лет. Контент данной страницы Вам запрещён.

И для гостей:
Контент данной страницы предназначен для лиц в возрасте от восемнадцати лет и старше.

Делаю так: открываю: module/pages/include/component/controller/view.class.php, нахожу:

Код: Выделить всё

        $mId = $this->request()->getInt('req2');
        if (!($aPage = Phpfox::getService('pages')->getForView($mId)))
        {
            return Phpfox_Error::display(Phpfox::getPhrase('pages.the_page_you_are_looking_for_cannot_be_found'));
        

Ниже добавляю:

Код: Выделить всё

        # Проверка возраста ограничения
        if ($aPage['limitation'])
        {
            if (Phpfox::isUser())
            {
                $limitation = ((int) Phpfox::getUserBy('age') < 18) ? 1 : null;
            }
            else
            
{
                $limitation = 2;
            }

            $this->template()
                ->assign(array(
                    'limitation' => $limitation
                
)
            );
        }
        # Проверка возраста ограничения END   

Далее, открываю: module/profile/template/default/block/header.html.php, нахожу:

Код: Выделить всё

                {foreach from=$aBreadCrumbs key=sLink item=sCrumb name=link}
                    {if $phpfox.iteration.link == 1}
                        <span class="profile_breadcrumb">&#187;</span> <a href="{$sLink}">{$sCrumb}</a>
                    {/if}
                {/foreach}

Ниже добавляю:

Код: Выделить всё

                {if isset($limitation)}
                    <div>
                    {if $limitation == 1}
                        {phrase var='pages.limitation_prohibition'}
                    {else}
                        {phrase var='pages.limitation_warning'}
                    {/if}
                    </div>
                {/if}

Этот файл я уже прежде исправлял: Re: Валидация HTML кода (phpFOX 3) (Пост Slash #7101), так при поиске фрагмента кода, код может отличаться.

Затем в администраторском разделе, добавляю две новые языковые переменные:
  • pages.limitation_warning - Контент данной страницы предназначен для лиц в возрасте от восемнадцати лет и старше.
  • pages.limitation_prohibition - Вам нет восемнадцати лет. Контент данной страницы Вам запрещён.
В таблицу phpfox_pages, необходимо добавить поле limitation, где будут значения false (либо null) - ограничение отключено, true - ограничение включено. Пока включать|отключать ограничение надо путем "поездки" в БД, то есть в ручную, но думаю, что это я исправлю.
Готово.
Реклама
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Ограничение к контенту по возрасту пользователя (phpFOX)

Сообщение Slash » Вс июл 24, 2016 12:34 pm

Продолжаю разработку ограничения, теперь я сделал предупреждение в виде модального окна с затемненным, прозрачным фоном страницы.
Если заходит гость на страницу с контентом для взрослых впервые, появляется модальное окно, где сказано о запрещенном контенте и спрашивается о совершеннолетии пользователя. Если пользователь жмет кнопку Да, значит он подтверждает, что ему уже исполнилось восемнадцать лет, предупреждение исчезает вместе с мешающим слоем (плавно, как и появляется) и пользователь может смотреть страницу полностью. Если гость нажмет Нет, его просто перенаправит на главную страницу.

Если на страницу заходит зарегистрированный пользователь не достигший совершеннолетия, он получит сообщение о том, что ему ещё рано такое смотреть и после нажатой кнопки Да, браузер перекинет его на главную страницу.
Ограничение к контенту по возрасту пользователя phpFOX  - Для гостя.jpg
 
Ограничение к контенту по возрасту пользователя phpFOX  - Для участника системы.jpg
 

Чтобы после каждого перехода или перезагрузки запрещенной странице, гостю не пришлось соглашаться, что он совершеннолетний, я использовал куки (плагин jquery.cookie.js). Как гость подтверждает свое совершеннолетие, сохраняется кука, и при каждой загрузки страницы, проверяется ее наличие, если она есть, то вход свободный, если нет, выводим сообщение.

Файл jquery.cookie.js, скачиваем тут: http://plugins.jquery.com/cookie/ и заливаем в папку движка: static/jscript/jquery/plugin/, затем необходимо его подключить, для этого в файле: module/pages/include/component/controller/view.class.php, находим:

Код: Выделить всё

                ->setHeader('cache', array(
                    'jquery/plugin/jquery.highlightFade.js' => 'static_script',

И меняем на:

Код: Выделить всё

                ->setHeader('cache', array(
                    'jquery/plugin/jquery.cookie.js'        => 'static_script',
                    'jquery/plugin/jquery.highlightFade.js' => 'static_script',

Далее в этом же файле, меняем код из первого поста, что между комментариев:

Код: Выделить всё

        # Проверка возраста ограничения
        # Проверка возраста ограничения END          

Меняем на:

Код: Выделить всё

        # Проверка возраста ограничения
        if ($aPage['limitation'] && $limitation = Phpfox::getService('common')->limitation())
        {
            $this->template()
                ->assign(array(
                    'limitation' => $limitation
                
)
            );
        }
        # Проверка возраста ограничения END         

Вот тут: Phpfox::getService('common')->limitation() используется мною созданный модуль common, будьте внимательны, если у вас нет модуля с таким же названием, необходимо его создать, либо изменить название при обращении к файлам.

Теперь переходим к самому модулю common, открываем (или создаем, если нет): module/common/include/service/common.class.php и вставляем эту функцию:

Код: Выделить всё

    # Проверка возраста ограничения
    public function limitation()
    {
        if (Phpfox::isUser() && Phpfox::getUserBy('age') < 18 || empty($_COOKIE['DANFA']))
        {
            return Phpfox::isUser() ? (((int) Phpfox::getUserBy('age') < 18) ? 1 : null) : 2;
        }

        return false;
    }
    # Проверка возраста ограничения END        

В этом же модуле создаем ещё два файла:
  • common.css - залить в папку: module/common/static/css/default/default/.
  • common.js - залить в папку: module/common/static/jscript/.
Содержимое файла common.css:

Код: Выделить всё

/* Ограничение возраста */
#window 
{
    width:         300px; 
    height
:        80px;
    border-radius: 5px;
    border:        3px #000000 solid;
    background:    #FFFFFF;
    position:      fixed;
    top:           45%;
    left:          50%;
    margin-top:    -150px;
    margin-left:   -150px;
    display:       none;
    z-index:       10;
    padding:       10px;
}

#overlay 
{
    z-index:          9;
    position:         fixed;
    background-color: #000000;
    opacity:          0.9;
    width:            100%; 
    height
:           100%;
    top:              0;
    left:             0;
    display:          none;
}

.
answer
{
    padding: 10px 2px;
}
/* Ограничение возраста END */

Содержимое файла common.js:

Код: Выделить всё

/* Ограничение возраста */
$(document).ready(function() {
    if ($('#overlay').length > 0 && $('#window').length > 0) {
        $('#overlay').fadeIn(1000, function() {
            $('#window') 
                
.css('display', 'block')
                .animate({opacity: 2, top: '50%'}, 1000);
        });
    };
});

$(
'#true').click(function() {
    cleaning();
    $.cookie('DANFA', 'limitation');

    return false;
});

$(
'#false').click(function() {
    location.href='/';

    return false;
});

function cleaning() {
    $('#window').animate({opacity: 0, top: '45%'}, 1000, function() {
        $(this).css('display', 'none');
        $('#overlay').fadeOut(1000);
    });
};
/* Ограничение возраста END */

Теперь эти два файла надо подключить. Я их подключил в include/library/phpfox/phpfox/phpfox.class.php. Значит, открываем файл phpfox.class.php, находим:

Код: Выделить всё

            if (!defined('PHPFOX_IS_AD_PREVIEW') && !defined('PHPFOX_IN_DESIGN_MODE') && !defined('PHPFOX_INSTALLER') && Phpfox::getParam('core.site_wide_ajax_browsing'))
            {
                $oTpl->setHeader('cache', array('jquery/plugin/jquery.address.js' => 'static_script'));
            

Ниже добавляем:

Код: Выделить всё

            # Модуль common
            if (Phpfox::isModule('common'))
            {
                $oTpl->setHeader('cache', array(
                    'common.css' => 'module_common',
                    'common.js'  => 'module_common'
                    )
                );
            

Теперь создаем шаблон модального окна: module/common/template/default/block/limitation.html.php:

Код: Выделить всё

{if isset($limitation)}
    <div id="window">
    {if $limitation == 1}
        {phrase var='common.limitation_prohibition'}
        <div class="answer">
            <form>
                <input type="submit" value="{phrase var='common.yes'}" id="false" class="button">
            </form>
        </div>
    {else}
        {phrase var='common.limitation_warning'}
        <div class="answer">
            <form>
                <input type="submit" value="{phrase var='common.yes'}" id="true" class="button">
                <input type="submit" value="{phrase var='common.no'}" id="false" class="button">
            </form>
        </div>
    {/if}
    </div>
    <div id="overlay"></div>
{/if}

Тут я исправил фразы common.limitation_prohibition и common.limitation_warning, то есть изменил модуль к которому они принадлежат, с pages на common, а так же добавил слова Да и Нет (common.yes | common.no).
Вот собственно и все. Чистим кэш, проверяем работу.
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Ограничение к контенту по возрасту пользователя (phpFOX)

Сообщение Slash » Чт окт 27, 2016 10:29 am

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

Начнем с добавления фразы, я добавлю в свой модуль такую фразу:
common.mature_content:
  • Фраза для русского языка - Контент для взрослых?
  • Фраза для английского языка - Mature content?
Теперь открываем: module/pages/template/default/controller/add.html.php, находим:

Код: Выделить всё

            <div class="table">
                <div class="table_left">
                    {phrase var='pages.use_timeline'}
                </div>
                <div class="table_right">
                    <input type="radio" value="1" name="val[use_timeline]" {value type='radio' id='use_timeline' default='1' selected='true'} id="rdo_timeline_1"> <label for="rdo_timeline_1">{phrase var='pages.yes'}</label>
                    <input type="radio" value="0" name="val[use_timeline]" {value type='radio' id='use_timeline' default='0'} id="rdo_timeline_0"> <label for="rdo_timeline_0">{phrase var='pages.no'}</label>
                </div>
            </div>

Ниже добавляем:

Код: Выделить всё

            <div class="table">
                <
div class="table_left">
                    {
phrase var='common.mature_content'}
                </
div>
                <
div class="table_right">
                    <
input type="radio" value="1" name="val[limitation]" {value type='radio' id='limitation' default='1'id="limitation_1"> <label for="limitation_1">{phrase var='common.yes'}</label>
                    <
input type="radio" value="0" name="val[limitation]" {value type='radio' id='limitation' default='0' selected='true'id="limitation_0"> <label for="limitation_0">{phrase var='common.no'}</label>
                </
div>
            </
div>     

Открываем: module/pages/include/service/process.class.php, находим:

Код: Выделить всё

        if (isset($aVals['use_timeline']))
        {
            $aUpdate['use_timeline'] = (int) $aVals['use_timeline'];
        }

Добавляем ниже:

Код: Выделить всё

        if (isset($aVals['limitation']))
        {
            $aUpdate['limitation'] = (int) $aVals['limitation'];
        }

Теперь очищаем кэш сайта и проверяем работу. Готово.

В поле limitation теперь будут значения 0 - ограничение отключено, 1 - ограничение включено.

Результат:
Ограничение к контенту по возрасту пользователя phpFOX  - 18+.jpg
 

Вернуться в «phpFOX»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость