ryssbowh / craft-activity

Other
3 stars 0 forks source link

Error when saving Matrix Field #16

Closed Kashkin closed 1 year ago

Kashkin commented 1 year ago

When attempting to save a Matrix Field I get the following error:

yii\base\ErrorException: foreach() argument must be of type array|object, string given in /var/www/html/vendor/ryssbowh/craft-activity/src/models/fieldHandlers/projectConfig/Transforms.php:21
Stack trace:
#0 /var/www/html/vendor/craftcms/cms/src/web/ErrorHandler.php(79): yii\base\ErrorHandler->handleError(2, 'foreach() argum...', '/var/www/html/v...', 21)
#1 /var/www/html/vendor/ryssbowh/craft-activity/src/models/fieldHandlers/projectConfig/Transforms.php(21): craft\web\ErrorHandler->handleError(2, 'foreach() argum...', '/var/www/html/v...', 21)
#2 /var/www/html/vendor/yiisoft/yii2/base/BaseObject.php(109): Ryssbowh\Activity\models\fieldHandlers\projectConfig\Transforms->init()
#3 /var/www/html/vendor/craftcms/cms/src/base/Model.php(78): yii\base\BaseObject->__construct(Array)
#4 /var/www/html/vendor/ryssbowh/craft-activity/src/traits/ProjectConfigFields.php(99): craft\base\Model->__construct(Array)
#5 /var/www/html/vendor/ryssbowh/craft-activity/src/traits/ProjectConfigFields.php(44): Ryssbowh\Activity\models\fieldHandlers\projectConfig\BlockFields->getHandler('settings.availa...', 'fields.{uid}.se...', Array, '')
#6 /var/www/html/vendor/ryssbowh/craft-activity/src/traits/ProjectConfigFields.php(62): Ryssbowh\Activity\models\fieldHandlers\projectConfig\BlockFields->getConfigValues('fields.{uid}', Array)
#7 /var/www/html/vendor/ryssbowh/craft-activity/src/models/fieldHandlers/projectConfig/BlockFields.php(82): Ryssbowh\Activity\models\fieldHandlers\projectConfig\BlockFields->getDirtyConfig('fields.{uid}', Array, Array)
#8 /var/www/html/vendor/ryssbowh/craft-activity/src/models/fieldHandlers/projectConfig/BlockFields.php(37): Ryssbowh\Activity\models\fieldHandlers\projectConfig\BlockFields->buildDirty(Array, Array)
#9 /var/www/html/vendor/ryssbowh/craft-activity/src/models/fieldHandlers/projectConfig/BlockFields.php(47): Ryssbowh\Activity\models\fieldHandlers\projectConfig\BlockFields->getDirty(Object(Ryssbowh\Activity\models\fieldHandlers\projectConfig\BlockFields))
#10 /var/www/html/vendor/ryssbowh/craft-activity/src/traits/ProjectConfigFields.php(70): Ryssbowh\Activity\models\fieldHandlers\projectConfig\BlockFields->isDirty(Object(Ryssbowh\Activity\models\fieldHandlers\projectConfig\BlockFields))
#11 /var/www/html/vendor/ryssbowh/craft-activity/src/base/recorders/ConfigModelRecorder.php(72): Ryssbowh\Activity\base\recorders\ProjectConfigRecorder->getDirtyConfig('matrixBlockType...', Array, Array)
#12 /var/www/html/vendor/ryssbowh/craft-activity/src/base/recorders/ConfigModelRecorder.php(24): Ryssbowh\Activity\base\recorders\ConfigModelRecorder->onChanged(Object(craft\events\ConfigEvent), 'matrixBlockSave...')
#13 /var/www/html/vendor/ryssbowh/craft-activity/src/recorders/MatrixBlocks.php(23): Ryssbowh\Activity\base\recorders\ConfigModelRecorder->onUpdate(Object(craft\events\ConfigEvent))
#14 /var/www/html/vendor/craftcms/cms/src/services/ProjectConfig.php(1126): Ryssbowh\Activity\recorders\MatrixBlocks->Ryssbowh\Activity\recorders\{closure}(Object(craft\events\ConfigEvent))
#15 [internal function]: craft\services\ProjectConfig->handleChangeEvent(Object(craft\events\ConfigEvent))
#16 /var/www/html/vendor/yiisoft/yii2/base/Component.php(633): call_user_func(Array, Object(craft\events\ConfigEvent))
#17 /var/www/html/vendor/craftcms/cms/src/models/ProjectConfigData.php(82): yii\base\Component->trigger('updateItem', Object(craft\events\ConfigEvent))
#18 /var/www/html/vendor/craftcms/cms/src/services/ProjectConfig.php(516): craft\models\ProjectConfigData->commitChanges(Array, Array, 'matrixBlockType...', true, 'Save matrix blo...', true)
#19 /var/www/html/vendor/craftcms/cms/src/services/ProjectConfig.php(476): craft\services\ProjectConfig->_setInternal('matrixBlockType...', Array, 'Save matrix blo...', true, false)
#20 /var/www/html/vendor/craftcms/cms/src/services/Matrix.php(240): craft\services\ProjectConfig->set('matrixBlockType...', Array, 'Save matrix blo...')
#21 /var/www/html/vendor/craftcms/cms/src/services/Matrix.php(583): craft\services\Matrix->saveBlockType(Object(craft\models\MatrixBlockType), false)
#22 /var/www/html/vendor/craftcms/cms/src/fields/Matrix.php(1030): craft\services\Matrix->saveSettings(Object(craft\fields\Matrix), false)
#23 /var/www/html/vendor/craftcms/cms/src/services/Fields.php(1732): craft\fields\Matrix->afterSave(false)
#24 /var/www/html/vendor/craftcms/cms/src/services/Fields.php(852): craft\services\Fields->applyFieldSave('47eeb68a-65d6-4...', Array, 'global')
#25 /var/www/html/vendor/craftcms/cms/src/controllers/FieldsController.php(341): craft\services\Fields->saveField(Object(craft\fields\Matrix))
#26 [internal function]: craft\controllers\FieldsController->actionSaveField()
#27 /var/www/html/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#28 /var/www/html/vendor/yiisoft/yii2/base/Controller.php(178): yii\base\InlineAction->runWithParams(Array)
#29 /var/www/html/vendor/yiisoft/yii2/base/Module.php(552): yii\base\Controller->runAction('save-field', Array)
#30 /var/www/html/vendor/craftcms/cms/src/web/Application.php(304): yii\base\Module->runAction('fields/save-fie...', Array)
#31 /var/www/html/vendor/craftcms/cms/src/web/Application.php(607): craft\web\Application->runAction('fields/save-fie...', Array)
#32 /var/www/html/vendor/craftcms/cms/src/web/Application.php(283): craft\web\Application->_processActionRequest(Object(craft\web\Request))
#33 /var/www/html/vendor/yiisoft/yii2/base/Application.php(384): craft\web\Application->handleRequest(Object(craft\web\Request))
#34 /var/www/html/public/index.php(13): yii\base\Application->run()
#35 {main}

