ссылки на ресайзы картинок

движок как-то странно генерит имена файлов картинок и ссылки на них, например:


<img class="js-item__image lazy-img error" src="/wa-data/public/shop/products/77/99/49977/images/56171/56171.200.jpg" data-src="/wa-data/public/shop/products/77/99/49977/images/56171/56171.200.jpg" alt="  " data-was-processed="true">

по факту по указанному пути нет такого файла, а есть 56171.200x0.jpg

настройки изображений в админке:

12 ответов

  • 3
    replicant 27 октября 2021 20:55 #

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

  • 2

    В теме сделано так:
    {$wa->shop->productImgHtml($p, '200', ['itemprop' => 'image', 'alt' => $p.name, 'default' => "`$wa_theme_url`img/dummy200.png"])}

    По факту, чтобы совпадало с существующим эскизом 200x0 надо так:
    {$wa->shop->productImgHtml($p, '200x0', ['itemprop' => 'image', 'alt' => $p.name, 'default' => "`$wa_theme_url`img/dummy200.png"])}

    Эта фича тянется с темы Default и перекочевала почти во все темы дизайна.
    Если включена настройка магазина "генерить эскизы на лету", то картинка создастся. Понятно, что будет два эскиза 56171.200x0.jpg и 56171.200.jpg и это будет полные дубли, что не есть хорошо.

    • +1
      Михаил Михаил 28 октября 2021 08:00 #

      подскажите, пожалуйста, в каком шаблоне искать? я с опенкарта перехожу на webasyst, ещё не разобрался с архитектурой

      • +1
        replicant replicant 28 октября 2021 09:08 #

        Обычно эскизы 200 точек используются в товарных списках, т.е. это могут быть шаблоны типа list-thumbs.html или products.***.html или подобные (смотреть по содержанию, искать цифру 200, пример кода см. выше), но названия файлов шаблонов и их связывание друг с другом могут отличаться в разных темах, т.к. это по своему усмотрению делает автор темы так, как ему удобно.

    • +1
      Михаил Михаил 14 ноября 2021 14:46 #

      а генерация эскизов "на лету" от чего зависит? точнее, что может мешать её работе? я сейчас тренируюсь с вебасистом на локалке (OpenServer), может, что-то требуется для корректной работы?

      • +1
        Михаил Михаил 14 ноября 2021 15:16 #

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

        • +1

          "На лету" значит, что картинка сгенерируется, когда она будет запрошена браузером. В OS ничего дополнительно настраивать не нужно. Главное, чтобы вебсервер Апач был. Он подтянет все необходимые инструкции из .htaccess.

          • +1
            Михаил Михаил 14 ноября 2021 16:36 #

            апач 2.3. и, раз картинка не генерится, значит, апач не подтягивает инструкции из htaccess, а выглядит он так:

            <FilesMatch "\.md5$">
                Deny from all
            </FilesMatch>
            
            DirectoryIndex index.php
            Options -Indexes
            # Comment the following line, if option Multiviews not allowed here
            Options -MultiViews
            
            AddDefaultCharset utf-8
            
            <ifModule mod_rewrite.c>
                RewriteEngine On
                
                # Uncomment the following line, if you are having trouble
                #RewriteBase /
            
                # if request js file from ROOT
                RewriteCond %{REQUEST_URI} ^\/?[^\/]+\.js$ [or]
                # or if NOT request certain static file from anywhere
                RewriteCond %{REQUEST_URI} !\.(js|css|jpg|jpeg|gif|png|svg|ttf|eot|otf|woff|woff2)$ [or]
                # or if request apple-touch-icon.png icon
                RewriteCond %{REQUEST_URI} apple-touch-icon\.png$ [or]
            
                # or if other conditions for webdav and caldav are passed
                RewriteCond %{REQUEST_METHOD} ^(POST|PUT|COPY|MOVE|DELETE|PROPFIND|OPTIONS|MKCOL)$ [or]
                RewriteCond %{HTTP:Translate} ^.+$ [or]
                RewriteCond %{HTTP_USER_AGENT} ^(DavClnt|litmus|gvfs|davfs|wdfs|WebDAV|cadaver|Cyberduck)
            
                # or if file doesnt' exist
                RewriteCond %{REQUEST_FILENAME} !-f
                # or if directory doesnt' exist
                RewriteCond %{REQUEST_FILENAME} !-d
            
                # dispatch it to index.php
                RewriteRule ^(.*)$ index.php [L,QSA]
            </ifModule>
            
            <ifModule mod_headers.c>
                <FilesMatch "\.(jpg|jpeg|png|gif|js|css|svg|ttf|eot|otf|woff|woff2)$">
                    Header set Cache-Control "max-age=3153600, public"
                </FilesMatch>
            </ifModule>
            


            • +2

              я знаю как выглядит стандартный .htaccess ;)

              Но речь была об этом wa-data/public/shop/products/.htaccess

              Если нужный ресайз не сгенерирован, запрос перенаправляется в файл thumb.php, который лежит в той же папке.

              Настройки вебсервера вроде не менял и всё работает:

              Но ещё раз: нужно картинку открыть по ссылке, чтобы файл сгенерировался.

              Пересоздание эскизов создаёт только те, что прописаны в настройках магазина.

              • +1
                Михаил Михаил 14 ноября 2021 17:16 #

                при открытии неотображаемой картинки по ссылке - 404

                настройки сервера такие:



                настройки ресайзов в админке прикреплял в стартпосте (сейчас 2. картинку не могу прицепить)

                wa-data/public/shop/products/.htaccess
                <ifModule mod_rewrite.c>
                    RewriteEngine On
                
                    RewriteCond %{REQUEST_FILENAME} !-f
                    RewriteRule ^(.*)$ thumb.php [L,QSA]
                </ifModule>
                
                

                wa-data/public/shop/products/thumb.php

                <?php
                        $file = realpath(dirname(__FILE__)."/../../../../")."/wa-apps/shop/lib/config/data/thumb.php";
                        
                        if (file_exists($file)) {
                            include($file);
                        } else {
                            header("HTTP/1.0 404 Not Found");
                        }
                        

                и wa-apps/shop/lib/config/data/thumb.php

                <?php
                /**
                 * @todo check allowed sizes
                 * @todo use resize options (quiality and filters)
                 * @todo use error handlers to display error while resize
                 */
                
                $path = realpath(dirname(__FILE__)."/../../../../../");
                $config_path = $path."/wa-config/SystemConfig.class.php";
                
                // Maybe __FILE__ is resolved symlink - try process this case
                if (!file_exists($config_path)) {
                    $script_dir_name = dirname($_SERVER['SCRIPT_FILENAME']); // wa-data/public/shop/products
                    $system_path = realpath($script_dir_name . '/../../../../');
                    $config_path = $system_path."/wa-config/SystemConfig.class.php";
                }
                
                if (!file_exists($config_path)) {
                    header("Location: ../../../wa-apps/shop/img/image-not-found.png");
                    exit;
                }
                
                require_once($config_path);
                $config = new SystemConfig();
                waSystem::getInstance(null, $config);
                /**
                 * @var shopConfig $app_config
                 */
                $app_config = wa('shop')->getConfig();
                $request_file = $app_config->getRequestUrl(true, true);
                $request_file = preg_replace("@^thumb\.php(/products)?/?@", '', $request_file);
                $protected_path = wa()->getDataPath('products/', false, 'shop');
                $public_path = wa()->getDataPath('products/', true, 'shop');
                
                $main_thumb_file = false;
                $file = false;
                $size = false;
                $enable_2x = false;
                
                // /wa-data/public/shop/products/69/42/14269/images/194/194.96x96.jpg
                $image_pattern = '#^((?:\d{2}/){2}([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];
                    $size = $matches[5];
                    $gen_thumbs = $app_config->getOption('image_thumbs_on_demand');
                
                    if ($file && !$gen_thumbs) {
                        $thumbnail_sizes = $app_config->getImageSizes();
                        if (in_array($size, $thumbnail_sizes) === false) {
                            $file = false;
                        }
                    }
                    if ($matches[6] && $app_config->getOption('enable_2x')) {
                        $enable_2x = true;
                        $size = explode('x', $size);
                        foreach ($size as &$s) {
                            $s *= 2;
                        }
                        unset($s);
                        $size = implode('x', $size);
                    }
                } elseif (preg_match($video_pattern, $request_file, $matches)) {
                    $file = $matches[1].'.'.$matches[5];
                    $size = $matches[3];
                    $gen_thumbs = $app_config->getOption('image_thumbs_on_demand');
                
                    if ($file && !$gen_thumbs) {
                        $thumbnail_sizes = $app_config->getImageSizes();
                        if (in_array($size, $thumbnail_sizes) === false) {
                            $file = false;
                        }
                    }
                }
                wa()->getStorage()->close();
                
                $original_path = $protected_path.$file;
                $thumb_path = $public_path.$request_file;
                if ($file && file_exists($original_path) && !file_exists($thumb_path)) {
                    $thumbs_dir = dirname($thumb_path);
                    if (!file_exists($thumbs_dir)) {
                        waFiles::create($thumbs_dir);
                    }
                    $max_size = $app_config->getOption('image_max_size');
                    if ($max_size && $enable_2x) {
                        $max_size *= 2;
                    }
                    $image = shopImage::generateThumb($original_path, $size, $max_size);
                    if ($image) {
                        $image->save($thumb_path, $app_config->getSaveQuality($enable_2x));
                        clearstatcache();
                    }
                }
                
                if ($file && file_exists($thumb_path)) {
                    waFiles::readFile($thumb_path);
                } else {
                    header("HTTP/1.0 404 Not Found");
                    exit;
                }
                

              • +1
                Михаил Михаил 14 ноября 2021 17:52 #

                отключил nginx - всё заработало) спасибо!

Добавить ответ

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