Виктор Долгий

Виктор Долгий

С нами с 18 февраля 2013; Место в рейтинге пользователей: #107
Виктор Долгий
21 января 2019, 23:09
+1
Спасибо, Павел, что обратили внимание и исправили ;) И большое спасибо за то, что уделяете время бесплатному и полезному компоненту. Принял плюс в карму =)
Виктор Долгий
12 января 2019, 16:08
0
При чистой установке на modhost.pro:
Could not create table `v4enCXzTSLqE_tvss_options` SQL: CREATE TABLE `v4enCXzTSLqE_tvss_options` (`resource_id` INT(10) unsigned NOT NULL, `tv_id` VARCHAR(255) NOT NULL, `value` TEXT NULL, INDEX `resource` (`resource_id`,`tv_id`)) ENGINE=MyISAM ERROR: Array ( [0] => 42000 [1] => 1071 [2] => Specified key was too long; max key length is 1000 bytes )
Думаю, так как на Модхосте таблицы со сравнением по умолчанию utf8mb4 а не utf8, не хватает длины индекса для поля Varchar(255). Вроде, по умолчанию, во всяком случае для utf8mb4, считается 4 байта на символ, MyISAM ограничивает до 1000 байт, а InnoDB итого меньше (765 кажется). Получаем 255*4 = 1020, плюс resource_id… В общем, может, tv_id => INT, или, хотя бы VARCHAR(240)?
Виктор Долгий
30 марта 2018, 22:11
+1
Наверное — это при том условии, что я не ресурс расширяю и своего кэш-менеджера, как у ресурсов не делал, не много полей и немного данных, но все таки без него как-то будет не так, думаю. Почему я так думаю — cache_db создает не только файл кэша с массивом элементов таблицы, но и создает кэш-файлы для каждого значения, почти так же, как сам MODx создает свой кэш для ресурсов. Это из наблюдений и поверхностного анализа XPDO кэша, модкэшменеджера и работы кэширования процессорами ресурсов. Но я не претендую на знатока вопроса.
Виктор Долгий
30 марта 2018, 21:35
0
Да все зависит и от хостинга и от задачи, думаю. Я не проводил тестов на эту тему, но в моем случае — доска объявлений, база для хранения админ. единиц страны, в базе будет около 22 000 населённых пунктов и прочих единиц, много запросов разнобойных по разным админ единицам, может помочь. Наверное :)
Виктор Долгий
30 марта 2018, 19:32
0
Что-то мне показалось, что по доходности фильтрует…
Виктор Долгий
16 февраля 2018, 19:04
0
Сейчас как раз разбираюсь, как будет что-то — поделюсь :)
Виктор Долгий
18 января 2018, 22:53
0
Решение проблемы оказалось элементарным, зачем использовать процессоры minishop`a, если продукт — расширенный ресурс и можно сохранять стандартным процессором?..
...
$response = $this->modx->runProcessor('resource/update', $fields);
...
Виктор Долгий
18 января 2018, 21:22
0
А вот и нет, нет ошибки. При чём, такая ситуация возникает только после вызова getObject. Если его не вызывать никаких ошибок нет (просто руками данные ввести). Если ввести все руками и запустить getObject — все, все плохо, все перепробовал уже… Кстати, вот на modX forum похожая ситуация, но вроде у парня завелось (там про штатный процессор создания): forums.modx.com/thread/99959/runprocessor-frustration.

Пример
Не работает:
if (!empty($data['pid'])) {
	$fields['id'] = (int)$data['pid'];
	if ($ad = $this->modx->getObject('msProduct', array('class_key' => 'msProduct', 'id' => $fields['id']))) {
		$fields['context_key'] = $data['context_key'];
		$fields['alias'] = $data['alias'];

		$response = $this->modx->runProcessor('mgr/product/update', $fields, array('processors_path' => MODX_CORE_PATH . 'components/minishop2/processors/'));
	} else {
		return $this->error($this->modx->lexicon('ticket_err_id', array('id' => $fields['id'])));
	}
} else {
	$response = $this->modx->runProcessor('mgr/product/create', $fields, array('processors_path' => MODX_CORE_PATH . 'components/minishop2/processors/'));
}
Работает:
if (!empty($data['pid'])) {
	$fields['id'] = (int)$data['pid'];
	$fields['context_key'] = $data['context_key'];
	$fields['alias'] = $data['alias'];

	$response = $this->modx->runProcessor('mgr/product/update', $fields, array('processors_path' => MODX_CORE_PATH . 'components/minishop2/processors/'));
} else {
	$response = $this->modx->runProcessor('mgr/product/create', $fields, array('processors_path' => MODX_CORE_PATH . 'components/minishop2/processors/'));
}
Виктор Долгий
10 января 2018, 19:37
0
Тут дело в загрузчике curl.js (который в ms2form используется для загрузки других библиотек). Желательно его грузить последним, иначе может вылететь ошибка из-за загрузки других AMD-модулей раньше него. Чаще всего AdminPanel грузится после, тем самым выбивает curl. Попробуйте деактивировать плагин AdminPanel.
Виктор Долгий
24 августа 2017, 19:54
0
Из-за особенностей процессора, нулевая опция (из-за скрытого инпута) ломает логику. Можно легко полечить, например, этим:
unset($options['0']);
$modx->event->returnedValues['options'] = $options;
, в плагине, на событие msopOnBeforeGetModification.
Виктор Долгий
22 августа 2017, 16:31
0
А если не указывать в форме скрытый инпут options (с любыми вариациями определения, масивом и нет), то и с id=«msProduct» все работает.
Виктор Долгий
22 августа 2017, 16:07
0
При выборе картинки, к которой не привязана ни одна модификация, также выставляется первая в списке опция.
Виктор Долгий
22 августа 2017, 14:31
0
А вы с галереей подружили опции?
Виктор Долгий
22 августа 2017, 14:31
0
Володя, еще вопрос, думаю, не только для меня актуален. На странице товара (не в списке), при штатном использовании компонента (без составного товара), если у контейнера выставлен id=«msProduct», то взаимосвязь чекбоксов и картинок теряется, а если айди убрать, то связь восстанавливается, но всегда выставляется чекнутым первый чекбокс. Пробовал и по-разному, с выставлением массивов опций, может, подскажете, как восстановить взимосвязь галереи и опций, чтобы первый чекбокс не проставлялся. Думаю, вам, как разработчику будет проще дать ответ, нежели мне снова перебирать компонент. Или, такой глюк только у меня?
Виктор Долгий
20 августа 2017, 16:37
+1
Еще, если кому-то нужно, чтобы все это работало еще и в списке товаров и выставлялись чекбоксы с mSearch2, нужно поправить default.js у msOptionsPrice2 (/assets/components/msoptionsprice/js/web/default.js), строки 722-731:

с
if (rid) {
    inputs = $(msOptionsPrice.Product.cost + msOptionsPrice.Product.prefix + rid)
        .closest(msOptionsPrice.Product.form)
        .find('[name="' + name + '"]');
    }
    else {
        inputs = $(msOptionsPrice.Product.cost)
        .closest(msOptionsPrice.Product.form)
        .find('[name="' + name + '"]');
    }
на
if (rid) {
    inputs = $(msOptionsPrice.Product.cost + msOptionsPrice.Product.prefix + rid)
        .closest(msOptionsPrice.Product.form)
        .find('[name*="' + name + '"]');
    }
    else {
        inputs = $(msOptionsPrice.Product.cost)
        .closest(msOptionsPrice.Product.form)
        .find('[name*="' + name + '"]');
    }
, то есть, добавить к селектору name звездочку — *.
Виктор Долгий
20 августа 2017, 14:16
0
Со свежей головой разобрался. Если кто-то еще будет ломать голову, то:

1. Чекбоксы указываются таки с параметром
name="options[{$name}][]"
, тогда в массиве опций передается массив зачений.

2. У формы нужно указать (определить) скрытый
<input type="hidden" name="options[]" value="[]"> или <input type="hidden" name="options[]" value="">
, из-за этого, по сути, ничего и не выходило, проморгал.
Виктор Долгий
19 августа 2017, 22:52
0
А в личку, для личного анализа? Если нет — пойму.
Виктор Долгий
19 августа 2017, 22:42
0
А пример работающего сайта есть?
Виктор Долгий
19 августа 2017, 22:35
0
Ок, еще поковыряюсь, коль начал, если не разберусь — отпишу.