I was able to fix it by updating the init() function in vendor/ryssbowh/craft-activity/src/models/fieldHandlers/projectConfig/Transforms.php to:

    public function init(): void
    {
        if ($this->value == '*') {
            $this->fancyValue = \Craft::t('app', 'All');
        } else {
            $this->fancyValue = [];
            if (is_iterable($this->value)) {
                foreach ($this->value as $uid) {
                    $this->fancyValue[] = $this->getTransformName($uid);
                }
                $this->fancyValue = implode(', ', $this->fancyValue);
            } else {
                $this->fancyValue = $this->value;
            }
        }
    }

If I had to guess, it might be UI Element Fields causing the issue? I didn't test further.

My Project

Application Info

PHP version 8.1.13 OS version Linux 5.15.49-linuxkit Database driver & version MySQL 8.0.26 Image driver & version Imagick 3.7.0 (ImageMagick 6.9.11-60) Craft edition & version Craft Pro 4.4.14 Yii version 2.0.47 Twig version v3.4.3 Guzzle version 7.7.0

Plugins

Amazon S3 2.0.3 Batch Actions 1.3.0 Blitz Recommendations 2.1.1 Block Usage 1.0.1 Button Box 4.2.0 Control Panel CSS 2.6.0 Control Panel JS 2.6.0 CP Field Inspect 1.4.4 Craft Geoman 1.0.1 Elements Panel 2.0.0 Embedded Assets 3.1.5 Enforce password 2.0.0 Feed Me 5.1.4 Field Manager 3.0.6 Formie 2.0.31 Hyper 1.1.7 Imager X 4.1.13 Maps v4.0.3 MatrixMate 2.1.3 Minify 4.0.0-beta.2 MJML 2.0.0 Optimise 4.0.28 Palette 3.1.5 Prism 3.0.0 Quick Field 2.0.4 Redactor 3.0.4 Retour 4.1.12 Simple 1.0.0 Smith 2.0.0 Super Table 3.0.9 Svg Picker 2.0.0-rc1 Table Maker 4.0.6 Twigpack 4.0.0-beta.4 Typed link field 2.1.5 Typogrify 4.0.1 UI Element fields 2.0.3 User Activity 2.3.11 Vite 4.0.6

ryssbowh commented 1 year ago

Hi,

You must have a field defining empty image transforms config (like a redactor field) ? I could reproduce the issue and fixed it in 2.3.12

Kashkin commented 1 year ago

Ah, that would make sense. We use Imager, and disable images in Redactor.

Thanks for the fix!