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

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

С нами с 19 декабря 2015; Место в рейтинге пользователей: #15
Александр Туниеков
26 сентября 2022, 20:48
0
resourceMap либо не генерируется либо его что-то прибивает. Не генерируется значит что то не так с модекс. Что-то прибивает вот здесь modx.pro/solutions/22267 рекомендуют плагин который прибивает
Костыль OnMODXInit ниже может послужить хорошим решением данной проблемы, и будет надёжным подспорьем довольно долгое время.

//  Resource map patch to reduce parse time
  if( ! empty( $modx->context->resourceMap ) ) {
      $options = [ xPDO::OPT_CACHE_KEY => 'context_settings/' . $modx->context->key ];
      if( $val = $modx->getCacheManager()->get( 'context', $options ) ) {
          $val[ 'resourceMap' ] = [];
          $modx->getCacheManager()->set( 'context', $val, 0, $options );
      }
  }
  //--//
Искушённый читатель предложит расширить стандартный класс менеджера кеширования и подменить его. На мой взгляд избавиться от плагина потом проще
Александр Туниеков
26 сентября 2022, 15:39
0
Ну напрямую я редко пишу. Так что не делал и с проблемами не сталкивался. Возможно в этом ничего страшного нет.
А вот через API сталкивался с тем что импорт тупит. Но мне через API проще
Александр Туниеков
26 сентября 2022, 15:03
0
Мнда… не зная ваш скилл пнуть и еще в верном направлении.
Для импорта из эксель надо знать структуру хранения данных в модэкс минишоп. Затем как читать эксель в php. Это PHPOffice или конвертировать эксель в csv и читать в php csv файл. Затем эти данные раскидываешь по полям базы данных с помощью API MODX либо напрямую в базу писать(не рекомендую)
Александр Туниеков
26 сентября 2022, 14:55
0
Я сталкивался хостер порты блокирует.
Александр Туниеков
26 сентября 2022, 14:50
0
в файле \core\cache\context_settings\web\context.cache.php часть массива resourceMap присутствует?
Только метод научного тыка. Смотреть по коду что вообще происходит. Пробовать убирать добавлять что-то и так пока не поймешь в чем причина.
Или modx переставить или сайт заного переписать с обновленным модекс
Александр Туниеков
25 сентября 2022, 17:44
0
файл кеша \core\cache\context_settings\web\context.cache.php
Александр Туниеков
25 сентября 2022, 16:49
0
$resourceMap это карта ресурсов modx. Она генерируется при первой инициализации контекста modx и сохраняется в кеш.
Ошибка значит, что $resourceMap пустая. Проверьте кеш modx. Что там права на запись есть. Почистите кеш. И проверьте чтоб плагины $resourceMap не прибивали. Это иногда рекомендуют на больших сайтах.
Александр Туниеков
23 сентября 2022, 15:35
0
@Артур после вчерашнего разбора mapFilter не сильно выигрывает у mFilter2. Так что его разработка обратно повисла.
Вообще участие в разработке Минишопа меня не сильно интересует. Он меня и в теущем виде устраивает, но вот фильтры для Минишопа интересуют. С ними проблемы есть.
mSearch2 платный компонент и дорабатывать его, чтоб деньги шли левому дяде меня обламывает :-).
Думаю, что участие в разработке бесплатных фильтров для Минишопа, мне интересно. Есть только одно препятствие. Я, обычно, пишу на jQuery. И на ванильный JS не спешу переходить. На jQuery удобней писать и есть мого примеров в интернете. Но если перед глазами будут лучшие примеры кода на ванильном JS, то писать на нем, конечно, смогу.
Примете в комманду? :-)
Александр Туниеков
22 сентября 2022, 08:39
0
Решил описать кеширование mFilter2. Начал здесь https://modx.pro/development/23310
Александр Туниеков
21 сентября 2022, 20:20
0
Ну тогда надо архитектуру как-то менять.
TV rubrika со списком множественного выбора (там несколько значений вида имя1==1||имя2==2||имя3==3) храниться в базе как текст например такой «1||3||13». И ни как запросом LIKE не отличишь 1 от 13.
Нужно список множественного выбора хранить как отдельные значения в таблице. Например tvsuperselect храниться в 2 таблицах и как текст «1||3||13» и в отдельной таблице отдельные значения. Я не помню как именно.
Если использовать tvsuperselect, то, наверно, можно в pdoPage подцепить 2-ю таблицу и написать что-то вроде
[[!pdoPage?
        &parents=`4`
        &loadModels=`tvsuperselect`
        &leftJoin=`{"2-таблица":....}`
        &groupby=`modResource.id`
        &where=`{"2-таблица.value":[[*option]]}`
        &tpl=`RowTpl`
]]
Александр Туниеков
21 сентября 2022, 19:23
+1
Может так
[[!pdoPage?
        &parents=`4`
        &includeTVs=`rubrika`
        &where=`{"rubrika:LIKE":"%[[*option]]%"}`
        &tpl=`RowTpl`
]]
если значения rubrika меньше 10 должно ловить. Если больше 10, то на option=1 словит и 1 и 10 и 11 и т.д.
Александр Туниеков
21 сентября 2022, 18:44
0
Не быстрее. Так только от 1 запроса на картинку избавишься. По идее самый быстрый вариант подцепить парент титле и картинку в pdoResource. На 99% уверен. Но, конечно, если гнаться за скоростью, надо тестировать все варианты и на практике смотреть уже.
Александр Туниеков
21 сентября 2022, 16:51
0
Не знаю как в прошлый раз тестировал. Тогда в моем компоненте mapFilter загрузка с подсчетом результатов на 10т товавов в каталоге выдавало около 10с, а сейчас первая загрузка около 1,2с а вторая с кешем mysql 0.0769041: Total time. (В каталоге 10т. товаров — это самый большой каталог. Всего товаров на сайте 27т.). Правда сейчас я чуть подшаманил и запрос делаю только для 1 каталога.
А вот прокешированный mFilter2 на этом же каталоге при загрузке из кеша массива ids ресурсов тратит 1.7866640: Total time. И при выборе какого-то фильтра делает suggestions 25с.
mapFilter:

