Magento 2 में ग्राहक को प्रोग्रामेटिक रूप से कैसे जोड़ें?


13

मुझे Magento 2 में एक प्रोग्राम प्रोग्रामर बनाने की आवश्यकता है, मुझे आस-पास बहुत सारे दस्तावेज नहीं मिले हैं ... मूल रूप से मुझे जो करने की आवश्यकता है वह निम्नलिखित कोड "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();
}

आप एक स्वसंपूर्ण स्क्रिप्ट में ऐसा करना चाहते हैं, या आपके पास एक मॉडल या कुछ है?
मेरियस

@ मार्स, मैं इस मॉड्यूल पर काम कर रहा हूं और मैंने एक कंट्रोलर बनाया है। यह नियंत्रक मुझे सहेजने के लिए कुछ डेटा तैयार करने की आवश्यकता है और विचार ग्राहक मॉडल को कॉल करने और उस जानकारी को सहेजने के लिए है। ऊपर दिए गए कोड को एक नियंत्रक में रखा जा सकता है, जो मैं ऐसा ही करना चाहता हूं, लेकिन Magento 2 के लिए। मैं अभी भी Magento 2 की नई संरचना के साथ थोड़ा भ्रमित हूं और अब यहां फंस गया हूं .. मुझे पता है कि यह वर्ग इंजेक्शन के साथ कुछ करना है और ऑब्जेक्ट इंस्टेंस लेकिन मुझे यकीन नहीं है कि यह कैसे करना है ...
एडुआर्डो

जवाबों:


21

ठीक है, थोड़ी देर बाद मैंने पाया कि मामले में किसी और को इसकी आवश्यकता है .. Magento तात्कालिक वस्तुओं के लिए एक और दृष्टिकोण का उपयोग करता है, Magento 1.x में वस्तुओं को तत्काल करने का पारंपरिक तरीका "Mage :: getModel (..)" का उपयोग कर रहा था, यह Magento 2 में बदल गया है। अब Magento के ऑब्जेक्ट मैनेजर का उपयोग objets को तत्काल करने के लिए करता है, मैं विवरण में दर्ज नहीं करूंगा कि यह कैसे काम करता है .. इसलिए, Magento 2 में ग्राहक बनाने के लिए समान कोड इस तरह दिखेगा:

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

आशा है कि कोड का यह स्निपेट किसी और की मदद करेगा ।।


6
आप बहुत करीब थे। जब भी संभव हो आप सीधे ऑब्जेक्टमैनेजर के उपयोग से बचना चाहिए - यह खराब रूप है। उचित तरीका यह है कि 'फ़ैक्टरी' क्लास प्राप्त करने के लिए निर्भरता इंजेक्शन का उपयोग किया जाता है, और इसका उपयोग एक उदाहरण बनाने के लिए किया जाता है। यदि किसी दिए गए वर्ग के लिए फ़ैक्टरी क्लास मौजूद नहीं है, तो यह स्वतः-जनरेट होगा। मैंने इसका उपयोग करने के लिए आपके कोड को संपादित किया है (कारखाने को निर्माणकर्ता और वर्ग में जोड़ा गया है, और कॉलिंग क्रिएट ()), और PSR-2 कोड मानकों का पालन किया है।
रयान होर

धन्यवाद सुधार @RyanH के लिए। मैंने कारखाने की कक्षाओं का उपयोग करने के बारे में सोचा था, लेकिन यह सुनिश्चित नहीं किया गया था कि मैं ऑब्जेक्टमैनेजर का उपयोग करूं ... मैं भविष्य की परियोजनाओं के लिए PSR-2 कोड मानकों के बारे में अधिक पढ़ूंगा। मैं अब आपके सुधार के साथ कोड का उपयोग कर रहा हूं और सब कुछ पूरी तरह से काम करता है। साभार
एडुआर्डो

@RyanH। किया हुआ ; )
एडुआर्डो

मैं इसे डेटाबेस में देख सकता हूं लेकिन एडमिन पैनल के लिए नहीं। क्या हो रहा है?
अरनी

1
@Arni; मेरा पहला अनुमान है कि आपको reindex की आवश्यकता होगी :)
एलेक्स टिमर

4

यहां डिफ़ॉल्ट समूह और वर्तमान स्टोर के साथ एक नया ग्राहक बनाने का सरल तरीका है।

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

यहाँ $ अनुरोध क्या है?, क्या हम कस्टम विशेषताओं को भी जोड़ सकते हैं?
जाफर पिंजर

कस्टम विशेषताएँ कैसे सेट करें?
जाफर पिंजर

0

यह कोड बाहरी फ़ाइल या कंसोल फ़ाइल 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

उपरोक्त सभी उदाहरण काम करेंगे, लेकिन मानक तरीके हमेशा ठोस वर्गों की तुलना में सेवा अनुबंध का उपयोग होना चाहिए ।

इसलिए, ग्राहक को प्रोग्राम बनाने के लिए नीचे दिए गए तरीकों को प्राथमिकता दी जानी चाहिए।

                /** @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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.