Come aggiungere un cliente a livello di codice in Magento 2?


13

Devo creare un cliente a livello di codice in Magento 2, non ho trovato molta documentazione in giro ... fondamentalmente quello che devo fare è tradurre il seguente codice in "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();
}

vuoi farlo in uno script autonomo o hai un modello o qualcosa del genere?
Marius

@Marius, ho lavorato su questo modulo e ho creato un controller. In questo controller ho bisogno di preparare alcuni dati da salvare e l'idea è quella di chiamare il modello del cliente e salvare tali informazioni. Il codice sopra può essere inserito in un controller. Vorrei fare lo stesso, ma per Magento 2. Sono ancora un po 'confuso con la nuova struttura di Magento 2 e bloccato qui ora. So che ha qualcosa a che fare con le iniezioni di classe e istanze di oggetti ma non sono sicuro di come farlo ...
Eduardo,

Risposte:


20

Ok, dopo un po 'ho trovato una soluzione nel caso in cui qualcun altro ne avesse bisogno. Magento usa un altro approccio per istanziare oggetti, il modo tradizionale per istanziare oggetti in Magento 1.x stava usando "Mage :: getModel (..)", questo sono cambiati in Magento 2. Ora Magento usa un gestore oggetti per istanziare oggetti, non inserirò i dettagli su come funziona .. quindi, il codice equivalente per creare clienti in Magento 2 sarebbe simile a questo:

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

Spero che questo frammento di codice aiuti qualcun altro ..


6
Eri molto vicino. Dovresti evitare di usare direttamente ObjectManager ogni volta che è possibile - è una cattiva forma. Il modo corretto per farlo è usare l'iniezione di dipendenza per ottenere la classe "factory" e usarla per creare un'istanza. Se non esiste una classe factory per una determinata classe, verrà generata automaticamente. Ho modificato il tuo codice per usarlo (ho aggiunto la factory al costruttore e alla classe e ho chiamato create ()), e seguo gli standard del codice PSR-2.
Ryan Hoerr,

Grazie per la correzione @RyanH. Ho pensato di utilizzare le classi di fabbrica ma non ero sicuro di come, quindi ho usato objectManager ... Leggerò di più sugli standard di codice PSR-2 per progetti futuri. Sto usando il codice con le tue correzioni ora e tutto funziona perfettamente. Grazie
Eduardo,

@RyanH. Fatto ; )
Eduardo,

Posso vederlo nei database ma non per il pannello di amministrazione. Cosa sta succedendo?
Arni,

1
@Arni; la mia prima ipotesi è che dovresti reindicizzare :)
Alex Timmer,

4

Ecco un modo semplice per creare un nuovo cliente con gruppo predefinito e negozio corrente.

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
        }
    }
}

Che cos'è $ request qui ?, possiamo aggiungere anche attributi personalizzati?
jafar pinjar,

Come impostare attributi personalizzati?
jafar pinjar,

0

Questo codice viene eseguito in CLI Magento per file esterno o console

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

Tutti gli esempi sopra funzioneranno, ma il modo standard dovrebbe essere sempre l' uso di contratti di servizio rispetto alle classi concrete.

Pertanto, i modi seguenti dovrebbero essere preferiti per la creazione programmatica del cliente.

                /** @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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.