mFilter2:


То есть mapFilter работает все таки быстрее mFilter2. И имеет смысл его доделывать. То есть, я не буду выкладывать код. В течении 2-3 месяцев доделаю и буду продовать :-).

пс. Почему-то mFilter2 ошибочно считает suggestions. Для женщин он посчитал 31 кольцо, а на самом деле их 4082.

пс2.
в mFilter есть подсчёт результатов по каждому фильтру, но для фильтров из коробки я этого делать не планировал
На самом деле, если сделали фильтры как в mFilter2, то suggestions уже просто посчитать. В mFilter2 это 100 строк кода всего.
Александр Туниеков
20 сентября 2022, 23:52
0
Да я про подсчет результатов. Почему-то называл всегда подсказками :-(
поэтому скидывайте кейсы
Сейчас код вне зоны доступа :-). Завтра скину
Александр Туниеков
20 сентября 2022, 22:41
0
Может вы закрывающею } не скопировали???? Ошибка на это похожа.

Вообще у тебя в ms2Gallery 'limit'=>1 и 2 вариант будет не сильно быстрее. 2+1 простых запроса в базу против 1 более сложного на каждый вызов ms2Gallery. То есть на 1 картинку.
Если картинок много то лучше в основном pdoResources сразу и картинки и Parent подцепить join-ми. Тогда быстрее будет. 1 запрос на все против 3 запросов на каждый дочерний ресурс.
Примерно так:
{'!pdoResources' | snippet : [
    'parents'=>5,
    'tpl'=>'res_chunk',
	'loadModels'=>'ms2gallery',
	'leftJoin'=>[
		'File'=>[
			'class'=>'msResourceFile',
			'on'=>'File.resource_id = modResource.id and File.rank = 1 and File.path LIKE \'%small%\''
		],
		'Parent'=>[
			'class'=>'modResource',
			'on'=>'Parent.id = modResource.parent'
		],
	],
	'select'=>[
		'modResource'=>'*',
		'File'=>'File.url as file_url,File.name as file_name',
		'Parent'=>'Parent.pagetitle as parent_title',
	],
]}
res_chunk:
<div class="col-6 col-md-3 col-sm-6 gv-card">
	<div class="product-grid">
		<div class="product-image">
			<a href="{$id | url}" class="image">
				{if $file_url}
					<img src="{$file_url}" alt="{$parent_title}" title="{$file_name}">
				{else}
					<img src="assets/img/projects/v-1.png" alt="{$pagetitle}" title="{$pagetitle}"/>
				{/if}
			</a> 
			<div class="add-to-cart">
				<a href="{$id | url}">{$pagetitle}</a>
			</div>
		</div>
	</div>
