Кудашев Сергей

Кудашев Сергей

Был в сети 24 сентября 2019, 20:46
Заказы не принимаю
Ну вообще проще всего отлаживать заменяя начало кода плагина:
if ($modx->event->name == 'OnWebPagePrerender') {
    if ($modx->getOption('lastmodified.prevent_authorized') && ($modx->user->get('username') !== '(anonymous)')) {
        return '';
    }

    if (!empty($modx->getOption('lastmodified.prevent_session'))) {
        $prevent = array_map(function ($s) {return strtolower(trim($s));}, explode(',', $modx->getOption('lastmodified.prevent_session')));
        if (empty($prevent)) {
            $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: incorrect prevent session list. Check configuration.');
            return '';
        }

        $sessionkeys = array_map(function ($s) {return strtolower(trim($s));}, array_keys($_SESSION));

        if (array_intersect($prevent, $sessionkeys)) {
            return '';
        }
    }

    $dtm = $modx->resource->get('editedon') ? strtotime($modx->resource->get('editedon')) : strtotime($modx->resource->get('createdon'));
    if (empty($dtm)) {
        return '';
    }

    $rule = trim($modx->getOption('lastmodified.response'));

    if (!in_array($rule, ['private', 'public'])) { // 'no-cache'
        $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: wrong response directive value. Check configuration.');
        return '';
    }
на:
if ($modx->event->name == 'OnWebPagePrerender') {
    $modx->log(modX::LOG_LEVEL_ERROR, 'In plugin');
    if ($modx->getOption('lastmodified.prevent_authorized') && ($modx->user->get('username') !== '(anonymous)')) {
        return '';
    }
    $modx->log(modX::LOG_LEVEL_ERROR, 'After authorized');
    if (!empty($modx->getOption('lastmodified.prevent_session'))) {
        $prevent = array_map(function ($s) {return strtolower(trim($s));}, explode(',', $modx->getOption('lastmodified.prevent_session')));
        if (empty($prevent)) {
            $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: incorrect prevent session list. Check configuration.');
            return '';
        }

        $sessionkeys = array_map(function ($s) {return strtolower(trim($s));}, array_keys($_SESSION));

        if (array_intersect($prevent, $sessionkeys)) {
            return '';
        }
    }
    $modx->log(modX::LOG_LEVEL_ERROR, 'After prevent');
    $dtm = $modx->resource->get('editedon') ? strtotime($modx->resource->get('editedon')) : strtotime($modx->resource->get('createdon'));
    if (empty($dtm)) {
        return '';
    }
ob_start();
var_dump($dtm);
$contents = ob_get_contents();
ob_end_clean();
error_log(print_r($contents,1), 3, $modx->getOption(xPDO::OPT_CACHE_PATH).'logs/error.log');
    $rule = trim($modx->getOption('lastmodified.response'));

    if (!in_array($rule, ['private', 'public'])) { // 'no-cache'
        $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: wrong response directive value. Check configuration.');
        return '';
    }
    $modx->log(modX::LOG_LEVEL_ERROR, 'After check');
То есть он после каждого условия пишет в лог на уровне ошибки, прошел он по условию или нет. После чего еще и логирует дату документа. Очень удобно бывает посмотреть :)

P.S. Мне кажется, вы просто под зарегистрированным юзером тестируете, а теперь он по умолчанию не отрабатывает для зарегистрированных. Так же он не будет отрабатывать, если minishop2 стоит. В настройках выключите prevent_authorized и prevent_session поле очистите и посмотрите, будет ли работать.
Ну если что вдруг не заработает или еще какое-то странное поведение, пишите :)

В плагине сейчас принудительно отключается любая обработка 304 заголовков для авторизованных пользователей (кстати, спасибо за эту идею :) ), плюс можно принудительно запретить обработку если в сессиии встречается какая-то переменная. Для пакета Office она так и будет называться, просто в настройках обновленной версии в prevent_session прописываете office и все, перестанет обрабатываться.
@Василий Наумкин Как то странно работает для некоторый пользователей, например начинаю поиск по «Илья Александрович», в выпадающем списке он появляется, выбираю его и вместо пользователя в редакторе получается вот такая вещь (она же остается в таком виде и после сохранения): @Илья Александрович@gmail.com

