Magento 2 : Unable to set custom customer attributes programmatically

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;







up vote
2
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.










share|improve this question





























    up vote
    2
    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.










    share|improve this question

























      up vote
      2
      down vote

      favorite









      up vote
      2
      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.










      share|improve this question















      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






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 16 mins ago









      twinkle_systematix

      554




      554










      asked 5 hours ago









      Bawsi

      668




      668




















          2 Answers
          2






          active

          oldest

          votes

















          up vote
          3
          down vote



          accepted










          Change you register function with 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();






          share|improve this answer






















          • I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
            – Bawsi
            3 hours ago










          • Calling $customer->save(); right after updateData() worked. Thanks!!
            – Bawsi
            3 hours ago










          • Welcome. You can update my answer as well.
            – Sukumar Gorai
            3 hours ago

















          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();







          share|improve this answer






















          • 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
            3 hours ago










          • Try to add all the sets in foreach()
            – Prince
            3 hours ago










          Your Answer







          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "479"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          convertImagesToLinks: false,
          noModals: false,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













           

          draft saved


          draft discarded


















          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






























          2 Answers
          2






          active

          oldest

          votes








          2 Answers
          2






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          3
          down vote



          accepted










          Change you register function with 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();






          share|improve this answer






















          • I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
            – Bawsi
            3 hours ago










          • Calling $customer->save(); right after updateData() worked. Thanks!!
            – Bawsi
            3 hours ago










          • Welcome. You can update my answer as well.
            – Sukumar Gorai
            3 hours ago














          up vote
          3
          down vote



          accepted










          Change you register function with 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();






          share|improve this answer






















          • I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
            – Bawsi
            3 hours ago










          • Calling $customer->save(); right after updateData() worked. Thanks!!
            – Bawsi
            3 hours ago










          • Welcome. You can update my answer as well.
            – Sukumar Gorai
            3 hours ago












          up vote
          3
          down vote



          accepted







          up vote
          3
          down vote



          accepted






          Change you register function with 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();






          share|improve this answer














          Change you register function with 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();







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 1 hour ago









          Bawsi

          668




          668










          answered 4 hours ago









          Sukumar Gorai

          4,5272424




          4,5272424











          • I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
            – Bawsi
            3 hours ago










          • Calling $customer->save(); right after updateData() worked. Thanks!!
            – Bawsi
            3 hours ago










          • Welcome. You can update my answer as well.
            – Sukumar Gorai
            3 hours ago
















          • I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
            – Bawsi
            3 hours ago










          • Calling $customer->save(); right after updateData() worked. Thanks!!
            – Bawsi
            3 hours ago










          • Welcome. You can update my answer as well.
            – Sukumar Gorai
            3 hours ago















          I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
          – Bawsi
          3 hours ago




          I get an exception: Invalid method MagentoCustomerModelCustomerInterceptor::saveAttributeInvalid method %1::%2Invalid method %1::%2theme
          – Bawsi
          3 hours ago












          Calling $customer->save(); right after updateData() worked. Thanks!!
          – Bawsi
          3 hours ago




          Calling $customer->save(); right after updateData() worked. Thanks!!
          – Bawsi
          3 hours ago












          Welcome. You can update my answer as well.
          – Sukumar Gorai
          3 hours ago




          Welcome. You can update my answer as well.
          – Sukumar Gorai
          3 hours ago












          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();







          share|improve this answer






















          • 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
            3 hours ago










          • Try to add all the sets in foreach()
            – Prince
            3 hours ago














          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();







          share|improve this answer






















          • 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
            3 hours ago










          • Try to add all the sets in foreach()
            – Prince
            3 hours ago












          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();







          share|improve this answer














          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();








          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 4 hours ago

























          answered 4 hours ago









          Prince

          6,4612934




          6,4612934











          • 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
            3 hours ago










          • Try to add all the sets in foreach()
            – Prince
            3 hours ago
















          • 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
            3 hours ago










          • Try to add all the sets in foreach()
            – Prince
            3 hours ago















          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
          3 hours ago




          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
          3 hours ago












          Try to add all the sets in foreach()
          – Prince
          3 hours ago




          Try to add all the sets in foreach()
          – Prince
          3 hours ago

















           

          draft saved


          draft discarded















































           


          draft saved


          draft discarded














          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













































































          Comments

          Popular posts from this blog

          What does second last employer means? [closed]

          List of Gilmore Girls characters

          Confectionery