Magento 2'de programlı bir müşteri nasıl eklenir?


13

Ben programlı Magento 2 bir müşteri oluşturmak gerekir, çevresinde çok fazla belge bulamadım ... temelde ne yapmam gereken aşağıdaki kodu "Magento 2" çevirmek:

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

bunu bağımsız bir komut dosyasında mı yapmak istiyorsunuz yoksa bir modeliniz mi var?
Marius

@Marius, bu modül üzerinde çalışıyorum ve bir kontrolör oluşturdum. Bu denetleyici Kaydedilecek bazı veriler hazırlamam gerekiyor ve fikir müşteri modelini aramak ve bu bilgileri kaydetmek. Yukarıdaki kod aynı şeyi yapmak istiyorum ama Magento 2 için bir denetleyici yerleştirilebilir. Ben hala Magento 2 yeni yapısı ile biraz karışık ve şimdi burada sıkışmış .. Biliyorum Sınıf enjeksiyonları ile ilgili bir şey var ve nesne örnekleri ama nasıl yapılacağından emin değilim ...
Eduardo

Yanıtlar:


21

Tamam, bir süre sonra bir başkasının ihtiyacı olması durumunda bir çözüm buldum .. Magento nesneleri başlatmak için başka bir yaklaşım kullanıyor, Magento 1.x'te nesneleri başlatmak için geleneksel yol "Mage :: getModel (..)" Şimdi Magento, nesnelleri örneklemek için bir nesne yöneticisi kullanıyor, nasıl çalıştığı hakkında ayrıntılı bilgi girmeyeceğim .. yani, Magento 2'de müşteriler oluşturmak için eşdeğer kod şöyle görünecektir:

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

Bu kod snippet'inin başkasına yardım etmesini umuyoruz ..


6
Çok yakındınız. ObjectManager'ı mümkün olduğunca doğrudan kullanmaktan kaçınmalısınız - bu kötü bir formdur. Bunu yapmanın uygun yolu, 'fabrika' sınıfını almak için bağımlılık enjeksiyonunu kullanmak ve bunu bir örnek oluşturmak için kullanmaktır. Belirli bir sınıf için fabrika sınıfı yoksa, otomatik olarak oluşturulur. Bunu kullanmak için kodunuzu düzenledim (fabrikayı kurucuya ve sınıfa ekledim ve create () çağrısı) ve PSR-2 kod standartlarını takip ettim.
Ryan Hoerr

@RyanH düzeltmesi için teşekkürler. Fabrika sınıflarını kullanmayı düşündüm ama nasıl yapılacağından emin değildim, bu yüzden objectManager'ı kullandım ... Gelecek projeler için PSR-2 kod standartları hakkında daha fazla bilgi edeceğim. Şimdi düzeltmelerinizle kodu kullanıyorum ve her şey mükemmel çalışıyor. Teşekkürler
Eduardo

@RyanH. Tamamlandı; )
Eduardo

Bunu veritabanlarında görebiliyorum ancak Yönetici paneli için göremiyorum. Ne oluyor?
Arni

1
@Arni; benim ilk tahminim reindex gerekir ki :)
Alex Timmer

4

Varsayılan grup ve mevcut mağaza ile yeni bir müşteri oluşturmanın basit yolu.

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

Burada $ istek nedir ?, özel özellikler de ekleyebilir miyiz?
jafar pinjar

Özel özellikler nasıl ayarlanır?
jafar pinjar

1

Yukarıdaki tüm örnekler işe yarayacaktır, ancak standart yol her zaman somut sınıflardan daha çok hizmet sözleşmelerinin kullanılması olmalıdır .

Bu nedenle, programlı olarak müşteri oluşturmak için aşağıdaki yollar tercih edilmelidir.


use Magento\Customer\Api\CustomerRepositoryInterface;
use Magento\Customer\Api\Data\CustomerInterfaceFactory;
use Magento\Store\Model\StoreManagerInterface;

class CustomerCreate
{
    public $store;

    public $customerFactory;

    public $customerRepository;

    public function __construct(
        StoreManagerInterface $store,
        CustomerInterfaceFactory $customerFactory,
        CustomerRepositoryInterface $customerRepository
    ) {
        $this->store = $store;
        $this->customerFactory = $customerFactory;
        $this->customerRepository = $customerRepository;
    }


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

           /** @var \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository*/
           $customer = $customerRepository->save($customer);
           // Note: The save returns the saved customer object, else throws an exception.
       } catch (\Exception $e) {
          // Add log
       }
    }

}

Magento \ Customer \ Model \ ResourceModel \ CustomerRepository \ Interceptor :: save () işlevine iletilen argüman 1, Magento \ Customer \ Api \ Data \ CustomerInterface örneği, bunu aldığımda Magento \ Customer \ Model \ Customer \ Interceptor örneği olmalıdır kodu çalıştırma hatası
BrandenB171

Merhaba, @ BrandenB171 Kodun tamamını güncelledim. Bunun nedeni, müşteri API'sından ziyade müşteri modelinin kullanılması olabilir. Bu sizin için işe yararsa bir oy verin.
Milind Singh

1
Öyleydi. Ben CustomerInterfaceFactory, daha ziyade CustomerFactory kullanmıyordum ve bu kaynak modeli döndürüyordu
BrandenB171

0

Bu kod harici dosya veya konsol dosyasında çalışır 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();
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.