Наверх

Перегенерировать все превью товаров miniShop2

<?php
$step = 5;
$offset = isset($_SESSION['galgenoffset']) && $_SESSION['galgenoffset'] ? $_SESSION['galgenoffset'] : 0;
$miniShop2 = $modx->getService('minishop2');
$modx->setLogLevel(MODX_LOG_LEVEL_ERROR);
$q = $modx->newQuery('msProductFile', array('parent' => 0));
$total = $modx->getCount('msProductFile', $q);
$q->sortby('product_id', 'ASC');
$q->sortby('rank', 'DESC');
$q->limit($step,$offset);
$resources = $modx->getCollection('msProductFile', $q);
foreach ($resources as $resource) {
    $modx->runProcessor('mgr/gallery/generate', array('id' => $resource->id),
        array('processors_path' => $modx->getOption('core_path').'components/minishop2/processors/'));
}

$_SESSION['galgenoffset'] = $offset + $step;
if ($_SESSION['galgenoffset'] >= $total) {
  $sucsess = 100;
  $_SESSION['Console']['completed'] = true;
  unset($_SESSION['galgenoffset']);
} else {
  $sucsess = round($_SESSION['galgenoffset'] / $total, 2) * 100;
  $_SESSION['Console']['completed'] = false;
}
for ($i=0; $i<=100; $i++) {
    if ($i <= $sucsess) {
        print '=';
    } else {
        print '_';
    }
}
$current = $_SESSION['galgenoffset'] ?
           $_SESSION['galgenoffset'] :
           ($sucsess == 100 ? $total : 0);
print "\n";
print $sucsess.'% ('.$current.')'."\n\n";


ms2Gallery

<?php
$step = 5;
$offset = isset($_SESSION['galgenoffset']) && $_SESSION['galgenoffset'] ? $_SESSION['galgenoffset'] : 0;
$ms2Gallery = $modx->getService('ms2gallery', 'ms2Gallery', MODX_CORE_PATH . 'components/ms2gallery/model/ms2gallery/');
$modx->setLogLevel(MODX_LOG_LEVEL_ERROR);
$q = $modx->newQuery('msResourceFile', array('parent' => 0));
$total = $modx->getCount('msResourceFile', $q);
$q->sortby('resource_id', 'ASC');
$q->sortby('rank', 'DESC');
$q->limit($step,$offset);
$resources = $modx->getCollection('msResourceFile', $q);
foreach ($resources as $resource) {
    $modx->runProcessor('mgr/gallery/generate', array('id' => $resource->id),
        array('processors_path' => $modx->getOption('core_path').'components/ms2gallery/processors/'));
}

$_SESSION['galgenoffset'] = $offset + $step;
if ($_SESSION['galgenoffset'] >= $total) {
  $sucsess = 100;
  $_SESSION['Console']['completed'] = true;
  unset($_SESSION['galgenoffset']);
} else {
  $sucsess = round($_SESSION['galgenoffset'] / $total, 2) * 100;
  $_SESSION['Console']['completed'] = false;
}
for ($i=0; $i<=100; $i++) {
    if ($i <= $sucsess) {
        print '=';
    } else {
        print '_';
    }
}
$current = $_SESSION['galgenoffset'] ?
           $_SESSION['galgenoffset'] :
           ($sucsess == 100 ? $total : 0);
print "\n";
print $sucsess.'% ('.$current.')'."\n\n";


