spacecatninja / craft-imager-x

Image transforms, optimizations and manipulations for your Craft CMS site.
Other
26 stars 16 forks source link

Image Generation fails with `Illegal offset type in isset or empty` #149

Closed MattWilcox closed 2 years ago

MattWilcox commented 2 years ago

I'm submitting a...

Description

Failed transform generation on saving a field. I think this is a bug, as I can't spot something I've not done right in the imager-x-generate.php file, and the transforms themselves work "without" the generation part.

Screenshot 2022-05-04 at 11 37 50

Displayed errors, stack trace, relevant logs

queue.log:

2022-05-04 10:33:05 [queue.INFO] [craft\queue\QueueLogBehavior::beforeExec]  [11] Generating transforms for asset "test-page-2.jpg" (ID 10) (attempt: 1, pid: 252) - Started {"memory":22727832} 
2022-05-04 10:33:05 [queue.ERROR] [craft\queue\QueueLogBehavior::afterError]  [11] Generating transforms for asset "test-page-2.jpg" (ID 10) (attempt: 1, pid: 252) - Error (time: 0.002s): Illegal offset type in isset or empty {"memory":22812480} 
2022-05-04 10:33:05 [queue.ERROR] [TypeError] TypeError: Illegal offset type in isset or empty in /app/vendor/spacecatninja/imager-x/src/services/GenerateService.php:279
Stack trace:
#0 /app/vendor/spacecatninja/imager-x/src/jobs/TransformJob.php(64): spacecatninja\imagerx\services\GenerateService->generateTransformsForAsset(Object(craft\elements\Asset), Array)
#1 /app/vendor/yiisoft/yii2-queue/src/Queue.php(246): spacecatninja\imagerx\jobs\TransformJob->execute(Object(craft\queue\Queue))
#2 /app/vendor/yiisoft/yii2-queue/src/cli/Queue.php(147): yii\queue\Queue->handleMessage('11', 'O:39:"spacecatn...', '300', 1)
#3 /app/vendor/craftcms/cms/src/queue/Queue.php(182): yii\queue\cli\Queue->handleMessage('11', 'O:39:"spacecatn...', '300', 1)
#4 /app/vendor/craftcms/cms/src/queue/Queue.php(157): craft\queue\Queue->executeJob()
#5 [internal function]: craft\queue\Queue->craft\queue\{closure}(Object(Closure))
#6 /app/vendor/yiisoft/yii2-queue/src/cli/Queue.php(117): call_user_func(Object(Closure), Object(Closure))
#7 /app/vendor/craftcms/cms/src/queue/Queue.php(165): yii\queue\cli\Queue->runWorker(Object(Closure))
#8 /app/vendor/craftcms/cms/src/controllers/QueueController.php(82): craft\queue\Queue->run()
#9 [internal function]: craft\controllers\QueueController->actionRun()
#10 /app/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#11 /app/vendor/yiisoft/yii2/base/Controller.php(178): yii\base\InlineAction->runWithParams(Array)
#12 /app/vendor/yiisoft/yii2/base/Module.php(552): yii\base\Controller->runAction('run', Array)
#13 /app/vendor/craftcms/cms/src/web/Application.php(301): yii\base\Module->runAction('queue/run', Array)
#14 /app/vendor/craftcms/cms/src/web/Application.php(625): craft\web\Application->runAction('queue/run', Array)
#15 /app/vendor/craftcms/cms/src/web/Application.php(280): craft\web\Application->_processActionRequest(Object(craft\web\Request))
#16 /app/vendor/yiisoft/yii2/base/Application.php(384): craft\web\Application->handleRequest(Object(craft\web\Request))
#17 /app/web/index.php(12): yii\base\Application->run()
#18 {main} {"memory":22812856,"exception":"[object] (TypeError(code: 0): Illegal offset type in isset or empty at /app/vendor/spacecatninja/imager-x/src/services/GenerateService.php:279)"} 
2022-05-04 10:33:05 [queue.ERROR] [TypeError] TypeError: Illegal offset type in isset or empty in /app/vendor/spacecatninja/imager-x/src/services/GenerateService.php:279
Stack trace:
#0 /app/vendor/spacecatninja/imager-x/src/jobs/TransformJob.php(64): spacecatninja\imagerx\services\GenerateService->generateTransformsForAsset(Object(craft\elements\Asset), Array)
#1 /app/vendor/yiisoft/yii2-queue/src/Queue.php(246): spacecatninja\imagerx\jobs\TransformJob->execute(Object(craft\queue\Queue))
#2 /app/vendor/yiisoft/yii2-queue/src/cli/Queue.php(147): yii\queue\Queue->handleMessage('11', 'O:39:"spacecatn...', '300', 1)
#3 /app/vendor/craftcms/cms/src/queue/Queue.php(182): yii\queue\cli\Queue->handleMessage('11', 'O:39:"spacecatn...', '300', 1)
#4 /app/vendor/craftcms/cms/src/queue/Queue.php(157): craft\queue\Queue->executeJob()
#5 [internal function]: craft\queue\Queue->craft\queue\{closure}(Object(Closure))
#6 /app/vendor/yiisoft/yii2-queue/src/cli/Queue.php(117): call_user_func(Object(Closure), Object(Closure))
#7 /app/vendor/craftcms/cms/src/queue/Queue.php(165): yii\queue\cli\Queue->runWorker(Object(Closure))
#8 /app/vendor/craftcms/cms/src/controllers/QueueController.php(82): craft\queue\Queue->run()
#9 [internal function]: craft\controllers\QueueController->actionRun()
#10 /app/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#11 /app/vendor/yiisoft/yii2/base/Controller.php(178): yii\base\InlineAction->runWithParams(Array)
#12 /app/vendor/yiisoft/yii2/base/Module.php(552): yii\base\Controller->runAction('run', Array)
#13 /app/vendor/craftcms/cms/src/web/Application.php(301): yii\base\Module->runAction('queue/run', Array)
#14 /app/vendor/craftcms/cms/src/web/Application.php(625): craft\web\Application->runAction('queue/run', Array)
#15 /app/vendor/craftcms/cms/src/web/Application.php(280): craft\web\Application->_processActionRequest(Object(craft\web\Request))
#16 /app/vendor/yiisoft/yii2/base/Application.php(384): craft\web\Application->handleRequest(Object(craft\web\Request))
#17 /app/web/index.php(12): yii\base\Application->run()
#18 {main} {"memory":22813608,"exception":"[object] (TypeError(code: 0): Illegal offset type in isset or empty at /app/vendor/spacecatninja/imager-x/src/services/GenerateService.php:279)"} 
2022-05-04 10:33:05 [queue.INFO] [craft\queue\QueueLogBehavior::beforeExec]  [8] t9n:["app","Updating search indexes"] (attempt: 1, pid: 252) - Started {"memory":22829216} 
2022-05-04 10:33:05 [queue.INFO] [craft\queue\QueueLogBehavior::afterExec]  [8] t9n:["app","Updating search indexes"] (attempt: 1, pid: 252) - Done (time: 0.006s) {"memory":23063392} 
2022-05-04 10:33:05 [queue.INFO] [craft\queue\QueueLogBehavior::beforeExec]  [9] t9n:["app","Updating search indexes"] (attempt: 1, pid: 252) - Started {"memory":23067984} 
2022-05-04 10:33:05 [queue.INFO] [craft\queue\QueueLogBehavior::afterExec]  [9] t9n:["app","Updating search indexes"] (attempt: 1, pid: 252) - Done (time: 0.001s) {"memory":23089032} 
2022-05-04 10:33:05 [queue.INFO] [craft\queue\QueueLogBehavior::beforeExec]  [10] t9n:["app","Updating search indexes"] (attempt: 1, pid: 252) - Started {"memory":23094560} 
2022-05-04 10:33:05 [queue.INFO] [craft\queue\QueueLogBehavior::afterExec]  [10] t9n:["app","Updating search indexes"] (attempt: 1, pid: 252) - Done (time: 0.022s) {"memory":23890936} 
2022-05-04 10:33:05 [queue.INFO] [craft\queue\QueueLogBehavior::beforeExec]  [12] t9n:["app","Pruning extra revisions"] (attempt: 1, pid: 252) - Started {"memory":23903104} 
2022-05-04 10:33:05 [queue.INFO] [craft\queue\QueueLogBehavior::afterExec]  [12] t9n:["app","Pruning extra revisions"] (attempt: 1, pid: 252) - Done (time: 0.001s) {"memory":23921224} 
2022-05-04 10:33:05 [queue.INFO] [application] Request context:
$_GET = [
    'p' => 'secretadmin/actions/queue/run'
    'v' => '1651660385203'
]

