Всего 123 782 комментария

Кровельный
24 ноября 2023, 15:57
0
Удалить изображения в базе
$q = $modx->newQuery('msProduct');
$q->innerJoin('msProductData', 'Data', 'msProduct.id = Data.id');
$q->where(array(
    'msProduct.parent:IN' => [30396,30397,30398], 
    'msProduct.published' => 1, 
    'msProduct.deleted' => 0)
);
$q->sortby('msProduct.id','ASC');
$products = $modx->getIterator('msProduct', $q);
foreach ($products as $product) {
    if ($images = $modx->getCollection('msProductFile', array('product_id' => $product->id, 'parent' => 0))) {
        $ids = array();
        foreach ($images as $im) {
            $ids[] = $im->get('id');
        }
        $response = $modx->runProcessor('gallery/multiple',
        	array('method' => 'remove', 'ids' => json_encode($ids)),
        	array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/')
        );
        // remove files on dir
        $remove_files = glob(MODX_BASE_PATH.'assets/images/products/'. $id.'/*');
        foreach ($remove_files as $remove_file) {
            if (is_file($remove_file)) {
                unlink($remove_file); // delete file
            }
        }
    }
}
Перегенерировать превью товара при загрузке после импорта
$q = $modx->newQuery('msProduct');
$q->innerJoin('msProductData', 'Data', 'msProduct.id = Data.id');
$q->where(array('msProduct.parent:IN' => [30396,30397,30398], 
    'msProduct.published' => 1, 'msProduct.deleted' => 0));
$q->sortby('msProduct.id','ASC');
$products = $modx->getIterator('msProduct', $q);
$i = 0;
foreach ($products as $product) {
    $i++;
    
    if ($images = $modx->getCollection('msProductFile', array('product_id' => $product->id, 'parent' => 0, 'rank' => 0))) {
        $ids = array();
        foreach ($images as $im) {
            $ids[] = $im->get('id');
            $image = $im->get('url');
        }
        $response = $modx->runProcessor('gallery/multiple',
        	array('method' => 'generate', 'ids' => json_encode($ids)),
        	array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/')
        );
        $product = $modx->getObject('msProduct', $product->id);
        $product->set('image', $image);
        $product->save();
    }
}
Номера родительских категорий следует сменить, смотрите внимательно. На всякий случай сделайте бэкап.
Pandemic
24 ноября 2023, 11:59
0
А продолжение будет? интересная затейка
steve.kon
24 ноября 2023, 11:58
0
Ну принцип-то должен работать, вроде. Я его везде на 2.8 использую, всё в порядке, но тут вот решил сделать правильно (пустой вывод убрать).
Пробую так (может видно будет в чем ошибка):
[!+ss_meta.keywords? toPlaceholder=`keywords`]]
    [[+keywords:ne=``:then=`<meta name="[[+name]]" content="[[+value:escape]]" />`]]    //такой вариант не работает
    [[+keywords:ne=``:then=`[[!+ss_meta.keywords]]`]]    // и такой тоже
Miša Bulic
24 ноября 2023, 11:47
0
Seo Suite давно не поддерживается для 2.8, они на 3-ку перешли. А по делу проверь нет ли у тебя там пробела в поле keywords.
tararaxnes
23 ноября 2023, 14:53
+1
Хорошо, я попробую, спасибо, что уделили время
Володя
23 ноября 2023, 14:51
0
да, так уже понятней.
для такого варианта не получится использовать msOptionsPrice.modification. Нужно писать свой сниппет для выборки. Или как то использовать pdoResourses
tararaxnes
23 ноября 2023, 14:35
0
Наверное я не так ясно выразился (мой русский не на высоком уровне).
Например, у меня есть следующие 3 продукта(3 разных продукта одной категории (а не 3 модификации одного продукта)):
ТоварА(ID:1)------>(с 3 модификациями)
1. модификация1: цвет1, размер, коллекцияА
2. модификация2: цвет2, размер, коллекцияА
3. модификация3: цвет3, размер, коллекцияB

ТоварB(ID:2)------>(с 2 модификациями)
1. модификация1: цвет3, размер, коллекцияА
2. модификация2: цвет1, размер, коллекцияB

ProductC(ID:3)------>(с 2 модификациями)
1. модификация1: цвет3, размер, коллекцияА
2. модификация2: цвет1, размер, коллекцияА

