This forum has moved to a new location and is in read-only mode. Please visit talk.octobercms.com to access the new location.
I'm working on adding an additional image called offline_image to the User object by Rainlab. Rather than coding it with duct tape to upload the image to a directory and referencing the path, I would like to imitate the Avatar attribute as closely as possible.
public function boot()
{
    $this->extendUserModel();
    $this->extendUsersController();
}
protected function extendUserModel()
{
    UserModel::extend(function($model) {
        $model->hasOne = [
            'offline_image' => [\System\Models\File::class, 'key' => 'attachment_id', 'otherKey' => 'field']
        ];
    });
}
protected function extendUsersController()
{
    UsersController::extendFormFields(function($widget) {
        // Prevent extending of related form instead of the intended User form
        if (!$widget->model instanceof UserModel) {
            return;
        }
        $configFile = plugins_path('revurb/userdata/config/text_fields.yaml');
        $config = Yaml::parse(File::get($configFile));
        $widget->addTabFields($config);
        // Broken
        $configFile2 = plugins_path('revurb/userdata/config/image_fields.yaml');
        $config2 = Yaml::parse(File::get($configFile2));
        // $widget->addSecondaryTabFields($config2)
    });
}
text_fields.yaml
# ===================================
#  Extended Profile Field Definitions
# ===================================
offlineImage:
    label: revurb.userdata::lang.user.offlineImage
    type: fileupload
    mode: image
    imageHeight: 1920
    imageWidth: 1080
If I don't set the 'otherKey' to 'field', I get the Avatar image reference. With the field, I'm getting an error when uploading an image: Call to undefined method October\Rain\Database\QueryBuilder::isPublic()
How do I extend and process the upload process to ensure all fields are properly set?
mjauvin said:
shouldn't "offlineImage:" be "offline_image:" in text_fields.yaml ?
offlineImage was an old naming which was converted to offline_image. That's a paste error on my end and does not relate to the current state of the code, or the error message.
mjauvin said:
And I don't think "key" and "otherKey" are needed in your relation config.
Without "key", I get a SQL error for system_files.user_id column not found.
It looks like that was a partial fix.
$model->attachOne = [
    'offline_image' => 'System\Models\File'
];
I got an error: Model 'RainLab\User\Models\User' does not contain a definition for 'avatar'. Amending to the following seems to work, but needs to be adjusted to append, instead of replacing.
$model->attachOne = [
    'avatar' => 'System\Models\File',
    'offline_image' => 'System\Models\File'
];
                    Corrected, appending an attachOne is performed via:
$model->attachOne['offline_image'] = 'System\Models\File';
                    1-7 of 7