Magento 2 : Unable to set custom customer attributes programmatically
Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;
up vote
4
down vote
favorite
I have a cron job that runs once a day, that reads a file uploaded to the server, and registers users from that file. The code works fine, but now I added a custom attribute to the customer (lets call it customId), which I also want to set programatically, when registering the users, but the problem is, that it only seems to add the custom attribute to the first user, and the others have that field empty.
Here is my code:
namespace PathUserRegistrationCron;
class RegisterUsers
private $storeManager;
private $customerFactory;
private $customerModel;
private $baseUrl;
public function __construct(
MagentoStoreModelStoreManagerInterface $storeManager,
MagentoCustomerModelCustomerFactory $customerFactory,
MagentoCustomerModelCustomer $customerModel)
$this->storeManager = $storeManager;
$this->customerFactory = $customerFactory;
$this->customerModel = $customerModel;
$this->baseUrl = $this->storeManager->getStore()->getBaseUrl();
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->setCustomId($customId);
$customer->save();
public function execute()
$handle = fopen($this->baseUrl . "upload/NewUsers.csv", "r");
if ($handle)
$lineNum = 0;
while (($line = fgets($handle)) !== false)
$lineNum++;
// Ignore first line of csv file
if ($lineNum > 1)
$lineItems = explode(';', $line);
$customId = trim($lineItems[1]);
$email = trim($lineItems[4]);
$password = trim($lineItems[2]);
$name = trim($lineItems[3]);
$websiteId = $this->storeManager->getWebsite()->getId() == 0 ? '1' : $this->storeManager->getWebsite()->getId();
$storeId = $this->storeManager->getStore()->getId() == 0 ? '1' : $this->storeManager->getStore()->getId();
if ($email && $name && $password)
$customerExisting = $this->customerModel->setWebsiteId($storeId)->loadByEmail($email);
$customerExists = $customerExisting->getId() ?? false;
if ($customerExists === false)
$this->register($customId, $email, $password, $name, $websiteId, $storeId);
fclose($handle);
The strange thing is, if I call $customer->getCustomId() right after the $customer->save(), i get back the correct value. So it is saved into the db, but then deleted?
I can also manually add the customId to any user I want, and it works fine.
Any help would be appreciated.
magento2 attributes customer custom-attributes customer-attribute
add a comment |Â
up vote
4
down vote
favorite
I have a cron job that runs once a day, that reads a file uploaded to the server, and registers users from that file. The code works fine, but now I added a custom attribute to the customer (lets call it customId), which I also want to set programatically, when registering the users, but the problem is, that it only seems to add the custom attribute to the first user, and the others have that field empty.
Here is my code:
namespace PathUserRegistrationCron;
class RegisterUsers
private $storeManager;
private $customerFactory;
private $customerModel;
private $baseUrl;
public function __construct(
MagentoStoreModelStoreManagerInterface $storeManager,
MagentoCustomerModelCustomerFactory $customerFactory,
MagentoCustomerModelCustomer $customerModel)
$this->storeManager = $storeManager;
$this->customerFactory = $customerFactory;
$this->customerModel = $customerModel;
$this->baseUrl = $this->storeManager->getStore()->getBaseUrl();
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->setCustomId($customId);
$customer->save();
public function execute()
$handle = fopen($this->baseUrl . "upload/NewUsers.csv", "r");
if ($handle)
$lineNum = 0;
while (($line = fgets($handle)) !== false)
$lineNum++;
// Ignore first line of csv file
if ($lineNum > 1)
$lineItems = explode(';', $line);
$customId = trim($lineItems[1]);
$email = trim($lineItems[4]);
$password = trim($lineItems[2]);
$name = trim($lineItems[3]);
$websiteId = $this->storeManager->getWebsite()->getId() == 0 ? '1' : $this->storeManager->getWebsite()->getId();
$storeId = $this->storeManager->getStore()->getId() == 0 ? '1' : $this->storeManager->getStore()->getId();
if ($email && $name && $password)
$customerExisting = $this->customerModel->setWebsiteId($storeId)->loadByEmail($email);
$customerExists = $customerExisting->getId() ?? false;
if ($customerExists === false)
$this->register($customId, $email, $password, $name, $websiteId, $storeId);
fclose($handle);
The strange thing is, if I call $customer->getCustomId() right after the $customer->save(), i get back the correct value. So it is saved into the db, but then deleted?
I can also manually add the customId to any user I want, and it works fine.
Any help would be appreciated.
magento2 attributes customer custom-attributes customer-attribute
add a comment |Â
up vote
4
down vote
favorite
up vote
4
down vote
favorite
I have a cron job that runs once a day, that reads a file uploaded to the server, and registers users from that file. The code works fine, but now I added a custom attribute to the customer (lets call it customId), which I also want to set programatically, when registering the users, but the problem is, that it only seems to add the custom attribute to the first user, and the others have that field empty.
Here is my code:
namespace PathUserRegistrationCron;
class RegisterUsers
private $storeManager;
private $customerFactory;
private $customerModel;
private $baseUrl;
public function __construct(
MagentoStoreModelStoreManagerInterface $storeManager,
MagentoCustomerModelCustomerFactory $customerFactory,
MagentoCustomerModelCustomer $customerModel)
$this->storeManager = $storeManager;
$this->customerFactory = $customerFactory;
$this->customerModel = $customerModel;
$this->baseUrl = $this->storeManager->getStore()->getBaseUrl();
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->setCustomId($customId);
$customer->save();
public function execute()
$handle = fopen($this->baseUrl . "upload/NewUsers.csv", "r");
if ($handle)
$lineNum = 0;
while (($line = fgets($handle)) !== false)
$lineNum++;
// Ignore first line of csv file
if ($lineNum > 1)
$lineItems = explode(';', $line);
$customId = trim($lineItems[1]);
$email = trim($lineItems[4]);
$password = trim($lineItems[2]);
$name = trim($lineItems[3]);
$websiteId = $this->storeManager->getWebsite()->getId() == 0 ? '1' : $this->storeManager->getWebsite()->getId();
$storeId = $this->storeManager->getStore()->getId() == 0 ? '1' : $this->storeManager->getStore()->getId();
if ($email && $name && $password)
$customerExisting = $this->customerModel->setWebsiteId($storeId)->loadByEmail($email);
$customerExists = $customerExisting->getId() ?? false;
if ($customerExists === false)
$this->register($customId, $email, $password, $name, $websiteId, $storeId);
fclose($handle);
The strange thing is, if I call $customer->getCustomId() right after the $customer->save(), i get back the correct value. So it is saved into the db, but then deleted?
I can also manually add the customId to any user I want, and it works fine.
Any help would be appreciated.
magento2 attributes customer custom-attributes customer-attribute
I have a cron job that runs once a day, that reads a file uploaded to the server, and registers users from that file. The code works fine, but now I added a custom attribute to the customer (lets call it customId), which I also want to set programatically, when registering the users, but the problem is, that it only seems to add the custom attribute to the first user, and the others have that field empty.
Here is my code:
namespace PathUserRegistrationCron;
class RegisterUsers
private $storeManager;
private $customerFactory;
private $customerModel;
private $baseUrl;
public function __construct(
MagentoStoreModelStoreManagerInterface $storeManager,
MagentoCustomerModelCustomerFactory $customerFactory,
MagentoCustomerModelCustomer $customerModel)
$this->storeManager = $storeManager;
$this->customerFactory = $customerFactory;
$this->customerModel = $customerModel;
$this->baseUrl = $this->storeManager->getStore()->getBaseUrl();
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->setCustomId($customId);
$customer->save();
public function execute()
$handle = fopen($this->baseUrl . "upload/NewUsers.csv", "r");
if ($handle)
$lineNum = 0;
while (($line = fgets($handle)) !== false)
$lineNum++;
// Ignore first line of csv file
if ($lineNum > 1)
$lineItems = explode(';', $line);
$customId = trim($lineItems[1]);
$email = trim($lineItems[4]);
$password = trim($lineItems[2]);
$name = trim($lineItems[3]);
$websiteId = $this->storeManager->getWebsite()->getId() == 0 ? '1' : $this->storeManager->getWebsite()->getId();
$storeId = $this->storeManager->getStore()->getId() == 0 ? '1' : $this->storeManager->getStore()->getId();
if ($email && $name && $password)
$customerExisting = $this->customerModel->setWebsiteId($storeId)->loadByEmail($email);
$customerExists = $customerExisting->getId() ?? false;
if ($customerExists === false)
$this->register($customId, $email, $password, $name, $websiteId, $storeId);
fclose($handle);
The strange thing is, if I call $customer->getCustomId() right after the $customer->save(), i get back the correct value. So it is saved into the db, but then deleted?
I can also manually add the customId to any user I want, and it works fine.
Any help would be appreciated.
magento2 attributes customer custom-attributes customer-attribute
magento2 attributes customer custom-attributes customer-attribute
edited Sep 17 at 11:40
twinkle_systematix
656
656
asked Sep 17 at 6:47
Bawsi
838
838
add a comment |Â
add a comment |Â
2 Answers
2
active
oldest
votes
up vote
4
down vote
accepted
This is because you need to save your customer object before setting the attribute
Change you register function to the below one:
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->save();
$customerData = $customer->getDataModel();
$customerData->setCustomAttribute('custom_id', $customId);
$customer->updateData($customerData);
$customer->save();
I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
â Bawsi
Sep 17 at 8:30
Calling $customer->save(); right after updateData() worked. Thanks!!
â Bawsi
Sep 17 at 8:35
Welcome. You can update my answer as well.
â Sukumar Gorai
Sep 17 at 8:41
add a comment |Â
up vote
2
down vote
Try like this, then check you logs, check also that $customId
is always available and not empty
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->setCustomId($customId); // or $customer->setCustomAttribute('custom_id', $customId);
try
$customer->save();
cach (Exception $e)
$e->getMessage();
The thing is , that customId does get saved, since I can access it right after $customer->save() with $customer->getCustomId(), but then it gets deleted or something, and I cant figure out what happens, However, If I only try and register one user at a time (only one user in csv file), it works. So its only a problem when trying to register multiple users.
â Bawsi
Sep 17 at 8:17
Try to add all the sets in foreach()
â Prince
Sep 17 at 8:21
add a comment |Â
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
4
down vote
accepted
This is because you need to save your customer object before setting the attribute
Change you register function to the below one:
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->save();
$customerData = $customer->getDataModel();
$customerData->setCustomAttribute('custom_id', $customId);
$customer->updateData($customerData);
$customer->save();
I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
â Bawsi
Sep 17 at 8:30
Calling $customer->save(); right after updateData() worked. Thanks!!
â Bawsi
Sep 17 at 8:35
Welcome. You can update my answer as well.
â Sukumar Gorai
Sep 17 at 8:41
add a comment |Â
up vote
4
down vote
accepted
This is because you need to save your customer object before setting the attribute
Change you register function to the below one:
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->save();
$customerData = $customer->getDataModel();
$customerData->setCustomAttribute('custom_id', $customId);
$customer->updateData($customerData);
$customer->save();
I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
â Bawsi
Sep 17 at 8:30
Calling $customer->save(); right after updateData() worked. Thanks!!
â Bawsi
Sep 17 at 8:35
Welcome. You can update my answer as well.
â Sukumar Gorai
Sep 17 at 8:41
add a comment |Â
up vote
4
down vote
accepted
up vote
4
down vote
accepted
This is because you need to save your customer object before setting the attribute
Change you register function to the below one:
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->save();
$customerData = $customer->getDataModel();
$customerData->setCustomAttribute('custom_id', $customId);
$customer->updateData($customerData);
$customer->save();
This is because you need to save your customer object before setting the attribute
Change you register function to the below one:
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->save();
$customerData = $customer->getDataModel();
$customerData->setCustomAttribute('custom_id', $customId);
$customer->updateData($customerData);
$customer->save();
edited Sep 17 at 14:00
zack6849
12212
12212
answered Sep 17 at 7:46
Sukumar Gorai
4,9603424
4,9603424
I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
â Bawsi
Sep 17 at 8:30
Calling $customer->save(); right after updateData() worked. Thanks!!
â Bawsi
Sep 17 at 8:35
Welcome. You can update my answer as well.
â Sukumar Gorai
Sep 17 at 8:41
add a comment |Â
I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
â Bawsi
Sep 17 at 8:30
Calling $customer->save(); right after updateData() worked. Thanks!!
â Bawsi
Sep 17 at 8:35
Welcome. You can update my answer as well.
â Sukumar Gorai
Sep 17 at 8:41
I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
â Bawsi
Sep 17 at 8:30
I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
â Bawsi
Sep 17 at 8:30
Calling $customer->save(); right after updateData() worked. Thanks!!
â Bawsi
Sep 17 at 8:35
Calling $customer->save(); right after updateData() worked. Thanks!!
â Bawsi
Sep 17 at 8:35
Welcome. You can update my answer as well.
â Sukumar Gorai
Sep 17 at 8:41
Welcome. You can update my answer as well.
â Sukumar Gorai
Sep 17 at 8:41
add a comment |Â
up vote
2
down vote
Try like this, then check you logs, check also that $customId
is always available and not empty
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->setCustomId($customId); // or $customer->setCustomAttribute('custom_id', $customId);
try
$customer->save();
cach (Exception $e)
$e->getMessage();
The thing is , that customId does get saved, since I can access it right after $customer->save() with $customer->getCustomId(), but then it gets deleted or something, and I cant figure out what happens, However, If I only try and register one user at a time (only one user in csv file), it works. So its only a problem when trying to register multiple users.
â Bawsi
Sep 17 at 8:17
Try to add all the sets in foreach()
â Prince
Sep 17 at 8:21
add a comment |Â
up vote
2
down vote
Try like this, then check you logs, check also that $customId
is always available and not empty
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->setCustomId($customId); // or $customer->setCustomAttribute('custom_id', $customId);
try
$customer->save();
cach (Exception $e)
$e->getMessage();
The thing is , that customId does get saved, since I can access it right after $customer->save() with $customer->getCustomId(), but then it gets deleted or something, and I cant figure out what happens, However, If I only try and register one user at a time (only one user in csv file), it works. So its only a problem when trying to register multiple users.
â Bawsi
Sep 17 at 8:17
Try to add all the sets in foreach()
â Prince
Sep 17 at 8:21
add a comment |Â
up vote
2
down vote
up vote
2
down vote
Try like this, then check you logs, check also that $customId
is always available and not empty
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->setCustomId($customId); // or $customer->setCustomAttribute('custom_id', $customId);
try
$customer->save();
cach (Exception $e)
$e->getMessage();
Try like this, then check you logs, check also that $customId
is always available and not empty
public function register($customId, $email, $password, $name, $websiteId, $storeId)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setStoreId($storeId);
$customer->setEmail($email);
$customer->setFirstname($name);
$customer->setPassword($password);
$customer->setCustomId($customId); // or $customer->setCustomAttribute('custom_id', $customId);
try
$customer->save();
cach (Exception $e)
$e->getMessage();
edited Sep 17 at 7:54
answered Sep 17 at 7:44
Prince
6,5212934
6,5212934
The thing is , that customId does get saved, since I can access it right after $customer->save() with $customer->getCustomId(), but then it gets deleted or something, and I cant figure out what happens, However, If I only try and register one user at a time (only one user in csv file), it works. So its only a problem when trying to register multiple users.
â Bawsi
Sep 17 at 8:17
Try to add all the sets in foreach()
â Prince
Sep 17 at 8:21
add a comment |Â
The thing is , that customId does get saved, since I can access it right after $customer->save() with $customer->getCustomId(), but then it gets deleted or something, and I cant figure out what happens, However, If I only try and register one user at a time (only one user in csv file), it works. So its only a problem when trying to register multiple users.
â Bawsi
Sep 17 at 8:17
Try to add all the sets in foreach()
â Prince
Sep 17 at 8:21
The thing is , that customId does get saved, since I can access it right after $customer->save() with $customer->getCustomId(), but then it gets deleted or something, and I cant figure out what happens, However, If I only try and register one user at a time (only one user in csv file), it works. So its only a problem when trying to register multiple users.
â Bawsi
Sep 17 at 8:17
The thing is , that customId does get saved, since I can access it right after $customer->save() with $customer->getCustomId(), but then it gets deleted or something, and I cant figure out what happens, However, If I only try and register one user at a time (only one user in csv file), it works. So its only a problem when trying to register multiple users.
â Bawsi
Sep 17 at 8:17
Try to add all the sets in foreach()
â Prince
Sep 17 at 8:21
Try to add all the sets in foreach()
â Prince
Sep 17 at 8:21
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f242466%2fmagento-2-unable-to-set-custom-customer-attributes-programmatically%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password