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

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

С нами с 19 декабря 2015; Место в рейтинге пользователей: #15
Александр Туниеков
19 ноября 2019, 22:13
0
Мда… понимания что происходит 0.
И getCollection и getObject по $criteria готовят запрос в mysql. Для такого критерия он будет примерно таким для getCollection и $getted_id=2:
select * from modx_site_content where parent = 2 sort by createdon DESC
А getObject просто добавит limit=1
select * from modx_site_content where parent = 2 sort by createdon DESC limit=1
веть он все равно получить данные и будет их сортировать
Данные обрабатывает сортирует mysql сервер. Он это делает эффективнее, чем мы можем сделать в php. И в getObject они точно не сортируются.
Так вот, отличие getCollection и getObject ДЛЯ ДАННОГО ПРИМЕРА то, что getCollection заберет все записи с базы и займет кучу памяти, а getObject только одну и памяти понадобиться гораздо меньше.
И getCollection и getObject кроме запроса в mySQL делают, что-то еще, например проверяют есть ли доступ у юзера к объекту, но что конкректно я не разбирался и разбираться, в общем-то, не собираюсь :-). Только если что-то не так пойдет смотрю код функций. Важно только то, что getCollection и getObject выгружают данные с базы в виде xpdo объекта. Делать mySQL запросы напрямую не слишком удобно. Но если скрипт тупит или по памяти вылетает, то использую вместо getCollection getIterator или $modx->query($sql).
матан и sql отсутствует!
sql вам знать надо! учите.
Александр Туниеков
19 ноября 2019, 21:26
0
На сколько %% реально повышает скорость сайта и индекс PageSpeed?
Эффективно ли это приложение, имеет ли смысл его купить?
Как обычно автор о том как работает, что внутри его компонента происходит ничего не написал. На тестовом модхост тестить бессмыслено. Так как надо с каким-то рабочим контентом тестить. А платить 4950р, чтоб потестить не вариант. То есть, по итогу, это кот в мешке, что купишь не известно.
Придумать бы, для подобный компонентов, какой-нибудь вариант покупки типа триала.
Александр Туниеков
19 ноября 2019, 20:31
1
+2
1. Отключить 0 (Нет) из выборки
Можно параметры фильтра на mFilter2 передавать с этим фильтрами и без них.
{if true}
    {set $filter = 'parent:grandparents,ms|new,ms|favorite'}
{else}
    {set $filter = 'parent:grandparents'}
{/if}
{'!mFilter2' | snippet : [ 'filters'=>$filter]}
2. Как сгругипировать несколько параметров и обернуть единой оберткой (присвоить единый заголовок оберткой)
&toSeparatePlaceholders Работает так же как и &toPlaceholders, только в раздельные плейсхолдеры попадает еще и filters. Например, если вы укажете &toSeparatePlaceholders=`my.` и &filters=`tv|test,resource|pagetitle` то получите плейсхолдеры [[+my.results]], [[+my.total]], [[+my.tv|test]] и [[+my.resource|pagetitle]].
Выводим в плейсхолдеры и
{if 'my.ms|new' placeholder || 'my.ms|favorite' placeholder}
    <div>
        <h3>You own title</h3>
        {'my.ms|new' placeholder}
        {'my.ms|favorite' placeholder}
    </div>
{/if}
Может конечно решение получше, но мне только такое пришло в голову.
Александр Туниеков
19 ноября 2019, 19:56
0
А где компонент? По последней ссылке Error 521
Александр Туниеков
19 ноября 2019, 19:45
0
Чтот я не понял зачем получать коллекцию если нужен то 1 объект???
Можно же просто так
<?php
$getted_id = (int)$modx->getOption('getted_id', $scriptProperties, false);

$criteria = $modx->newQuery('modResource');
$criteria->sortby('createdon', 'DESC');
$criteria->where(array('parent' => $getted_id));

if($doc = $modx->getObject('modResource', $criteria))
    return $doc->get('createdon');
return;
Все равно и getCollection и getObject просто готовят запрос mysql Ну грубо говоря :-(
Александр Туниеков
18 ноября 2019, 22:46
0
А чем логика отображения от логики приложения отличается? Или может все таки граница размыта?
Александр Туниеков
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 и от нее отталкиваться.