Comment ajouter un client par programmation dans Magento 2?


13

J'ai besoin de créer un client par programmation dans Magento 2, je n'ai pas trouvé beaucoup de documentation autour ... essentiellement ce que je dois faire est de traduire le code suivant en "Magento 2":

$websiteId = Mage::app()->getWebsite()->getId();
$store = Mage::app()->getStore();

$customer = Mage::getModel("customer/customer");
$customer   ->setWebsiteId($websiteId)
            ->setStore($store)
            ->setFirstname('John')
            ->setLastname('Doe')
            ->setEmail('jd1@ex.com')
            ->setPassword('somepassword');

try{
    $customer->save();
}

vous voulez le faire dans un script autonome, ou vous avez un modèle ou quelque chose?
Marius

@Marius, je travaille sur ce module et j'ai créé un contrôleur. C'est ce contrôleur dont j'ai besoin pour préparer certaines données à sauvegarder et l'idée est d'appeler le modèle client et de sauvegarder ces informations. Le code ci-dessus peut être placé dans un contrôleur, je voudrais faire la même chose mais pour Magento 2. Je suis toujours un peu confus avec la nouvelle structure de Magento 2 et je suis coincé ici maintenant .. Je sais que cela a quelque chose à voir avec les injections de classe et les objets, mais je ne sais pas comment le faire ...
Eduardo

Réponses:


20

D'accord, après un certain temps, j'ai trouvé une solution au cas où quelqu'un d'autre en aurait besoin. Magento utilise une autre approche pour instancier des objets, la manière traditionnelle d'instancier des objets dans Magento 1.x utilisait "Mage :: getModel (..)", ceci ont changé dans Magento 2. Maintenant, Magento utilise un gestionnaire d'objets pour instancier des objets, je ne vais pas entrer dans les détails sur la façon dont cela fonctionne .. donc, le code équivalent pour créer des clients dans Magento 2 ressemblerait à ceci:

<?php

namespace ModuleNamespace\Module_Name\Controller\Index;

class Index extends \Magento\Framework\App\Action\Action
{
    /**
     * @var \Magento\Store\Model\StoreManagerInterface
     */
    protected $storeManager;

    /**
     * @var \Magento\Customer\Model\CustomerFactory
     */
    protected $customerFactory;

    /**
     * @param \Magento\Framework\App\Action\Context      $context
     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
     * @param \Magento\Customer\Model\CustomerFactory    $customerFactory
     */
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Customer\Model\CustomerFactory $customerFactory
    ) {
        $this->storeManager     = $storeManager;
        $this->customerFactory  = $customerFactory;

        parent::__construct($context);
    }

    public function execute()
    {
        // Get Website ID
        $websiteId  = $this->storeManager->getWebsite()->getWebsiteId();

        // Instantiate object (this is the most important part)
        $customer   = $this->customerFactory->create();
        $customer->setWebsiteId($websiteId);

        // Preparing data for new customer
        $customer->setEmail("email@domain.com"); 
        $customer->setFirstname("First Name");
        $customer->setLastname("Last name");
        $customer->setPassword("password");

        // Save data
        $customer->save();
        $customer->sendNewAccountEmail();
    }
}

J'espère que cet extrait de code aidera quelqu'un d'autre ..


6
Tu étais très proche. Vous devez éviter d'utiliser objectManager directement dans la mesure du possible - c'est une mauvaise forme. La bonne façon de le faire est d'utiliser l'injection de dépendances pour obtenir la classe 'factory' et de l'utiliser pour créer une instance. Si une classe d'usine n'existe pas pour une classe donnée, elle sera générée automatiquement. J'ai édité votre code pour l'utiliser (ajout de l'usine au constructeur et à la classe, et appel à create ()), et je respecte les normes de code PSR-2.
Ryan Hoerr

Merci pour la correction @RyanH. J'ai pensé à utiliser des classes d'usine, mais je ne savais pas trop comment, alors j'ai utilisé objectManager ... Je vais en savoir plus sur les normes de code PSR-2 pour de futurs projets. J'utilise le code avec vos corrections maintenant et tout fonctionne parfaitement. Merci
Eduardo

@RyanH. Terminé ; )
Eduardo

