1

Does anyone know if there is a block on updating users form an action?

Trying to update a users custom field in craft 3 via plugin in the admin. The admin template calls an ajax call to the action when a drop-down is changed.

This works ok in the base of the plugin, but not in an action.

    public function actionUpdateuser()
    {
        // Update user data
        $userId = 67852;
        $user = Craft::$app->users->getUserById($userId);
        $user->setFieldValue('userCompanyName', 'New Name 2'); 
        $result = Craft::$app->elements->saveElement($user);

        return $result;
    }

The action fires ok and can return other things just does not update the user.

2
  • What type of field is your userCompanyName?
    – Oli
    Commented Feb 9, 2020 at 10:16
  • It's just a plain text field. It works ok if I add the same code to the Custom.php which is the main plugin file.
    – Green17
    Commented Feb 9, 2020 at 14:19

2 Answers 2

3

You should just reference the field as an object property of the user instead of using setFieldValue. I also use the getElements function instead of using the property, but I don't think that makes much difference. The code below should work.

public function actionUpdateuser() {
    // Update user data
    $userId = 67852;
    $user = Craft::$app->users->getUserById($userId);
    $user->userCompanyName = 'New Name 2'; 
    $result = Craft::$app->getElements()->saveElement($user);

    return $result;
}

Also make sure to add the Craft Users class at the top of the page with:

use craft\elements\User;
1
  • Thanks, Steven, sorry some how missed this coming in.
    – Green17
    Commented Sep 1, 2020 at 12:51
2

The way we ended up getting this working is below. Seems you need to send a title or set the flag to false for validation - if you do that it then set a default title.

Ensuring the element has a title if its type has titles, and giving it a default title in the event that $validateContent is set to false

https://docs.craftcms.com/api/v3/craft-services-elements.html#method-saveelement

//User id
$userId = 7780;
$user = Craft::$app->users->getUserById($userId);

//Could also get the users form something like the below:
//$user = Craft::$app->users->getUserByUsernameOrEmail($usersEmail);//users email
//$user = Craft::$app->users->getUserById($userId);//users ID
//$user = Craft::$app->getUser()->getIdentity();//curent user

//Set the new data to be saved:
$user->setFieldValue('userCompanyName', 'update text here');

//Save:
$save = Craft::$app->getElements()->saveElement($user, false);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.