Ссылка на пользователя не активна, уведомления скорее всего не уходят. Мне кажется это связано с почтой в имени.
Сергей, не хотите доступ давать к рабочему проекту, не проблема. Сделайте чистый проект на этом хостинге и пришлите доступ. Я так понимаю дело в любом случае в хостинге и хотелось бы сначала исключить какую-то «особенную» работу плагина, а потом уже развлекаться с настройками. Вы так меньше времени потеряете :)
Сергей, у меня не так много времени есть, и если мы так с Вами дальше пойдем, то это очень надолго затянется. Если есть возможность отправьте пожалуйста доступ к админке на почту мою: kudashevs@gmail.com, мне будет проще так разобраться чем тут переписываться. Можете пароли поменять перед и после, поверьте мне не особо интересно что у Вас там :)
Отлично тогда возвращаем все как было и меняем верхнюю часть:
if ($modx->event->name == 'OnWebPagePrerender') {
    if ($modx->getOption('lastmodified.prevent_authorized') && ($modx->user->get('username') !== '(anonymous)')) {
        return '';
    }

    if (!empty($modx->getOption('lastmodified.prevent_session'))) {
        $prevent = array_map(function ($s) {return strtolower(trim($s));}, explode(',', $modx->getOption('lastmodified.prevent_session')));
        if (empty($prevent)) {
            $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: incorrect prevent session list. Check configuration.');
            return '';
        }

        $sessionkeys = array_map(function ($s) {return strtolower(trim($s));}, array_keys($_SESSION));

        if (array_intersect($prevent, $sessionkeys)) {
            return '';
        }
    }

    $dtm = $modx->resource->get('editedon') ? strtotime($modx->resource->get('editedon')) : strtotime($modx->resource->get('createdon'));
    if (empty($dtm)) {
        return '';
    }

    $rule = trim($modx->getOption('lastmodified.response'));

    if (!in_array($rule, ['private', 'public'])) { // 'no-cache'
        $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: wrong response directive value. Check configuration.');
        return '';
    }
на:
if ($modx->event->name == 'OnWebPagePrerender') {
    $modx->log(modX::LOG_LEVEL_ERROR, 'In plugin');
    if ($modx->getOption('lastmodified.prevent_authorized') && ($modx->user->get('username') !== '(anonymous)')) {
        return '';
    }
    $modx->log(modX::LOG_LEVEL_ERROR, 'After authorized');
    if (!empty($modx->getOption('lastmodified.prevent_session'))) {
        $prevent = array_map(function ($s) {return strtolower(trim($s));}, explode(',', $modx->getOption('lastmodified.prevent_session')));
        if (empty($prevent)) {
            $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: incorrect prevent session list. Check configuration.');
            return '';
        }

        $sessionkeys = array_map(function ($s) {return strtolower(trim($s));}, array_keys($_SESSION));

        if (array_intersect($prevent, $sessionkeys)) {
            return '';
        }
    }
    $modx->log(modX::LOG_LEVEL_ERROR, 'After prevent');
    $dtm = $modx->resource->get('editedon') ? strtotime($modx->resource->get('editedon')) : strtotime($modx->resource->get('createdon'));
    if (empty($dtm)) {
        return '';
    }
ob_start();
var_dump($dtm);
$contents = ob_get_contents();
ob_end_clean();
error_log(print_r($contents."\n",1), 3, $modx->getOption(xPDO::OPT_CACHE_PATH).'logs/error.log');
    $rule = trim($modx->getOption('lastmodified.response'));

    if (!in_array($rule, ['private', 'public'])) { // 'no-cache'
        $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: wrong response directive value. Check configuration.');
        return '';
    }
    $modx->log(modX::LOG_LEVEL_ERROR, 'After check');
И все что выведется в логах разместите пожалуйста здесь.
Можете в плагине заменить
if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
        $ltm = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);

        if ($dtm <= $ltm) {
            $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';
            header($protocol . ' 304 Not Modified');
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $dtm) . ' GMT');
            header('Cache-control: ' . $rule . ', max-age=' . $maxage);
            header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expire));
            exit();
        }
    }
на следующий код
if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
        $ltm = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
        ob_start();
var_dump($ltm);
var_dump($dtm);
$contents = ob_get_contents();
ob_end_clean();
error_log(print_r($contents."\n",1), 3, $modx->getOption(xPDO::OPT_CACHE_PATH).'logs/error.log');
        if ($dtm <= $ltm) {
            $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';
            header($protocol . ' 304 Not Modified');
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $dtm) . ' GMT');
            header('Cache-control: ' . $rule . ', max-age=' . $maxage);
            header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expire));
            exit();
        }
    }
и результат из логов сбросить сюда. В логах должно будет отразиться похожее на:
int(1552381472)
int(1552381432)
Если правильно понял причину проблемы, то необходимые правки внес. Добавил дополнительный параметр, который предупреждает обработку If-Modified-Since в случае, если в именах переменных сессии встречаются определенные названия. В нашем случае это minishop2, о сделан настройкой по умолчанию.

Попробуйте обновить компонент и отписаться здесь по результатам, если не сложно :)
Господа, как автор плагина, хочу обратить ваше внимание, что с проблемами лучше писать в личку или на github.

SEQUEL.ONE посмотрите пожалуйста, выпустил вариант с предотвращение обработки для авторизованных пользователей. В теории, должно решить Вашу проблему.