Je peux le voir dans les bases de données mais pas pour le panneau d'administration. Que se passe-t-il?
Arni

1
@Arni; ma première supposition est que vous auriez besoin de réindexer :)
Alex Timmer

4

Voici un moyen simple de créer un nouveau client avec le groupe par défaut et le magasin actuel.

use Magento\Framework\App\RequestFactory;
use Magento\Customer\Model\CustomerExtractor;
use Magento\Customer\Api\AccountManagementInterface;

class CreateCustomer extends \Magento\Framework\App\Action\Action
{
    /**
     * @var RequestFactory
     */
    protected $requestFactory;

    /**
     * @var CustomerExtractor
     */
    protected $customerExtractor;

    /**
     * @var AccountManagementInterface
     */
    protected $customerAccountManagement;

    /**
     * @param \Magento\Framework\App\Action\Context $context
     * @param RequestFactory $requestFactory
     * @param CustomerExtractor $customerExtractor
     * @param AccountManagementInterface $customerAccountManagement
     */
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        RequestFactory $requestFactory,
        CustomerExtractor $customerExtractor,
        AccountManagementInterface $customerAccountManagement
    ) {
        $this->requestFactory = $requestFactory;
        $this->customerExtractor = $customerExtractor;
        $this->customerAccountManagement = $customerAccountManagement;
        parent::__construct($context);
    }

    /**
     * Retrieve sources
     *
     * @return array
     */
    public function execute()
    {
        $customerData = [
            'firstname' => 'First Name',
            'lastname' => 'Last Name',
            'email' => 'customer@email.com',
        ];

        $password = 'MyPass123'; //set null to auto-generate

        $request = $this->requestFactory->create();
        $request->setParams($customerData);

        try {
            $customer = $this->customerExtractor->extract('customer_account_create', $request);
            $customer = $this->customerAccountManagement->createAccount($customer, $password);
        } catch (\Exception $e) {
            //exception logic
        }
    }
}

Qu'est-ce que $ request ici?, Pouvons-nous également ajouter des attributs personnalisés?
jafar pinjar

Comment définir des attributs personnalisés?
jafar pinjar

0

Ce code s'exécute dans un fichier externe ou un fichier de console CLI Magento

namespace Company\Module\Console;

use Braintree\Exception;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Magento\Framework\App\Bootstrap;


class ImportProducts extends Command
{

    public function magentoStart()
    {
        $startMagento = $this->bootstrap();
        $state = $startMagento['objectManager']->get('Magento\Framework\App\State');
        $state->setAreaCode('frontend');
        return $startMagento['objectManager'];
    }

    protected function bootstrap()
    {
        require '/var/www/html/app/bootstrap.php';
        $bootstrap = Bootstrap::create(BP, $_SERVER);
        $objectManager = $bootstrap->getObjectManager();
        return array('bootstrap' => $bootstrap, 'objectManager' => $objectManager);
    }

    protected function createCustomers($item)
    {
        $objectManager      = $this->magentoStart();
        $storeManager       = $objectManager->create('Magento\Store\Model\StoreManagerInterface');
        $customerFactory    = $objectManager->create('Magento\Customer\Model\CustomerFactory');

        $websiteId  = $storeManager->getWebsite()->getWebsiteId();
        $customer   = $customerFactory->create();
        $customer->setWebsiteId($websiteId);
        $customer->setEmail("eu@mailinator.com");
        $customer->setFirstname("First Name");
        $customer->setLastname("Last name");
        $customer->setPassword("password");
        $customer->save();
    }
}

0

Tous les exemples ci-dessus fonctionneront, mais la méthode standard devrait toujours être l' utilisation de contrats de service que les classes concrètes.

Par conséquent, les méthodes ci-dessous doivent être privilégiées pour créer le client par programmation.

                /** @var \Magento\Customer\Api\Data\CustomerInterface $customer */
                $customer = $this->customerFactory->create();
                $customer->setStoreId($store->getStoreId());
                $customer->setWebsiteId($store->getWebsiteId());
                $customer->setEmail($email);
                $customer->setFirstname($firstName);
                $customer->setLastname($lastName);

                /** @var \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository*/
                $customerRepository->save($customer);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.