Александр Туниеков

Александр Туниеков

С нами с 19 декабря 2015; Место в рейтинге пользователей: #15
Александр Туниеков
18 ноября 2019, 21:54
0
{!CustomFilter2 | snippet : Array ( [class] => msProduct [element] => msProducts [limit] => 40 [sortby] => Array ( [availability] => ASC [image] => DESC ) [tpls] => @FILE chunks/catalog/_item.col.tpl [suggestions] => [tplOuter] => @FILE chunks/catalog/_outer.tpl [showEmptyFilters] => [filter_delimeter] => - [mse2_frontend_js] => /assets/scripts/mseach2.js [showHidden] => 1 [cache] => 1 [minQuery] => 1 [ajax] => 1 [aliases] => ms-brand==brand, ms-country==country, ms-price==price, ms-weight==weight, ms-size_width==width, ms-size_height==height, ms-size_depth==depth, ms-power==power, ms-voltage==voltage, ms-availability==availability, ms-equipment_type==equipment_type, msoption-size==size, msoption-color==color, ms-favorite==favorite [filters] => ms-favorite:boolean, ms-availability, ms-brand, ms-country, ms-price:number, ms-weight:number, ms-size_width:number, ms-size_height:number, ms-size_depth:number, ms-power:number, ms-voltage, -msoption-size, -msoption-color [tplFilter.outer.default] => @FILE chunks/catalog/_filter.checkbox.outer.tpl [tplFilter.row.default] => @FILE chunks/catalog/_filter.checkbox.row.tpl [tplFilter.outer.price] => @FILE chunks/catalog/_filter.number.outer.tpl [tplFilter.outer.weight] => @FILE chunks/catalog/_filter.number.outer.tpl [tplFilter.outer.width] => @FILE chunks/catalog/_filter.number.outer.tpl [tplFilter.outer.height] => @FILE chunks/catalog/_filter.number.outer.tpl [tplFilter.outer.depth] => @FILE chunks/catalog/_filter.number.outer.tpl [tplFilter.outer.power] => @FILE chunks/catalog/_filter.number.outer.tpl [tplFilter.outer.size] => @FILE chunks/catalog/_filter.size.outer.tpl [tplFilter.outer.color] => @FILE chunks/catalog/_filter.color.outer.tpl [tplFilter.row.price] => @FILE chunks/catalog/_filter.number.row.tpl [tplFilter.row.weight] => @FILE chunks/catalog/_filter.number.row.tpl [tplFilter.row.width] => @FILE chunks/catalog/_filter.number.row.tpl [tplFilter.row.height] => @FILE chunks/catalog/_filter.number.row.tpl [tplFilter.row.depth] => @FILE chunks/catalog/_filter.number.row.tpl [tplFilter.row.power] => @FILE chunks/catalog/_filter.number.row.tpl [tplFilter.row.availability] => @FILE chunks/catalog/_filter.availability.row.tpl [tplFilter.row.color] => @FILE chunks/catalog/_filter.color.row.tpl [tplPageFirst] => [tplPageLast] => [tplPageFirstEmpty] => [tplPageLastEmpty] => [tplPagePrevEmpty] => [tplPageNextEmpty] => ) }	133	0.6674600	1.1214080
mFilter2 переделанный кем-то. 88529 ресурсов. Ну это уже оптимизированные сайты. На них уже не так тупит.
Александр Туниеков
18 ноября 2019, 21:32
0
1	[[!tmFilters? &filterOuterTpl=`public. tm2_filterOuterTpl` &filterTpl=`public. tm2_filterTpl` &filterNumericOuterTpl=`public. tm2_filterOuterTpl` &filterNumericTpl=`public. tm2_filterNumericTpl` &jsMap=`1` &jsScript=`1` &style=`0` &toPlaceholder=`filters` &categoryId=`[[!getCurrentCategoryID]]` &parents=`[[!getCurrentCategoryID]]` ]]	3	0.0017819	1.7729151
2	[[!tmCatalog? &tvFilters=`[[!getAutomaticProductParamType? return=`json` &tvid=`57,58`]]` ]]	4	0.0014601	0.3016510
Вот данные с тагманегер. Всего 30 000 ресурсов.
1.7729151 немного. но почему-то временами втупляет до 10с
Александр Туниеков
16 ноября 2019, 23:44
0
У меня, сейчас, клиент просит ускорить сайт. И, причем, за небольшие деньги. Соблазняюсь идеей, для тяжелых страниц, сложить в кеш уже сгенерированный код HTML и отдавать его при запросе страницы без get и post параметров. У клиента tagmanager2 втупляет на большом числе товаров. НО как страница загрузилась работает уже быстро. НО и сломать может. mFilter2 такой метод точно сломает (Он свои настройки в сессии хранит. Со статическим кешем сниппет не выполниться и сессия окажется пустой.)
первому посетителю придется ждать десятки секунд
Что у вас такого тяжелого на странице выполняется? Хочется сделать какое-нибудь универсальное решение проблемы, если это возможно. Действительно тяжелые это фильтры товаров. Какие еще тяжелые сниппеты или случаи есть?
Александр Туниеков
16 ноября 2019, 21:57
+1
ЭЭ… вообще-то тривиально.
$modx->user->get("id");
MODX при инициализации опознает юзера.
Александр Туниеков
16 ноября 2019, 21:54
0
Все не могу въехать в логику решения. По моему ты что-то в описании пропустил. Может у тебя 1 страница которая грузиться десятки секунд, а ты пользователю показываешь 2 страницу с твоим сниппетом, который уже показывает распарсенную 1 страницу?
Александр Туниеков
16 ноября 2019, 21:45
0
Не пихайте логику во вьюхи. Это бад практис! Перенесите логику в сниппет и вызывайте его на странице.
В MODX не вьюхи, а чанки. То есть, MODX, вообще-то, не придерживается паттерна MVC.
Конечно, в чанки не стоит пихать код, но часто бывает так значительно проще. Например, как тут.
Александр Туниеков
16 ноября 2019, 21:31
+1
А я вот modHelpers не пользуюсь. Пробегался по диагонали по его функциям. Такое впечатление, что это просто синтаксический сахар. То есть, ничего особо полезного не несет. Просто сокращает имена функций MODX. В итоге, и надо знать функции MODX и еще учить синтаксис modHelpers. Что мне не особо хочется.
Плюс, для совместной работы, надо придерживаться единообразного стиля программирования. Синтаксис php, MODX и fenom знаком многим. А вот modHelpers редко встречается. И, соответственно, его не стоит использовать. Это помешает другим работать над проектом.
Александр Туниеков
16 ноября 2019, 03:40
0
Проверил save(true) не работает :-(
А где делается кеш при загрузке странице в упор не могу найти
Александр Туниеков
16 ноября 2019, 03:26
0
Вот такой вот многослойный торт.
Что-то торт слишком многослойный. Решение в теме выглядит бессмыслицей О_О. И в коммент «Смысл в быстродействии» тоже не въехать.
Я бы, наверно, поставил в крон что-то типа
$res_id = 1; // id нужного ресурса
define('MODX_API_MODE', true);
require_once $_SERVER['DOCUMENT_ROOT']."/index.php";

if($res = $modx->getObject("modResource",$res_id){
   $res->save(true);
}
из core\model\modx\modresource.class.php
public function save($cacheFlag= null) {
...
При сохранении ресурса с флагом $cacheFlag= true, кеш ресурса обновляется. Этим занимается метод toCache в core\xpdo\xpdo.class.php.
Наверно, можно при сохранении ресурса в админке сразу создавать его кеш. Переделав плагин Василия bezumkin.ru/sections/tips_and_tricks/351/. Только говорят кеш в MODX чистится весь из-за каких-то проблем. И не понятно, какие проблемы могут возникнуть, если кеш делать при сохранении в админке.
Александр Туниеков
15 ноября 2019, 21:55
0
Может path влияет
www.php.net/manual/ru/function.setcookie.php
path
Путь к директории на сервере, из которой будут доступны cookie. Если задать '/', cookie будут доступны во всем домене domain. Если задать '/foo/', cookie будут доступны только из директории /foo/ и всех ее поддиректорий (например, /foo/bar/) домена domain. По умолчанию значением является текущая директория, в которой cookie устанавливается.
Александр Туниеков
15 ноября 2019, 20:54
0
Рад что помог :-). Спасибо скинуть это хорошо :-). В моем профиле кнопка «Отправить деньги». Но на мат.вознаграждение не рассчитывал :-). И если что-то отправите, то все по вашему желанию :-)
Александр Туниеков
15 ноября 2019, 20:22
0
А if тут не самый лучший выбор. github.com/fenom-template/fenom/blob/master/docs/ru/tags/switch.md
{switch $idx % 7}
{case 1, 2}
    ...
{case 3}
    ...
{case default}
    ...
{/switch}
Александр Туниеков
15 ноября 2019, 19:34
+1
jquery $.post знаете? :-) на стороне сервера делаете скрипт, что вытаскивает данные и по ajax с него выдергиваете данные. А точных инструкций не дам. Вариантов реализации куча. Например можно посмотреть реализацию ajaxForm и от нее отталкиваться.
Александр Туниеков
15 ноября 2019, 19:23
0
проверте таблицу modx_access_category
Она по идее должна быть пустой. Если там что-то есть, то вы наверно доступ манагерам к категориям элементов ограничивали. То есть, кому-то дали права а остальным облом. В том числе и анонимам. Если я, конечно, верно код интерпритировал. Доступ к категориям редактируется здесь yadi.sk/i/4CM-C0bYWRRFjg
Если у кого-то доступ настроен, то надо и анонимам сделать аналогично. Только контекст на web поменять.
Александр Туниеков
15 ноября 2019, 18:04
0
Не хватает инфы :-( сделайте
$this->xpdo->log(xPDO::LOG_LEVEL_DEBUG, "policy ".print_r($policy,1)."\r\n class ".$this->_class."\r\n id ".$this->getPrimaryKey());
У меня лог
[2019-11-15 17:56:56] (DEBUG @ D:\OpenServer\domains\modx.loc\core\model\modx\modaccessibleobject.class.php : 220) policy Array
(
)

 class modSnippet
 id 126
modAccessCategory не к сниппетам относятся вроде
Александр Туниеков
15 ноября 2019, 17:31
+1
После добавления товара сервер возвращает yadi.sk/i/NW-_BneWewTiXw
То есть, никаких данных о товаре. Вам либо ajax в вытаскиванием данных из корзины и базы либо собирать данные со страницы.
Александр Туниеков
15 ноября 2019, 17:11
0
Так! Должно быть сначала массив $policy и затем Principal 0 does not have permission to load object of class modSnippet и так повторяться несколько раз.
Ищите в логе Principal 0 does not have permission to load object of class modSnippet и сюда часть рядом с ними. Если рядом массивов нет, то не прогружается сессия.
Александр Туниеков
15 ноября 2019, 17:00
0
А нет у нас
if ($criteria && $this->xpdo instanceof modX && $this->xpdo->getSessionState() == modX::SESSION_STATE_INITIALIZED) {
и yadi.sk/i/LxtgR47-77XUMg
То есть, сессия не прогружается и права false.
В modsessionhandler.class.php после $this->session= $this->modx->getObject('modSession', array('id' => $id), $this->cacheLifetime); строка 159 ставим
$this->modx->log(modX::LOG_LEVEL_INFO, "autoCreate $autoCreate session ".print_r($this->session->toArray(),1));
Александр Туниеков
15 ноября 2019, 16:39
0
Это вот функция
public static function _loadInstance(& $xpdo, $className, $criteria, $row) {
        /** @var modAccessibleObject $instance */
        $instance = xPDOObject :: _loadInstance($xpdo, $className, $criteria, $row);
        if ($instance instanceof modAccessibleObject && !$instance->checkPolicy('load')) {
            if ($xpdo instanceof modX) {
                $userid = $xpdo->getLoginUserID();
                if (!$userid) $userid = '0';
                $xpdo->log(xPDO::LOG_LEVEL_INFO, "Principal {$userid} does not have permission to load object of class {$instance->_class} with primary key: " . (is_object($instance) && method_exists($instance,'getPrimaryKey') ? print_r($instance->getPrimaryKey(), true) : ''));
            }
            $instance = null;
        }
        return $instance;
    }
То есть 0 это просто id юзера.
Скорее всего валится на $instance->checkPolicy('load'). Открываем core\model\modx\modsnippet.class.php. Там ничего такого нет но class modSnippet extends modScript
Вообщем участвуют 2 метода
modaccessibleobject.class.php
public function checkPolicy($criteria, $targets = null, modUser $user = null) {
        if(!$user){
            $user = & $this->xpdo->user;
        }
        if ($criteria && $this->xpdo instanceof modX && $this->xpdo->getSessionState() == modX::SESSION_STATE_INITIALIZED) {
            if ($user->get('sudo')) return true;
            if (!is_array($criteria) && is_scalar($criteria)) {
                $criteria = array("{$criteria}" => true);
            }
            $policy = $this->findPolicy();
            if (!empty($policy)) {
                $principal = $user->getAttributes($targets);
                if (!empty($principal)) {
                    foreach ($policy as $policyAccess => $access) {
                        foreach ($access as $targetId => $targetPolicy) {
                            foreach ($targetPolicy as $policyIndex => $applicablePolicy) {
                                if ($this->xpdo->getDebug() === true)
                                    $this->xpdo->log(xPDO::LOG_LEVEL_DEBUG, 'target pk='. $this->getPrimaryKey() .'; evaluating policy: ' . print_r($applicablePolicy, 1) . ' against principal for user id=' . $user->id .': ' . print_r($principal[$policyAccess], 1));
                                $principalPolicyData = array();
                                $principalAuthority = 9999;
                                if (isset($principal[$policyAccess][$targetId]) && is_array($principal[$policyAccess][$targetId])) {
                                    foreach ($principal[$policyAccess][$targetId] as $acl) {
                                        $principalAuthority = intval($acl['authority']);
                                        $principalPolicyData = $acl['policy'];
                                        $principalId = $acl['principal'];
                                        if ($applicablePolicy['principal'] == $principalId) {
                                            if ($principalAuthority <= $applicablePolicy['authority']) {
                                                if (!$applicablePolicy['policy']) {
                                                    return true;
                                                }
                                                if (empty($principalPolicyData)) $principalPolicyData = array();
                                                $matches = array_intersect_assoc($principalPolicyData, $applicablePolicy['policy']);
                                                if ($matches) {
                                                    if ($this->xpdo->getDebug() === true)
                                                        $this->xpdo->log(modX::LOG_LEVEL_DEBUG, 'Evaluating policy matches: ' . print_r($matches, 1));
                                                    $matched = array_diff_assoc($criteria, $matches);
                                                     if (empty($matched)) {
                                                        return true;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                return false;
            }
        }
        return true;
    }
и modelement.class.php
public function findPolicy($context = '') {
        $policy = array();
        $enabled = true;
        $context = !empty($context) ? $context : $this->xpdo->context->get('key');
        if ($context === $this->xpdo->context->get('key')) {
            $enabled = (boolean) $this->xpdo->getOption('access_category_enabled', null, true);
        } elseif ($this->xpdo->getContext($context)) {
            $enabled = (boolean) $this->xpdo->contexts[$context]->getOption('access_category_enabled', true);
        }
        if ($enabled) {
            if (empty($this->_policies) || !isset($this->_policies[$context])) {
                $accessTable = $this->xpdo->getTableName('modAccessCategory');
                $policyTable = $this->xpdo->getTableName('modAccessPolicy');
                $categoryClosureTable = $this->xpdo->getTableName('modCategoryClosure');
                $sql = "SELECT Acl.target, Acl.principal, Acl.authority, Acl.policy, Policy.data FROM {$accessTable} Acl " .
                        "LEFT JOIN {$policyTable} Policy ON Policy.id = Acl.policy " .
                        "JOIN {$categoryClosureTable} CategoryClosure ON CategoryClosure.descendant = :category " .
                        "AND Acl.principal_class = 'modUserGroup' " .
                        "AND CategoryClosure.ancestor = Acl.target " .
                        "AND (Acl.context_key = :context OR Acl.context_key IS NULL OR Acl.context_key = '') " .
                        "ORDER BY CategoryClosure.depth DESC, target, principal, authority ASC";
                $bindings = array(
                    ':category' => $this->get('category'),
                    ':context' => $context,
                );
                $query = new xPDOCriteria($this->xpdo, $sql, $bindings);
                if ($query->stmt && $query->stmt->execute()) {
                    while ($row = $query->stmt->fetch(PDO::FETCH_ASSOC)) {
                        $policy['modAccessCategory'][$row['target']][] = array(
                            'principal' => $row['principal'],
                            'authority' => $row['authority'],
                            'policy' => $row['data'] ? $this->xpdo->fromJSON($row['data'], true) : array(),
                        );
                    }
                }
                $this->_policies[$context] = $policy;
            } else {
                $policy = $this->_policies[$context];
            }
        }
        return $policy;
    }
В modaccessibleobject.class.php после $policy = $this->findPolicy(); строка 219 вставляем
$this->xpdo->log(xPDO::LOG_LEVEL_DEBUG, "policy ".print_r($policy->toArray(),1));
Прогружаем страницу и смотрим лог.
Александр Туниеков
15 ноября 2019, 16:03
+2
Вообщем работа с правами реализована в \core\model\modx\modaccessibleobject.class.php
Там логов полно, но на debug уровне. То есть, в системных настройка ставим log_level = 4 и смотрим что происходит.