Станислав

Станислав

Был в сети 15 июля 2018, 12:41
Заказы принимаю
Случай вернул меня обратно к этому плагину. Захотелось довести его до ума. Повесил его на событие «OnDocFormDelete». По идее товар должен удаляться из группы ресурсов, в которую он попал при создании.
Однако, после «удаления» товара minishop, ничего не происходит.
В логах записывается такая строчка:
(ERROR @ /assets/components/minishop2/connector.php) OnDocFormDelete
Можно ли ее считать ошибкой?

Те ли события я использую для плагина? Какие имена событий привязаны к таким операциям с ресурсами minishop2 как: отключить/включить, удалить/восстановить? Да, и как удалить товар окончательно из БД через админку? Он по прежнему висит в таблице товаров.

Код плагина:
<?php
if ($resource->get('template') != 7) return;
$modx->log(1, print_r( 'OnDocUnPublished', 1 ));
$msDiscount = $modx->getService('msDiscount');
$groups = $msDiscount->getProductGroups($resource->get('id'));
if($groups) {
    foreach (array_keys($groups) as $group) {
        if ($resource->isMember($group) ) {
            $resource->leaveGroup($group);
        }
    } 
} $resource->save();
return;
В том и дело, что покупал компонент не я, поэтому обращаться в техподдержу нет основания. Суть в том, что процедура
$mSearch2->aliases
возвращает пустое значение. На странице с фильтром выводит и такие предупреждения:
Notice: Undefined property: mSearch2::$aliases in /.../core/cache/includes/elements/modsnippet/46.include.cache.php on line 352
Notice: Undefined property: mSearch2::$aliases in /.../core/cache/includes/elements/modsnippet/46.include.cache.php on line 479
Все равно пустой массив ):
<?php
$q = $modx->newQuery('msProduct');
$q->leftJoin('msProductData','msProductData','msProduct.id = msProductData.id');
$q->leftJoin('msVendor','msVendor','msProductData.vendor = msVendor.id');
$q->where(array('msVendor.name' => 'Adidas'));
$q->select(array('msProduct.id as id'));

$result = array();
if ($q->prepare() && $q->stmt->execute()) {
	while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
		$result[] = $row[id];
	}
}
echo "<pre>";print_r ($result);echo "</pre>";
Благодарю за нужное направление. Вначале mb_substr() проблему не решил. Среди причин подозревал версию php (данный глюк был описан здесь) и неподходящие настройки php.

Проблему решил, указав дополнительный параметр кодировки:
mb_substr($brend, 0, 1,'utf-8');
Задача в том, чтобы в базе хранилась такая запись (например): {«100»,«30»,«100»}. Из такого формата потом удобно извлекать значения. Как вариант можно создать простое текстовое поле и записывать значения с разделителем: 100,30,100 или 100*30*100.

Потом извлекать так:

$sizes = explode("*", $pack_size, 3);
list ($lenght, $width, $height) = $sizes;
Но из JSON, мне кажется, это делать удобнее, да и формат универсальный:
$sizes = json_decode ($pack_size, true);
Нужно создать сниппет примерно с таким кодом:
<?php
$output;
$colors = $resource->get('options');
foreach ($colors as $color) {
	$output. = $color . ", ";
}
return $output;
?>
И вызвать сниппет:
<td class="col2">[[!getColors]]</td>
Вообще есть сниппет для вывода опций товара msOptions. Например вывод поля с именем 'color':
[[!msOptions?name=`color` &tplOuter=`tpl.msOptions.outerMy`]]
У меня замечательно все выводится. Не забудьте прописать в каждом вызове сниппета параметры:
&product=`[[+id]]` &name=`имя опции`
Возможно, ошибки возникают из за пустого значения поля. Тогда надо делать проверку:
[[!msOptions:toPlaceholder=`result`? &product=`[[+id]]` &name=`имя опции`]]
[[+result:isnot=``:then=`[[+result]] `]]