Additional info

Craft4 beta everything at the latest version.

imager-x.php

<?php
// General ImagerX settings here, see:
// https://imager-x.spacecat.ninja/configuration.html#general-configuration

use craft\helpers\App;

return [
    '*' => [
        'interlace' => true,
        'allowUpscale' => true,
        'safeFileFormats' => ['jpg', 'jpeg', 'gif', 'png', 'webp']
    ],

    'dev' => [
        // Nitro has webp support in ImageMagik and so does not need Custom Encoders to handle them
        // 'mockImage' => '/assets/images/missing-image.png',
        'cacheEnabled' => false,
        'suppressExceptions' => false
    ],

    'staging' => [
        // Ubuntu doesn't have webp support baked into ImageMagik, so we provide cwebp
        'customEncoders' => [
            'webp' => [
                'path' => App::env('PATH_TO_CWEBP'),
                'options' => [
                    'quality' => 80,
                    'effort' => 4,
                ],
                'paramsString' => '-q {quality} -m {effort} {src} -o {dest}'
            ],
        ],
    ],

    'production' => [
        // Ubuntu doesn't have webp support baked into ImageMagik, so we provide cwebp
        'customEncoders' => [
            'webp' => [
                'path' => App::env('PATH_TO_CWEBP'),
                'options' => [
                    'quality' => 80,
                    'effort' => 4,
                ],
                'paramsString' => '-q {quality} -m {effort} {src} -o {dest}'
            ],
        ],
    ]
];

