Всего 123 768 комментариев

Джон
25 ноября 2023, 20:08
0
'modification/set', form
Мне помогло, но оно не корректно работает с ценой, если не заполнена основная цена то в форме выводит 0 а нужно чтобы тогда выводила цену из модификатора!
Как это сделать?
Дмитрий
25 ноября 2023, 16:58
+1
В моём способе вы, находясь на одной странице, получаете ссылки на редактирование любого ресурса, на который есть ссылка на данной странице (навели курсор на ссылку на фронте — получили в popup ссылку для редактирования ресурса, на который ведет эта ссылка), текущий ресурс можно отредактировать наведя курсор на заголовок h1.

Ваш метод позволяет перейти по ссылке только на один конкретный ресурс, на котором вы сейчас находитесь на фронте. На практике мне оказалось удобнее иметь ссылки на все видимые на странице ресурсы, и я могу быстро открыть для редактирования сразу несколько ресурсов, не переходя при этом на другие страницы. Например, в случае с интернет-магазином, когда вы находитесь в каталоге товаров, можно открыть сразу несколько карточек товаров и что-то быстро отредактировать. При частой работе с контентом и внезапных изменениях (ошибки какие-нибудь исправить и т.п.) такой подход показался мне удобным.
Алексей Смирнов
25 ноября 2023, 16:33
0
Это дело пишется в MIGX в конфигурации этого поля в конфиге: joxi.ru/D2PYbP1TqDpdMA

PS. поздно понял что вы в ручную все вводите. учитесь через конфигуратор делать. это удобнее
а в вашем случае нужно дописать параметры imagePlus в параметр config
[{
    "caption":"Добавить", 
    "fields": [{
    "field":"image",
    "caption":"Изображение",
    "inputTVtype":"imageplus",
    "configs": {    "targetWidth":"920",
       "targetHeight":"600",
       "targetRatio":"1.53" }
    ]}
}]
я условно написал не уверен что правильное имя configs
Miša Bulic
25 ноября 2023, 16:29
0
А зачем вообще делать эти всплывашки на элементы? Сначала подумал, что прям на фронте изменения делать можно, но это просто ссылки на админку.

Вот просто кнопка редактировать внизу без JS:
{if $_modx->user.id > 0 && $_modx->isMember('Administrator')}
    <div class="adminpanel">
        <a href="/manager/?a=resource/update&id={$_modx->resource.id}">Редактировать</a>
    </div>
{/if}
CSS:
.adminpanel {
    bottom: 10px;
    left: 10px;
    position: fixed;
    z-index: 99;
}
.adminpanel a {
    background: rgba(0,0,0,.502);
    border-radius: 10px;
    color: #fff;
    font-size: 15px;
    font-weight: 600;
    height: 50px;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 5px 20px;
    text-decoration: none;
}
Антон
25 ноября 2023, 14:01
0
Делаю также мультизагрузку через MIGX и ImagePlus. Одиночная загрузка работает, вопросов нет. В мультизагрузке не отображаются превью изображений в админке. Конфигурация MIGX выглядит таким образом:
{
  "formtabs":[
    {
      "MIGX_id":3,
      "caption":"bscarousel",
      "print_before_tabs":"0",
      "fields":[
        {
          "MIGX_id":6,
          "field":"slide",
          "caption":"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"imageplus",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"migx",
          "sources":[
            {
              "MIGX_id":2,
              "context":"web",
              "sourceid":4
            }
          ],
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":1
        }
      ],
      "pos":1
    }
  ],
  "contextmenus":"",
  "actionbuttons":"uploadfiles",
  "columnbuttons":"",
  "filters":"",
  "extended":{
    "migx_add":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u043e\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u0438",
    "disable_add_item":"",
    "add_items_directly":"",
    "formcaption":"",
    "update_win_title":"",
    "win_id":"",
    "maxRecords":"",
    "addNewItemAt":"bottom",
    "media_source_id":"",
    "multiple_formtabs":"",
    "multiple_formtabs_label":"",
    "multiple_formtabs_field":"",
    "multiple_formtabs_optionstext":"",
    "multiple_formtabs_optionsvalue":"",
    "actionbuttonsperrow":4,
    "winbuttonslist":"",
    "extrahandlers":"",
    "filtersperrow":4,
    "packageName":"",
    "classname":"",
    "task":"",
    "getlistsort":"",
    "getlistsortdir":"",
    "sortconfig":"",
    "gridpagesize":"",
    "use_custom_prefix":"0",
    "prefix":"",
    "grid":"",
    "gridload_mode":1,
    "check_resid":1,
    "check_resid_TV":"",
    "join_alias":"",
    "has_jointable":"yes",
    "getlistwhere":"",
    "joins":"",
    "hooksnippets":"",
    "cmpmaincaption":"",
    "cmptabcaption":"",
    "cmptabdescription":"",
    "cmptabcontroller":"",
    "winbuttons":"",
    "onsubmitsuccess":"",
    "submitparams":""
  },
  "permissions":{
    "apiaccess":"",
    "view":"",
    "list":"",
    "save":"",
    "create":"",
    "remove":"",
    "delete":"",
    "publish":"",
    "unpublish":"",
    "viewdeleted":"",
    "viewunpublished":""
  },
  "fieldpermissions":"",
  "columns":[
    {
      "MIGX_id":1,
      "header":"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435",
      "dataIndex":"slide",
      "width":50,
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"ImagePlus.MIGX_Renderer",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    }
  ],
  "category":""
}
Что блин не так? Почему превью не видны? Да и ощущение, что файлы не добавились в таблицу в документе
Кровельный
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>']}