Cannot set custom customer attributes programatically

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 1 hour ago









      mrfizh

      1801220




      1801220










      asked 2 hours ago









      Bawsi

      648




      648




















          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);
          $customerResource = $this->customerFactory->create();
          $customerResource->saveAttribute($customer);






          share|improve this answer




















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










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










          • Welcome. You can update my answer as well.
            – Sukumar Gorai
            13 mins ago

















          up vote
          1
          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
            37 mins ago










          • Try to add all the sets in foreach()
            – Prince
            33 mins 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%2fcannot-set-custom-customer-attributes-programatically%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);
          $customerResource = $this->customerFactory->create();
          $customerResource->saveAttribute($customer);






          share|improve this answer




















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










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










          • Welcome. You can update my answer as well.
            – Sukumar Gorai
            13 mins 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);
          $customerResource = $this->customerFactory->create();
          $customerResource->saveAttribute($customer);






          share|improve this answer




















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










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










          • Welcome. You can update my answer as well.
            – Sukumar Gorai
            13 mins 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);
          $customerResource = $this->customerFactory->create();
          $customerResource->saveAttribute($customer);






          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);
          $customerResource = $this->customerFactory->create();
          $customerResource->saveAttribute($customer);







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 1 hour ago









          Sukumar Gorai

          4,5192424




          4,5192424











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










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










          • Welcome. You can update my answer as well.
            – Sukumar Gorai
            13 mins ago
















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










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










          • Welcome. You can update my answer as well.
            – Sukumar Gorai
            13 mins ago















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




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












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




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












          Welcome. You can update my answer as well.
          – Sukumar Gorai
          13 mins ago




          Welcome. You can update my answer as well.
          – Sukumar Gorai
          13 mins ago












          up vote
          1
          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
            37 mins ago










          • Try to add all the sets in foreach()
            – Prince
            33 mins ago














          up vote
          1
          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
            37 mins ago










          • Try to add all the sets in foreach()
            – Prince
            33 mins ago












          up vote
          1
          down vote










          up vote
          1
          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 1 hour ago

























          answered 1 hour ago









          Prince

          6,3952934




          6,3952934











          • 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
            37 mins ago










          • Try to add all the sets in foreach()
            – Prince
            33 mins 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
            37 mins ago










          • Try to add all the sets in foreach()
            – Prince
            33 mins 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
          37 mins 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
          37 mins ago












          Try to add all the sets in foreach()
          – Prince
          33 mins ago




          Try to add all the sets in foreach()
          – Prince
          33 mins 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%2fcannot-set-custom-customer-attributes-programatically%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