</div>
Я бы так делал, если картинок много. И phpthumbon бы не стал использовать, а задал бы нужное превью в галерее. Интересно даже какая скорость будет во всех 3 вариантах.
пс. pdoResources наверно лучше кешировать.
Александр Туниеков
20 сентября 2022, 21:08
0
Спасибо. Теперь более-менее понятно
Александр Туниеков
20 сентября 2022, 21:03
0
Ну тут 2 варианта:
1) не очень хороший. В $file должно быть $file['resource_id'] и в alt="… ТО САМОЕ..." можно сделать так
alt="{($file['resource_id'] | resource: 'parent') | resource: 'pagetitle'}"
Но модификатор | resource ресурсо-затратный и если будет 100 картинок, то страница будет тупить.
2) В ms2Gallery сразу добавить запрос паджтитл родителей
{'!ms2Gallery' | snippet: [
'resources'=>$id,
'innerJoin'=>['Parent'=>['class'=>'modResource','on'=>'Parent.id = modResource.id'],
'select'=>['Parent'=>'Parent.pagetitle as parent_title'],
'limit'=>1,
'tpl'=>'ms2Gallery.mainpage.tpl'
]}
alt="{($file['parent_title']}"
Примерно так не проверял
Александр Туниеков
20 сентября 2022, 20:36
0
$_modx->resource.id — выводит 1
Ну тут выдается главная страница. То есть код выполняется когда показывается главная. $_modx->resource это массив параметров страницы которая загружается показывается.
Ты на главной выводишь блок с ресурсами. Например:
{'!pdoResources' | snippet : [
    'parents'=>5,
    'tpl'=>'res_chunk'
]}
В res_chunk можно указывать:
{($id | resource: 'parent') | resource: 'pagetitle'}

И должно верно вернуть паджтитл ресурса родителя.
Но наверно ты в res_chunk еще вызываешь ms2Gallery c каким-то чанком. Например gallery_chunk и вот в нем уже $id вернет id файла (или 0 наверно). Чтоб получить id ресурса из res_chunk надо подумать как это сделать.
Но сперва скажи угадал? или у тебя что-то другое?
Александр Туниеков
20 сентября 2022, 19:50
0
Я пробовал делать компонент замену mFilter2. Вместо связки значение фильтра — ids ресурсов в массиве, хотел сделать эту связку в базе прописать и вытаскивать ids отфильтрованных ресурсов запросами. Но если отфильтровывает быстро, то подсказки на 100к товаров отрабатывают за сек 10. И если в mFilter2 улучшить кеширование, то разницы в скорости работы особо нет.
Надеюсь понятно написал для тех кто в курсе как mFilter2 работает.
Александр Туниеков
20 сентября 2022, 19:25
0
Ну я в курсе, что так заработает. Я не в курсе почему неожиданно сработало так, что переменная которая вроде не менялась изменилась?
вы же по сути ссылку делаете на значения.
Можно поподробнее. Вот ссылка на значение &$v1. И с ней ничего не делаем. Вот ссылка на на значение &$v2. Там меняем переменную. Икак происходит что изменилась переменная которую не трогал?
Нужный код я поправил, чтоб заработал. Хотелось бы понимание что происходит, чтоб не нарываться в будущем