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

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

С нами с 19 декабря 2015; Место в рейтинге пользователей: #15
Александр Туниеков
04 мая 2023, 20:36
0
офтоп. а за что от дмитрия минусы? мешают ориентироваться.

ИИ круто и в будущем поможет снять часть рутины, но уметь правильно ему вопросы задавать мешает. Вообще хотелось бы чтоб был в контексте твоих задач и понимал с полуслова :-)
Александр Туниеков
21 апреля 2023, 12:51
0
Поиск делает OpenSearch в своем индексе(базе) и соответственно сайт должен загрузить на него данные по которым поиск идет. На 40т товаров данные грузятся 5 минут. Если поменять хостинг, то соответственно минут 5-6 и не будет работать фильтр. Надо буде перезапусть создание индекса вручную
Александр Туниеков
21 апреля 2023, 12:39
0
нужно ли в будущем обновления
Ну думаю можно обновлять OpenSearch. Пока совместимость не сломают. Хотя врядли в ближайшем будущем сломают. Я не обновляю пока. Еще даже не разбирался как обновлять.
Александр Туниеков
21 апреля 2023, 12:32
0
OpenSearch бесплатный opensource.
Кроме единоразовой оплаты за модуль, еще будут оплаты?
Нет.
Хотелось бы еще увидеть интеграцию с SeoFilter.
Пока в планах. Но насколько я смотрел там ничего сложного нет. Просто немного переписать js SeoFillter.

Хотя есть одна мысль которая не дает покоя, если клиент на вашем хостинге, то вы подключаете ему этот модуль, а если он хочет уйти на свой хостинг, вы же не будете ему предоставлять место для хранения фильтров на vps.
Ну он не будет ничего загружать на мой хостинг и соответственно место не будет занимать. А к чему вопрос?
Александр Туниеков
07 апреля 2023, 06:11
0
Точки с запятой нет после инструкии $this->modx->log(1, print_r($success_page,1))
надо
$this->modx->log(1, print_r($success_page,1));
Александр Туниеков
07 апреля 2023, 06:01
0
А в MODX whereCondition вообще есть? я только xPDOQuery::where в гугле нахожу
Александр Туниеков
05 апреля 2023, 03:05
+1
Привет. Вопрос не до конца понял, но может так: вносятся данные в виде текста и селект нужен только в фильтре.
Тогда примерно так:
{'!getTable' | snippet : [
   'loadModels'=>'gtsShop',
   'showLog'=>1,
   'selects'=>[
      'test'=>[
         'type'=>'data',
         'rows'=>[
            ['test','test'],
            ['Oplata','Oplata']
         ]
      ]
   ],
   'table'=>[
        'class'=>'gsRaschet',
        'pdoTools'=>[
            'class'=>'gsRaschet',
        ],
        'autosave'=>1,
        'row'=>[
            'id'=>['filter'=>1],
            'name'=>[
                'edit'=>['type'=>'text'],
                'filter'=>[
                    'edit'=>['type'=>'select','select'=>'test']
                ]
            ],
        ]
    ]
]}
Александр Туниеков
29 марта 2023, 14:04
+2
Править исходники лучше только для теста. Если кто-то вздумает обновить mSearch2, то правка пропадет. Лучше расширить класс фильтрации
Расширяем класс фильтрации
Все стандартные фильтры mSearch2 находятся в файле /core/components/msearch2/model/msearch2/filters.class.php. Нам нужно унаследовать его, расширить и указать новый класс в системных настройках.

Создаём новый файл в /core/components/msearch2/custom/filters/custom.class.php и пишем в него:

<?php
class myCustomFilter extends mse2FiltersHandler {}

Указывем его в системной настройке mse2_filters_handler_class.

С этого момента mSearch2 использует для работы ваш класс фильтрации, в котором вы можете писать новые методы, или переопределять стандартные.