52 комментария

  1. Евгений 22 июня 2016, 04:29 # 0
    В новой версии ms2 сбивается порядок изображений, после перегенерации. Не сталкивался с таким?
    1. Илья Уткин 22 июня 2016, 10:29 # 0
      Привет! Неа, не сталкивался…
    2. Марк 14 августа 2016, 11:00 # 0
      Огромное спасибо!!!
      сэкономил несколько часов!!!
      1. Павел Александрович Устюгов 01 сентября 2016, 00:15 # 0
        [31.08.2016 21:46:51] Яна жiв4ik Вострякова: а никто на вскидку не даст ссылку на перегенерацию превью мсгалереи
        [0:13:26] Ustyuganskiy: ilyaut.ru/cheats/to-rebuild-all-previews-of-products/
        1. k-m-e 21 октября 2016, 16:25 # 0
          Илья, добрый день! У меня скрипт вот такие строки выдает:
          <h5>[2016-10-21 16:23:28] (ERROR @ /home/c/c00398/public_html/core/model/modx/modconnectorresponse.class.php : 145)</h5><pre>PHP warning: Cannot modify header information - headers already sent by (output started at /home/c/c00398/public_html/core/components/console/processors/exec.class.php(20) : eval()'d code:38)</pre>
          С чем это может быть связано?
          1. Илья Уткин 22 октября 2016, 14:18 # 0
            Привет! Не знаю, скорее всего ошибка где-то… На 38 строчке скрипта…
          2. Эникен Некиэн 02 ноября 2016, 17:25 # +1
            Илья, вечная тебе благодарность. Прям очень благодарен :)

            Это у меня первый удачный опыт, знакомство с php.

            Работает верхний код в приложении — console, превью генерирует на ура!

            Для новичков замечу, что перегенерировать превьюхи требуется после
            изменения размеров превью и обрезки (кропинга, zc=0) в настройках источника файлов ms2images
            1. Илья Уткин 02 ноября 2016, 17:49 # 0
              Верхний код для картинок товаров в miniShop, а нижний — для платной галереи ms2Gallery.
              1. Эникен Некиэн 02 ноября 2016, 18:02 # 0
                Да, я сам это понял, что меня обрадовало )

                Пж не обновляйте превью, если у вас много товаров с несколькими фотографиями.
                Оно из последней фотке сделает превью, придется удалять и перезагружать все фото.

                У меня все один товар с 4-мя фотографиями, повезло :)
            2. Сергей 08 ноября 2016, 08:35 # 0
              Илья добрый день!
              Подскажите пожалуйста!
              Хотел воспользоваться Вашим кодом для перегенерации превью в магазине Minishop2, но после запуска в консоли ничего не происходит. Если поменять в коде parent — на id каталога — то видно анимацию процесса, но сами превью не обновляются.
              Подскажите — в чем может быть дело?
              modx — 2.5.0
              minishop2 — 2.4.4
              1. Илья Уткин 08 ноября 2016, 08:43 # 0
                Попробуйте новую версию скрипта (обновил код в теме)
                1. Сергей 08 ноября 2016, 08:55 # 0
                  Спасибо за быстрый ответ)
                  Попробовал — теперь вижу что процесс остановился на 19% и выдаёт ошибки —
                  PHP warning: imageinterlace() expects parameter 1 to be resource, null given
                  Видимо что-то у меня с хостингом — буду гуглить)
              2. Михаил 15 декабря 2016, 15:16(Комментарий был изменён) # 0
                А как обновить превью если они не установлены? А в ms2Gallery есть картинки, т.е поставить превью из ms2Gallery первую.
                1. Илья Уткин 16 декабря 2016, 08:01 # 0
                  Для этого надо отдельный скрипт писать. Я с такой задачей не сталкивался.
                2. Михаил 16 декабря 2016, 12:48 # 0
                  Жаль очень часто с такой сталкиваюсь((( при парсинге или выгрузки через файл или 1с такая проблема существует
                  1. Борис Акименко 25 января 2017, 14:54 # 0
                    Илья, респект!
                    1. Сергей 24 февраля 2017, 17:03 # 0
                      В minishop2 превьюшки перегенирировались,
                      но в настройках указаны 148*68 и 470*390,
                      а в результате работы скрипта получились только 120*90
                      в чем может быть проблема?
                      1. Илья Уткин 27 февраля 2017, 15:42 # 0
                        Может быть неправильно указаны параметры источника файлов. При обычной загрузке новых картинок превьюшки генерируются?
                        1. Сергей 27 февраля 2017, 15:44 # 0
                          да, при обычной загрузке все ок,
                          в итоге просто прошелся ручками по всем товарам,
                          благо их в тесте не много
                      2. Александр 17 марта 2017, 21:33 # 0
                        Илья, столкнулся с такой проблемой, что при добавлении нового товара слетает источник файлов и фотки грузит система в корень, хотя в системных настройках все прописано. с чем это может быть связано?
                        1. Илья Уткин 20 марта 2017, 09:24 # 0
                          Не знаю… вроде, не сталкивался с таким…
                          1. Александр 20 марта 2017, 09:25(Комментарий был изменён) # 0
                            проблему заметил когда переезжал на хост. причем на старом все нормально работает, на новом нет. Уже и не знаю в какую сторону копать
                            1. Александр 20 марта 2017, 09:27 # 0
                              Илья, а вы могли бы посмотреть, если я вам доступы дам?

                              заранее спасибо.
                              1. Илья Уткин 20 марта 2017, 09:29 # 0
                                У меня сейчас на работе завал… попробуйте на modx.pro/work оставить объявление о работе — наверняка, кто-нибудь поможет
                          2. Кирилл 13 апреля 2017, 15:03(Комментарий был изменён) # 0
                            Вопрос такой не отображается консоль в меню, как ее можно запустить?
                            ModX Revo 2.5.0 pl
                            Устанавливаю из админки, последняя версия 2.2.1, пробовал ставить вашу 2.0.2 не помогает тоже самое.
                            В настройках — меню она есть, но так не отображается сбросить кеш и т.д. пробовал ее нет. Также вопрос в записи к плагину ее запускают из components но у меня нет этого раздела, что можно сделать?
                            1. Илья Уткин 21 апреля 2017, 08:11 # 0
                              Попробуйте своему пользователю поставить галочку «Неограниченные права»
                            2. Павел Гвоздь 17 июня 2017, 10:05 # 0
                              Есть небольшой косячок. Не знаю, с какой версии внедрено в ms2, но при клике на картинке «Обновить превьюшки» основной картинкой товара становится та картинка, на которой кликнули данное действие последний раз. Следовательно, когда мы перегенерируем превьюхи товара — сортировать надо в обратном порядке по полю rank, дабы первая картинка товара перегенерировалась последней и становилась основной картинкой товара.

                              Для этого, вместо:
                              $q->sortby('id','ASC');
                              необходимо прописать:
                              $q->sortby('product_id', 'ASC');
                              $q->sortby('rank', 'DESC');
                              Спасибо, Илья! Прекрасный скрипт! О таких возможностях Console узнал благодаря твоему скрипту. :)
                              1. Илья Уткин 17 июня 2017, 16:19 # 0
                                Спасибо за решение проблемы — тут уже отписывались, что порядок сбивается. Поправил в статье.
                              2. Василий Столейков 28 июня 2017, 16:54 # 0
                                Скрипт для минишопа сгенерировал процентов 20 и упал с следующей ошибкой:
                                Fatal error: Uncaught Error: Call to a member function removeObject() on null in /home/s10089/www/core/components/minishop2/model/minishop2/msproductfile.class.php:275 
                                Stack trace: 
                                #0 /home/s10089/www/core/components/minishop2/processors/mgr/gallery/generate.class.php(38): msProductFile->remove() 
                                #1 /home/s10089/www/core/model/modx/modprocessor.class.php(173): msProductFileGenerateProcessor->process() 
                                #2 /home/s10089/www/core/model/modx/modx.class.php(1706): modProcessor->run() 
                                #3 /home/s10089/www/core/components/console/processors/exec.class.php(24) : eval()'d code(14): modX->runProcessor('mgr/gallery/gen...', Array, Array) 
                                #4 /home/s10089/www/core/components/console/processors/exec.class.php(24): eval() 
                                #5 /home/s10089/www/core/model/modx/modprocessor.class.php(173): ConsoleExecProcessor->process() 
                                #6 /home/s10089/www/core/model/modx/modx.class.php(1706): modProcessor->run() 
                                #7 /home/s10089/www/core/model/modx/modconnectorresponse.class.php(140): modX->runProcessor('exec', Array, Array) 
                                #8 /home/s10089/www/core/model/mo in /home/s10089/www/core/components/minishop2/model/minishop2/msproductfile.class.php on line 275
                                
                                Перегенерация заново сразу же выдаёт эту ошибку.
                                Переустановка минишопа ничего не даёт.
                                Куда копать?
                                1. Василий Столейков 28 июня 2017, 17:04 # 0
                                  Запустил этот консольный php-скрипт и консоль мне выбила кучу таких ошибок:
                                  libpng warning: Ignoring incorrect cHRM value when sRGB is also present
                                  wx=0.345750, wy=0.358550, rx=0.648500, ry=0.330880
                                  gx=0.321210, gy=0.597870, bx=0.155890, by=0.066040
                                  libpng warning: Ignoring incorrect cHRM value when sRGB is also present
                                  wx=0.345750, wy=0.358550, rx=0.648500, ry=0.330880
                                  gx=0.321210, gy=0.597870, bx=0.155890, by=0.066040
                                  libpng warning: Ignoring incorrect cHRM value when sRGB is also present
                                  wx=0.345750, wy=0.358550, rx=0.648500, ry=0.330880
                                  gx=0.321210, gy=0.597870, bx=0.155890, by=0.066040
                                  
                                  Хостинг MODHOST.PRO, тариф Минимальный.
                                  Что бы это могло быть?
                                  1. Илья Уткин 28 июня 2017, 17:11 # 0
                                    Хм… не знаю… с таким не сталкивался
                                    1. Василий Столейков 29 июня 2017, 10:42 # 0
                                      Решил проблему поэтапно.

                                      1. Там более 2500 товаров, из которых около 700 были с неверным источником. Исправил это в базе.
                                      2. Потом воспользовался консольным php-скриптом, и указывал конкретно категорию в коде и выполнял скрипт. И так для каждой категории.

                                      Ошибки тоже вылезали, но в общем всё прошло успешно.
                                  2. Grigory Petin 12 июля 2017, 14:28 # 0
                                    Илья, плагина для копирования картинок при копировании ресурса у тебя, случаем, нет?
                                    1. Илья Уткин 13 июля 2017, 08:26 # 0
                                      Неа, пока не сталкивался с такой ситуацией.
                                    2. Владимир 17 октября 2017, 08:57 # 0
                                      Прекрасный скрипт! Спасибо!
                                      1. Al_Benedict 19 декабря 2017, 18:14 # 0
                                        Илья, такой вопрос:

                                        ms2gallery с пагинацией можно организовать так:

                                        [[!pdoPage?
                                        &element=`pdoResources`
                                        &loadModels=`ms2gallery`
                                        &class=`msResourceFile`
                                        &tpl=`@INLINE <a href="[[+320x480]]" data-lightbox="roadtrip"><img src="[[+url]]" /></a>`
                                        &where=`{"resource_id":12,"path:LIKE":"%/120x90/","active":1}`
                                        &limit=`10`
                                        &sortby=`id`
                                        &sortdir=`ASC`
                                        ]]
                                        [[!+page.nav]]
                                        Не подскажите, как вывести подключение других размеров миниатюр и выводить их по клику?
                                        1. Илья Уткин 08 января 2018, 14:58 # 0
                                          Для этого нужно использовать leftJoin — с его помощью присоединить нужные превьюшки — тогда всё будет работать.
                                        2. Al_Benedict 04 января 2018, 01:02 # 0
                                          Скрипт отличный, но, если используется ватермарк, слетает со всех фото в ms2gallery. С этой проблемой не сталкивался?
                                          1. Илья Уткин 08 января 2018, 14:59 # 0
                                            Да, в настройках источника нужно правильно указать путь к картинке для водяного знака. Где-то на modx.pro уже был вопрос про это.
                                          2. Денис 17 февраля 2018, 17:28 # 0
                                            Здравствуйте! При запуске скрипта выскакивает следующая ошибка:
                                            Fatal error: Uncaught Error: Call to a member function removeObject() on null in /home/e/bel/bel/core/components/minishop2/model/minishop2/msproductfile.class.php:275 Stack trace: #0 /home/e/bel/bel/core/components/minishop2/processors/mgr/gallery/generate.class.php(38): msProductFile->remove() #1 /home/e/bel/bel/core/model/modx/modprocessor.class.php(173): msProductFileGenerateProcessor->process() #2 /home/e/bel/bel/core/model/modx/modx.class.php(1705): modProcessor->run() #3 /home/e/bel/bel/core/components/console/processors/exec.class.php(24) : eval()'d code(14): modX->runProcessor('mgr/gallery/gen...', Array, Array) #4 /home/e/bel/bel/core/components/console/processors/exec.class.php(24): eval() #5 /home/e/bel/bel/core/model/modx/modprocessor.class.php(173): ConsoleExecProcessor->process() #6 /home/e/bel/bel/core/model/modx/modx.class.php(1705): modProcessor->run() #7 /home/e/bel/bel/core/model/modx/modconnectorresponse.class.php(140): modX->runProcessor('exec', Ar in /home/e/bel/bel/core/components/minishop2/model/minishop2/msproductfile.class.php on line 275
                                            Может что посоветуете как исправить? Заранее спасибо!
                                            1. Vitaliy 16 апреля 2018, 21:10 # 0
                                              Удалось решить вопрос? у меня аналогичная ошибка
                                              1. Мартин 02 сентября 2019, 21:17 # 0
                                                У меня случилась такая ошибка из-за того, что я вручную из БД удалил товары, а в таблице `modx_ms2_product_files` остались ссылки на изображения к этим товарам (изображения тоже удалил). Помогла чистка таблицы `modx_ms2_product_files`.
                                            2. Кирилл 12 декабря 2018, 00:38(Комментарий был изменён) # 0
                                              При запуске первого скрипта получаю такое… Никто не сталкивался?

                                              Fatal error: Uncaught Error: Call to a member function set() on null in /home/s6103/www/core/components/minishop2/processors/mgr/gallery/generate.class.php:45 Stack trace: #0 /home/s6103/www/core/model/modx/modprocessor.class.php(173): msProductFileGenerateProcessor->process() #1 /home/s6103/www/core/model/modx/modx.class.php(1704): modProcessor->run() #2 /home/s6103/www/core/components/console/processors/exec.class.php(24) : eval()'d code(14): modX->runProcessor('mgr/gallery/gen...', Array, Array) #3 /home/s6103/www/core/components/console/processors/exec.class.php(24): eval() #4 /home/s6103/www/core/model/modx/modprocessor.class.php(173): ConsoleExecProcessor->process() #5 /home/s6103/www/core/model/modx/modx.class.php(1704): modProcessor->run() #6 /home/s6103/www/core/model/modx/modconnectorresponse.class.php(140): modX->runProcessor('exec', Array, Array) #7 /home/s6103/www/core/model/modx/modconnectorrequest.class.php(82): modConnectorResponse->outputContent(Array) #8 /home/s6103/www/core/model/modx/modconnectorreques in /home/s6103/www/core/components/minishop2/processors/mgr/gallery/generate.class.php on line 45
                                              1. Андрей 27 апреля 2019, 13:19 # 0
                                                Какие-то чудеса. запускаю оба скрипта по очереди, ни один не накладывает водяной знак. А если в ручную для товара в админке нажать обновить превью — то все отлично.
                                                Илья, подскажите, как побороть?
                                                на сайте настроена интеграция ms2Gallery с Minishop2
                                                1. Ivan Bochkarev 07 мая 2019, 11:28 # 0
                                                  Прописать путь до картинки:
                                                  «big»:
                                                  {"w":1280,"q":90,"zc":"0","f":"png","bg":"","ra":1,"fltr":"wmi|/assets/components/minishop2/wm.png|BR|80|90|90|0"}
                                                2. Никита 29 апреля 2021, 16:56(Комментарий был изменён) # 0
                                                  Здравствуйте Илья, возникает проблема при запуске скрипта через сервер. Использую
                                                  $result = file_get_contents($url, false, stream_context_create(array(
                                                  'http' => array(
                                                  'method' => 'POST',
                                                  'header' => 'Content-type: application/x-www-form-urlencoded;Cache-Control: no-cache, must-revalidate;Pragma: no-cache',
                                                  'content' => http_build_query($params)
                                                  )
                                                  )));
                                                  echo $result;
                                                  url — страница сайта со сниппетом скрипта

                                                  Скрипт выполняется, получаю 100%, но миниатюры не генерируются,
                                                  хотя при заходе на страницу со сниппетом через браузер все работает

                                                  1. Илья Уткин 29 апреля 2021, 17:27 # 0
                                                    Не знаю, это же вообще другой код какой-то. Это про ms2Gallery?
                                                    1. Никита 30 апреля 2021, 10:18(Комментарий был изменён) # 0
                                                      Да нет это просто код, который заходит на страницу modx
                                                      с вашим скриптом (первым вариантом скрипта, не ms2Gallery) и запускает его.
                                                      Если захожу на эту страницу через браузер все работает,
                                                      а если через код указанный в моем предыдущем сообщении,
                                                      происходит вывод сообщения выполнено 100%(количество товаров),
                                                      но ничего не выполнено=/

                                                      Также при подключении стороннего php файла к ядру modx и запуске скрипта
                                                      уже в нем, происходит тоже самое, вывод сообщения 100%, но по факту ничего не выполнено.

                                                      В общем есть ли возможность запускать этот скрипт со стороны сервера?

                                                      Для меня это загадка… если бы скрипт не запускался, то не выводилось бы и сообщение
                                                      1. Илья Уткин 30 апреля 2021, 10:50 # 0
                                                        Это скрипты для запуска в дополнении Console, поэтому у вас они не работают.
                                                        1. Илья Уткин 30 апреля 2021, 10:51 # 0
                                                          Вам нужен какой-то такой вариант — bezumkin.ru/modx/minishop2/solutions/1465/
                                                    2. Никита 30 апреля 2021, 13:04 # 0
                                                      Спасибо!
                                                      1. Алексей 06 декабря 2021, 16:26(Комментарий был изменён) # 0
                                                        Здравствуйте!

                                                        Ищу ответ, но не нахожу. (UPD. нашел ответ). Но назрел ещё один — никакие компоненты теперь не устанавливаются из modstore (

                                                        При генерации превью указывается определённое значение высоты и ширины. А есть ли возможность генерировать с фиксированной шириной, но высоту делать «пропорционально» исходнику? Это было бы полезно для вывода изображений для мобильных устройств (в роли главных изображений использовать такие превьюшки). Где можно посмотреть весь возможный синтаксис генерации?

                                                        UPD/ Вопрос отменяется. Нашел синтаксис в описании ms2gallery

                                                        Авторизация

                                                        через сервис Loginza:


                                                        Шаблоны MODX

                                                        1 2 Дальше »

                                                        Объектная
                                                        модель
                                                        MODX