imager-x-generate.php

<?php
// when to generate which Named Transforms, see:
// https://imager-x.spacecat.ninja/usage/generate.html#setting-it-up

return [
    'elements' => [
        [
            'elementType' => \craft\elements\Entry::class,
            'criteria' => [
                'section' => 'pages'
            ],
            'fields' => [
                'listingImage'
            ],
            'transforms' => [
                ['bannerImageJpg', 'bannerImageWebp']
            ]
        ]
    ]
];

imager-x-transforms.php

<?php
// Named Transforms are stored here, see:
// https://imager-x.spacecat.ninja/usage/named-transforms.html#nested-named-transforms

return [
    'bannerImageJpg' => [
        'defaults' => [
            'format' => 'jpg',
            'mode' => 'crop',
            'ratio' => 2.39/1,
            'jpegQuality' => 80
        ],
        'transforms' => [
            ['width' => 480, 'ratio' => '16/9'],
            ['width' => 960],
            ['width' => 1500],
            ['width' => 2200]
        ]
    ],
    'bannerImageWebp' => [
        'defaults' => [
            'format' => 'webp',
            'webpQuality' => 80
        ],
        'transforms' => 'bannerImageJpg'
    ]
];
MattWilcox commented 2 years ago

Ignore, I spotted my error! Nested arrays in the transforms that should not be there.

<?php
// when to generate which Named Transforms, see:
// https://imager-x.spacecat.ninja/usage/generate.html#setting-it-up

return [
    'elements' => [
        [
            'elementType' => \craft\elements\Entry::class,
            'criteria' => [
                'section' => 'pages'
            ],
            'fields' => [
                'listingImage'
            ],
            'transforms' => [
                ['bannerImageJpg', 'bannerImageWebp']
            ]
        ]
    ]
];

Should be

<?php
// when to generate which Named Transforms, see:
// https://imager-x.spacecat.ninja/usage/generate.html#setting-it-up

return [
    'elements' => [
        [
            'elementType' => \craft\elements\Entry::class,
            'criteria' => [
                'section' => 'pages'
            ],
            'fields' => [
                'listingImage'
            ],
            'transforms' => [
                'bannerImageJpg',
                'bannerImageWebp'
            ]
        ]
    ]
];