Для получения данных используются методы getИмяМетодаValues(), для подготовки фильтра — buildИмяМетодаFilter(), а для фильтрации filterИмяМетода. Можно посмотреть, как работают эти 3 типа методов в filters.class.php.
И прописать исправленный метод getTvValues в классе myCustomFilter.
<?php
class myCustomFilter extends mse2FiltersHandler {
/**
	 * Retrieves values from Template Variables table
	 *
	 * @param array $tvs Names of tvs
	 * @param array $ids Ids of needed resources
	 *
	 * @return array Array with tvs values as keys and resources ids as values
	 */
	public function getTvValues(array $tvs, array $ids) {
		$filters = array();
		$q = $this->modx->newQuery('modResource', array('modResource.id:IN' => $ids));
		$q->leftJoin('modTemplateVarTemplate', 'TemplateVarTemplate',
			'TemplateVarTemplate.tmplvarid IN (SELECT id FROM ' . $this->modx->getTableName('modTemplateVar') . ' WHERE name IN ("' . implode('","', $tvs) . '") )
			AND modResource.template = TemplateVarTemplate.templateid'
		);
		$q->leftJoin('modTemplateVar', 'TemplateVar', 'TemplateVarTemplate.tmplvarid = TemplateVar.id');
		$q->leftJoin('modTemplateVarResource', 'TemplateVarResource', 'TemplateVarResource.tmplvarid = TemplateVar.id AND TemplateVarResource.contentid = modResource.id');
		$q->select('TemplateVar.name, TemplateVarResource.contentid as id, TemplateVarResource.value, TemplateVar.type, TemplateVar.default_text');
		$tstart = microtime(true);
		if ($q->prepare() && $q->stmt->execute()) {
			$this->modx->queryTime += microtime(true) - $tstart;
			$this->modx->executedQueries++;
			while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
				if (empty($row['id'])) {
					continue;
				}
				elseif (is_null($row['value']) || trim($row['value']) == '') {
					$row['value'] = $row['default_text'];
				}
				if ($row['type'] == 'tag' || $row['type'] == 'autotag') {
					$row['value'] = str_replace(',', '||', $row['value']);
				}
				$tmp = strpos($row['value'], '||') !== false
					? explode('||', $row['value'])
					: array($row['value']);
				foreach ($tmp as $v) {
					$v = str_replace('"', '"', trim($v));
					if ($v == '') {
						continue;
					}
					$name = strtolower($row['name']);
					if($name == 'ten-long') $v=(int)$v;
					if (isset($filters[$name][$v])) {
						$filters[$name][$v][$row['id']] = $row['id'];
					}
					else {
						$filters[$name][$v] = array($row['id'] => $row['id']);
					}
				}
			}
		}
		else {
			$this->modx->log(modX::LOG_LEVEL_ERROR, "[mSearch2] Error on get filter params.\nQuery: ".$q->toSQL()."\nResponse: ".print_r($q->stmt->errorInfo(),1));
		}

		return $filters;
	}
}
Александр Туниеков
28 марта 2023, 22:40
+1
или лучше
if($name == 'ten-long') $v=(int)str_replace('мм','',$v);
Александр Туниеков
28 марта 2023, 22:27
+1
Странно, что вообще с мм работает. Как мфильтер вообще число получает???
попробуйте для теста в core\components\msearch2\model\msearch2\filters.class.php после 74 строки дописать
if($name == 'ten-long') $v=(int)$v;
https://disk.yandex.ru/i/eU3jzbcssEOc8w
Александр Туниеков
17 марта 2023, 13:22
0
Я учился писать под модекс на примере минишопа. Как писать под MODX3 есть вопросы. Думал полгода подожду выйдет минишоп3 и на его примере буду ваять. Полгода прошло а минишопа3 нет. А вопросы как писать остались. И как писать под MODX3 не понятно и даже возникает вопрос стоит ли вообще под него писать. С классами и отказом от addPackage они мне изрядную свинью подложили. У меня класс прописывается в параметрах сниппета и 1 сниппет работает с любым классом модели базы. А теперь не понятно как подлючить класс. Use переменная не работает
Александр Туниеков
17 марта 2023, 12:49
0
Нефига не понятно в консоле :-( попробуй минификацию скриптов отключить. Или попробуй плагины поочередно отключать. Может в них проблема
Александр Туниеков
15 марта 2023, 21:11
0
<?php
$ms = $modx->getService('miniShop2');
if($msOrder = $modx->getObject('msOrder',['num'=>'2303/41'])){
    echo "<p>{$msOrder->createdon}</p>";
}
Ну так дату можно получить заказа с номером 2303/41
А тебе зачем дату?
Александр Туниеков
15 марта 2023, 20:02
0
В смысле ухватиться? Можно плагин на событие msOnChangeOrderStatus написать. https://docs.modx.pro/komponentyi/minishop2/razrabotka/sobyitiya
Или что-то другое надо?
Александр Туниеков
13 марта 2023, 09:56
0
На сервере вашего сайта сертификат минцифры устоновлен? В январе сбер апи на русский корневой сертификат перешел
Александр Туниеков
13 марта 2023, 09:53
+1
Проблема была в неверном пути MODX_ASSETS_PATH
Александр Туниеков
23 февраля 2023, 14:54
+1
Когда много не понятного кода я возмущаюсь :-). Ленивый я. Когда 5 минутная задача превращается в два дня разборок в коде мне это не нравиться :-(
Александр Туниеков
23 февраля 2023, 13:49
0
Я с extJs уже давно разобрался. Как Наумкин свои уроки выложил. Конечно ExtJs устарел и его заменить на что-нибудь актуальное, но и на разброс от ангуляр, реакт, vue тоже соглашаться не охота.