Странно работает плагин.

Добрый вечер. Узнаю, изучаю MODX и решила сама попробовать написать плагин. Плагин простой.
На сайте есть два контекста web и weben. Я хочу: если я в административной панели залогинена, то показывать панельку во фронте(в web, weben). Но она показывается только в weben. Поискав на сайтах, поняла, что нужно чтоб авторизация происходила во всех контекстах и нашла код:
if ($modx->event->name == 'OnWebPageInit') {
    if (!$modx->user->hasSessionContext('web') && $modx->user->hasSessionContext('mgr') && $modx->user->isMember('Administrator')) {
        $modx->user->addSessionContext('web');
    } elseif ($modx->user->hasSessionContext('web') && !$modx->user->hasSessionContext('mgr') && $modx->user->isMember('Administrator')) {
        $modx->user->removeSessionContext('web');
    }
}
Но с сочетаем с другим плагином:
<?php
if ($modx->event->name == 'OnWebPagePrerender') {

    $users = trim($modx->getOption('panel_users'));
    $users_arr = array_map('trim', explode(',', $users));
    $register = ($users == '' && $modx->user->hasSessionContext('mgr')) ||
        ($modx->user->id > 0 && in_array($modx->user->id, $users_arr));

    if ($register) {

        $html = '
                <div class="section edit-panel">
                    <div class="container">
                        <ul class="nav nav-inline">
                            <li><a href="/backend/index.php?a=resource/update&id=' . $modx->resource->id . '">Редактировать страницу</a></li>
                            <li><a href="/backend/?a=resource/create">Добавить страницу</a></li>
                    </div>
                </div>';

        if (strpos($modx->resource->_output, '<body>') !== false) {
            $modx->resource->_output =
                preg_replace("#(<body>)#i", $html . "\n\\1", $modx->resource->_output, true);
        } else {
            $modx->resource->_output .= $html;
        }

    }

}
Панелька начинает странно работать и выкидывает из административной части(бэкенде), если обновить страницу во фронте. Но панель начала показываться в двух контекстах. Подскажите пожалуйста, как нужно объеденить два плагина, чтоб панелька появлялась в двух контекстах, если я авторизована в бэкенде и при выходе из бэкенде исчезала.
Виктория Жарова
04 июля 2018, 16:54
modx.pro
763
0

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

DocentBF
04 июля 2018, 20:41
0
Попробуйте проверять только на авторизацию в контексте mgr:
<?php
if(!$modx->user->hasSessionContext('mgr')) return;
if($modx->event->name = ...
    Виктория Жарова
    05 июля 2018, 08:48
    0
    Писала так:
    <?php
    if ($modx->event->name == 'OnWebPagePrerender') {
    if (!$modx->user->isAuthenticated('mgr')) {return;}
        
    $html = '
    <div class="section edit-panel">
    <div class="container">
    <ul class="nav nav-inline">
    <li><a href="/backend/index.php?a=resource/update&id='.$modx->resource->id.'">Редактировать страницу</a></li>
    <li><a href="/backend/?a=resource/create">Добавить страницу</a></li>
    </div>
    </div>';
    if (false !== strpos($modx->resource->_output, '<body>')) {
    $modx->resource->_output = str_replace("<body>", "<body>" .$html, $modx->resource->_output);
    	} 
    else {
    $modx->resource->_output = str_replace('<body class="blue">', '<body class="blue">' .$html, $modx->resource->_output); 
    	}
    }
    Появляется только в одном контексте.(((

      Володя
      05 июля 2018, 09:25
      0
      в вашем случае лучше/ проще добавить этот html в шаблон.
      Не нужно ломать голову над плагином, не будет возможных проблем с кэшированием контента…
      Если пользуете феном, всю логику можно поместить в чанк, если нет написать простой сниппет обертку.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3