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

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

С нами с 19 декабря 2015; Место в рейтинге пользователей: #15
Александр Туниеков
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 тоже соглашаться не охота.
Александр Туниеков
23 февраля 2023, 13:44
0
Мне мои компоненты часто требуется редактировать. А вот сторонние компоненты для админки не помню чтоб редактировал. Может для сторонних и не требуется. А вот корзину для минишопа написали на vue. Ее пришлось выкидывать. Вообще я не за ExtJs. Его можно и сменить. Можно и на vue, но не так чтоб каждый творил что хотел, а чтоб какая-то стандартная экосистема была.
Александр Туниеков
23 февраля 2023, 12:57
+1
Я вижу вред владельца сайтов. Их сайты никто поддерживать не будет. Vue при желании изучить можно, но не факт что нужно. Он низкоуровневый и делай на нем что хочешь и летать будет, но сделать магазин это километры самописного кода, как например в статье из 19 частей Магазин на JavaScript, часть 11 из 19. Потерял контакт с разработчиком и сайт переписывать с нуля. VUE имеет смысл использовать если только он станет частью MODX или минишопа.Каким-то стандартным кодом используемым в многих проектах. А так гики творят что захотят и получаются километры самописного кода которые легче выбросить чем изучить.
Александр Туниеков
23 февраля 2023, 12:37
-5
Так гики пишут сайты и на MODX и с vue. А потом владельцы просят у меня что-нибуть поправить, а там куча не понятного кода на vue. Я так подозреваю что програмистов что дружат и с MODX и с vue сильно меньше чем просто програмистов MODX. В итоге, плодяться сайты, которые некому поддерживать. Так что прежде чем рекламировать реактивные фреймворки надо бы объяснить как с ними работать в среде MODX. Я ожидал пример компонента на vue и vite, а получил просто рекламу vite. Что типа вот как тут удобно. Был бы полноценный пример можно было бы въезжать как делать компоненты с vite. А так стотья ни о чем и даже вредная.
Александр Туниеков
23 февраля 2023, 12:07
0
Я во vue и т.д не силен. Что дергать процессоры понятно. Не понятно как их дергать. И как например в vue отобразить таблицу из базы.
Александр Туниеков
23 февраля 2023, 08:12
0
Обычно в админке данные из бд надо редактировать. Как это сделать никак не понятно :-(
Александр Туниеков
17 февраля 2023, 14:18
0
Столкнулся с такой же проблемой. В моем случае, в modx_user_attributes, internalKey для админа стояло 0. Поставил 1 и все заработало.