Поэтому мне нужно использовать snippet
[[!msOptionsPrice.modification?
&where=`[ "Option.key = 'collection' AND Option.value = 'коллекциюА'" ]`
]]
например, в строке меню:
чтобы получить все товары, входящие в коллекциюА.

он должен вернуть следующий список:
ТоварA, цвет1, размер, коллекцияA
ТоварA, цвет2, размер, коллекцияA
ТоварB, цвет3, размер, коллекцияA
ТоварC, цвет3, размер, коллекцияA
ТоварC, цвет1, размер, коллекцияA
Володя
23 ноября 2023, 14:15
0
не поможет, оно возвращает то же предупреждение:"[msOptionPrice] The resource with id= is not instance of msProducts." и я думаю, что это нормально,
либо у вас неверно указан параметр product, либо в плейсхолдере [[+id]] не идентификатор продукта. ЧУдес не бывает.
tararaxnes
23 ноября 2023, 14:05
0
Моя проблема:
1. я не хочу запустить этот snippet со страницы продукта
2. когда я запускаю этот snippet, мне нужно получать результаты всех модификаций продукта с одним и тем же ключом Option.key.

и
&product=`[[+id]]`
не поможет, оно возвращает то же предупреждение:"[msOptionPrice] The resource with id= is not instance of msProducts." и я думаю, что это нормально,
у меня такое впечатление, что snippet msOptionsPrice.modification возвращает данные только для конкретного продукта, но мне нужно что-то вроде, например:
[[pdoResourses? &parents=`47` &where=`{'class_key' : 'msCategory'}'
Это вернет информацию обо всем, что находится под родительским номером 47.
Володя
23 ноября 2023, 13:43
0
если вы вызываете сниппет не на странице товара обязательно нужно указать идентификатор
&product=`[[+id]]`
tararaxnes
23 ноября 2023, 13:04
0
Я уже пробовал это, но он возвращает: [msOptionPrice] The resource with id= is not instance of msProducts.
Если я добавлю &product = product_id оно работает.
Но мне нужно получить список всех продуктов(из модификаций), принадлежащих определенной коллекции.
Константин Ильин
23 ноября 2023, 10:54
+2
После загрузки модального окна делаю так:
let a = document.querySelector(".modalTmp form").getAttribute('data-fetchit')
        FetchIt.create({
            action: a,
            assetsUrl: "/assets/components/fetchit/",
            actionUrl: "/assets/components/fetchit/action.php",
            inputInvalidClass: "is-invalid",
            customInvalidClass: "",
            clearFieldsOnSuccess: false,
            pageId: 1,
        });
пока такой костыль, но работает

а, еще чтобы FetchIt был подключен всегда и объявлена переменная FetchIt до запуска вышенаписанного кода, в футере например вызываю пустой FetchIt
{'!FetchIt' | snippet : ['form' => '@INLINE <div class="modalTmp"></div>']}
Володя
23 ноября 2023, 09:41
0
Вот так должно сработать
[[!msOptionsPrice.modification?
&where=`[ "Option.key = 'collection' AND Option.value = 'Летняя коллекция'" ]`
]]
Володя
23 ноября 2023, 09:28
0
Доброе утро. Можно использовать параметр byOptions
{'!msOptionsPrice.modification'|snippet: [
'byOptions' => [
    'collection' => 'Летняя коллекция'
]
]}
ps. пардон. все модификации это не даст, а только первую подходящую.
tararaxnes
23 ноября 2023, 08:50
0
да, вы правы насчет коллекции, но в текущей структуре с использованием модификаций другого пути нет. В коллекции может быть продукт всех цветов, но также может быть продукт определенного цвета. Я не вижу другого пути.
Артур Шевченко
23 ноября 2023, 00:39
0
Я бы на вашем месте хорошо подумал, а точно ли коллекция это свойство товара, которое должно быть в модификации. А в текущей раскладке скорее всего только свой сниппет писать, который сделает нужную выборку из БД.
Артур Шевченко
22 ноября 2023, 21:48
0
Я бы попробовал SendIt. Подход к реализации там нетипичный, но при наличии необходимых атрибутов форма отработает как надо хоть прямо на странице, хоть в модальном окне.
Артур Шевченко
22 ноября 2023, 20:27
0
когда не находит удалённый ресурс, документ, товар по id
А как можно не найти объект по ID?