Wie füge ich einen Kunden programmatisch in Magento 2 hinzu?

13

Ich muss einen Kunden programmgesteuert in Magento 2 erstellen. Ich habe nicht viel Dokumentation gefunden. Im Grunde muss ich den folgenden Code in "Magento 2" übersetzen:

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

$customer = Mage::getModel("customer/customer");
$customer   ->setWebsiteId($websiteId)
            ->setStore($store)
            ->setFirstname('John')
            ->setLastname('Doe')
            ->setEmail('[email protected]')
            ->setPassword('somepassword');

try{
    $customer->save();
}
Eduardo
quelle
Sie möchten dies in einem eigenständigen Skript tun, oder Sie haben ein Modell oder etwas?
Marius
@Marius, ich habe an diesem Modul gearbeitet und einen Controller erstellt. Für diesen Controller muss ich einige Daten vorbereiten, die gespeichert werden sollen, und die Idee ist, das Kundenmodell aufzurufen und diese Informationen zu speichern. Der obige Code kann in einem Controller abgelegt werden, den ich auch gerne für Magento 2 machen würde. Ich bin immer noch ein bisschen verwirrt mit der neuen Struktur von Magento 2 und stecke jetzt hier fest. Ich weiß, es hat etwas mit Klasseninjektionen zu tun und Objekt Instanzen, aber ich bin nicht sicher, wie es geht ...
Eduardo

Antworten:

20

Okay, nach einer Weile fand ich eine Lösung für den Fall, dass jemand anderes sie benötigt. Magento verwendet einen anderen Ansatz, um Objekte zu instanziieren, der traditionelle Weg, Objekte in Magento 1.x zu instanziieren, war "Mage :: getModel (..)" haben sich in Magento 2 geändert. Jetzt verwendet Magento einen Objektmanager, um Objekte zu instanziieren. Ich werde keine Details darüber eingeben, wie es funktioniert. Daher würde der entsprechende Code zum Erstellen von Kunden in Magento 2 folgendermaßen aussehen:

<?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 protected]"); 
        $customer->setFirstname("First Name");
        $customer->setLastname("Last name");
        $customer->setPassword("password");

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

Hoffe, dieses Codefragment hilft jemand anderem.

Eduardo
quelle
6
Sie waren sehr nah. Verwenden Sie objectManager möglichst nicht direkt - es ist eine schlechte Form. Die richtige Methode hierfür ist die Verwendung der Abhängigkeitsinjektion, um die 'Factory'-Klasse abzurufen und damit eine Instanz zu erstellen. Wenn für eine bestimmte Klasse keine Factory-Klasse vorhanden ist, wird sie automatisch generiert. Ich habe Ihren Code bearbeitet, um dies zu verwenden (fügte die Factory dem Konstruktor und der Klasse hinzu und rief create () auf) und befolge die PSR-2-Codestandards.
Ryan Hoerr
Danke für die Korrektur @RyanH. Ich habe über die Verwendung von Factory-Klassen nachgedacht, war mir aber nicht sicher, wie ich es anstellen sollte. Daher habe ich objectManager verwendet. Ich werde mehr über PSR-2-Codestandards für zukünftige Projekte lesen. Ich verwende den Code jetzt mit Ihren Korrekturen und alles funktioniert perfekt. Vielen Dank
Eduardo
@ RyanH. Erledigt ; )
Eduardo
Ich kann es in Datenbanken aber nicht für Admin-Panel sehen. Was passiert?
Arni
1
@ Arni; Meine erste Vermutung ist, dass Sie neu indizieren müssten :)
Alex Timmer
4

Hier ist eine einfache Möglichkeit, einen neuen Kunden mit Standardgruppe und aktuellem Geschäft zu erstellen.

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' => '[email protected]',
        ];

        $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
        }
    }
}
Nicholas Miller
quelle
Was ist $ request hier? Können wir auch benutzerdefinierte Attribute hinzufügen?
Jafar Pinjar
Wie werden benutzerdefinierte Attribute festgelegt?
Jafar Pinjar
0

Dieser Code wird in der externen Datei oder Konsolendatei CLI Magento ausgeführt

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("[email protected]");
        $customer->setFirstname("First Name");
        $customer->setLastname("Last name");
        $customer->setPassword("password");
        $customer->save();
    }
}
Israel Guido
quelle
0

Alle obigen Beispiele werden funktionieren, aber die Standardmethode sollte immer die Verwendung von Serviceverträgen als die konkreten Klassen sein.

Daher sollten die folgenden Möglichkeiten für die programmgesteuerte Erstellung des Kunden bevorzugt werden.

                /** @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);
Milind Singh
quelle