Не используемое поле в таблице shop_product_images На рассмотрении

1

В этой таблице есть поле, которое совершенно не нужно и нигде не используется. Это поле original_filename

Оно, по идее, нужно чтобы восстанавливать эскизы из файла оригинала. Однако в thumb.php мы видим вот такой фрагмент кода:


$image_pattern = '#^((?:\d{2}/){2}([0-9]+)/(?:reviews/[0-9]+/)?images/)([0-9]+)/([a-zA-Z0-9_\.-]+)\.(\d+(?:x\d+)?)(@2x)?\.([a-z]{3,4})$#i';
// /wa-data/public/shop/products/69/42/14269/video/96x96.jpg
$video_pattern = '#^((?:\d{2}/){2}([0-9]+)/video)/(\d+(?:x\d+)?)(@2x)?\.([a-z]{3,4})$#i';
if (preg_match($image_pattern, $request_file, $matches)) {
    if ($matches[3] === $matches[4]) {
        $n = $matches[3];
    } else {
        $n = $matches[3].'.'.$matches[4];
    }
    $file = $matches[1].$n.'.'.$matches[7];

.........................

$original_path = $protected_path.$file;

То есть скрипт ищет файл с именем, которое генерируется из поля filename, а original_filename полностью игнорируется. Предлагаю удалить это поле либо задействовать, чтобы оно таки использовалось и несло какой-то смысл.

12 комментариев

  • +1
    ITFrogs ITFrogs 5 сентября 2022 22:24 #

    Вдогонку смотрим класс shopImage и смотрим


        public static function getOriginalPath($image)
        {
            $sub_path = self::getSubPath($image);
            $path = shopProduct::getPath($image['product_id'], "$sub_path/{$image['id']}.original.{$image['ext']}");
            return $path;
        }

    На этот метод ссылаются все внутренние механизмы шопскрипта типа восстановления эскизов из оригиналов. То есть, если мы хотим чтобы правильно восстанавливались картинки, то в поле filename обязательно нужно записать строку "original" и ничего другого. Можно вписать другое, оно будет работать, но все методы, использующие shopImage::getOriginalPath дадут сбой.


    Я раньше все время удивлялся почему, если используется плагин синхронизации для создания товаров, то эскизы на таких товарах не восстанавливаются из оригинала. Вот вам и ответ.

  • +1
    Михаил Ушенин Михаил Ушенин Webasyst 6 сентября 2022 09:08 #

    Вы считаете, что из-за наличия в таблице неиспользуемого поля неправильно работает какой-то конкретный плагин? Какой именно плагин? Какой последовательностью действий можно продемонстрировать ошибку в работе плагина?

    • +1
      ITFrogs ITFrogs 6 сентября 2022 12:51 #

      Я считаю, что у вас бардак в коде в этом месте, и нужно как-то его привести в порядок. Плагины закостыливают этот момент, пишут в эти поля что попало, но, т.к. оно не работает, то особой разницы нет и вреда не наносит. Но было бы полезно,  если бы правильно использовалось поле original_filename и была бы возможность восстанавливать изображения из оригиналов и правильная генерация эскизов налету. Сейчас или одно или другое. Просто попробуйте сами разобраться откуда берется путь к оригиналу фотки в thumb.php и откуда в других местах где используется метод getOriginalPath. Сразу поймете что там что-то не правильно сделано.

      • +1
        Михаил Ушенин Михаил Ушенин Webasyst 6 сентября 2022 14:30 #

        Исправлять код только ради того, чтобы он стал выглядеть логичным, мы вряд ли сможем, потому что непонятно, ради чего это нужно делать, если это не улучшит работу пользователей.

        Если вам это изменение нужно для решения какой-то конкретной задачи, постарайтесь описать эту задачу как можно более конкретно.

        Сейчас или одно или другое.

        Какими действиями можно продемонстрировать это ограничение?

        • +1
          ITFrogs ITFrogs 6 сентября 2022 15:16 #

          $image = waImage::factory($tmp_file_path);
          
          

           $img = array(
          
                                          'product_id' => $product->getId(),
                                          'upload_datetime' => date('Y-m-d H:i:s'),
                                          'width' => $image->width,
                                          'height' => $image->height,
                                          'size' => filesize($image->file),
                                          'filename' => 'testtest', //либо имя, которое получили откуда-либо, например от поставщика
                                          'ext' => 'jpg',
                                      );

                                      $img['id'] = $this->pim->add($img);
                                      $image_path = shopImage::getPath($img);
          
                                      $image->save($image_path);


          if ($this->config->getOption('image_save_original') && ($original_file = shopImage::getOriginalPath($img))) {
                                          waFiles::copy($image->file, $original_file);
          }

          вот это попробуйте сделать и эскизы не будут создаваться у изображения. хотя, с точки зрения кода, тут все верно. последний кусок кода взят из контроллера, который создает товары.

          • +1
            Михаил Ушенин Михаил Ушенин Webasyst 8 сентября 2022 14:28 #
            вот это попробуйте сделать и эскизы не будут создаваться у изображения

            Код выполнил (с небольшими модификациями, чтобы не было ошибок из-за несуществующих переменных или объектов). Эскизы изображения товара создаются.

            Похоже, что я делаю что-то не так, как вы себе это представляете. Возможно, это из-за недостаточно точного или последовательного описания.

            Попробуйте описать проблему ещё раз по такому плану:

            1. Какую задачу вам нужно решить.
            2. Что вы для этого делаете.
            3. Какой результат получаете.
            4. Какой результат ожидали получить вместо этого.
            • +1
              ITFrogs ITFrogs 8 сентября 2022 14:42 #

              какая строка была в filename?

              $original_file точно так же вызывался как у меня в коде?

              • +1
                Михаил Ушенин Михаил Ушенин Webasyst 8 сентября 2022 15:27 #

                Вот весь код, который я выполнил:

                wa('shop');
                $image = waImage::factory(wa()->getConfig()->getPath('log') . '/test.png');
                $product = new shopProduct(429);
                $img = array(
                	'product_id' => $product->getId(),
                	'upload_datetime' => date('Y-m-d H:i:s'),
                	'width' => $image->width,
                	'height' => $image->height,
                	'size' => filesize($image->file),
                	'filename' => 'testtest', //либо имя, которое получили откуда-либо, например от поставщика
                	'ext' => 'jpg',
                );
                $img['id'] = (new shopProductImagesModel())->add($img);
                $image_path = shopImage::getPath($img);
                $image->save($image_path);
                if (wa()->getConfig()->getAppConfig('shop')->getOption('image_save_original') && ($original_file = shopImage::getOriginalPath($img))) {
                	waFiles::copy($image->file, $original_file);
                }
                • +1
                  ITFrogs ITFrogs 8 сентября 2022 16:48 #

                  а можно узнать какой файл и по какому пути прилетел оригинал картинки в итоге?

                  просто может у нас как-то по разному все работает...

                  • +1
                    Михаил Ушенин Михаил Ушенин Webasyst 8 сентября 2022 20:06 #

                    Давайте сделаем так (как обычно): точно и подробно опишите проблему по описанному выше плану. Пришлите пример кода, который вы выполняете. Пример файла, с которым пытаетесь работать. Обоснуйте, почему вы считаете текущее поведение ошибкой, вызванной в коде программных продуктов Webasyst.

                    Мы изучим эту информацию, попробуем повторить ваши действия, постараемся получить тот же результат и либо расскажем, что не так в вашем коде, либо примем сообщение об ошибке в работу.

                    • +1
                      ITFrogs ITFrogs 9 сентября 2022 19:14 #

                      Честно говоря, я не понял почему у вас сработал пример выше. Может быть потому что у меня чистый апач без nginx. Попробую разобраться.

                      • +1
                        Anton F Anton F 12 сентября 2022 02:45 #

                        и не лень тебе?

                        Попробую разобраться.

                        у него в настройках отключена опция image_filename, либо поле filename заполнено

                        нужно чтобы восстанавливать эскизы из файла оригинала

                        поле используется, правда в основном в качестве читабельной метки. кроме того ты упускаешь из вида плагины которые могут использовать данное поле - подобные изменения мог могут привести к проблемам обратной совместимости

                        Добавить комментарий

                        Чтобы добавить комментарий, зарегистрируйтесь или войдите