Наблюдатель за оставлением корзины

8

Мне нужна помощь!!!

Я создаю модуль, который интегрируется с другой платформой через API. Я уже получил Наблюдатель или Событие для регистрации клиента ( customer_register_success ), покупка завершена ( checkout_onepage_controller_success_action ).

Мне нужна помощь в том, как я могу получить Обозревателя на оставленные корзины? Или как лучше всего получить эту информацию и отправить ее через API.

Knaimero
источник
2
каково ваше определение брошенных телег?
Филипп Сандер
Когда покупатель добавил товар в машину и не совершил покупку
Knaimero
3
Не совершали покупку за 2 минуты, 10 минут, час или день? В любом случае, какое бы время вы ни выбрали для своего определения, вы можете наблюдать событие, которое происходит, а не то, что не происходит. На мой взгляд, для вашего сценария лучше всего использовать cronjob, который проверяет активные кавычки с последним взаимодействием старше x минут / часов / дней.
HelgeB
Спасибо. Magento, когда вы совершаете покупку и закрываете электронную торговлю, автоматически создает запись, которую вы можете увидеть в админке -> отчеты -> заброшенные корзины. Мой вопрос существует, есть ли способ получить эту информацию?
Knaimero
Нет такого события, чтобы получить его, вы можете получить коллекцию цитат, которая не заказана между определенным временем
Ketan Borada

Ответы:

3
  • Нет такого события, чтобы получить заброшенные тележки, вы должны создать его на заказ.
  • У меня есть идея, чтобы преодолеть это, вы должны создать cron, который будет запускаться каждый конкретный раз и собирать все цитаты, которые не упорядочены, и между временем, которое вы установили (разница между временем создания и обновления цитаты). Вы должны просто управлять updatedAtFromиupdatedAtTo
  • Делая это, вы будете собирать все данные о кавычках, и в этой коллекции вы можете отправлять событие и передавать все данные о кавычках и данные о клиентах в это событие в рамках одного события или работать со всеми кавычками и передавать эти данные в API от наблюдателя.

Я создал сценарий, который вы можете применить в своей функции блокировки. Я использую этот рабочий сценарий для отправки элемента корзины по почте моему клиенту после того, как он останется без заказа.

<?php 
ob_start();
use Magento\Framework\App\Bootstrap;
include('app/bootstrap.php');
$bootstrap = Bootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
ini_set('memory_limit', '1024M');
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$resource = $objectManager->create('Magento\Framework\App\ResourceConnection');
$updatedAtFrom = '2019-06-19 19:00:00'; //Add current time
$updatedAtTo   = '2019-06-19 20:30:00';  // $updatedAtFrom  + 90 minutes ,add 90 minutes in current time to abondened cart

        $connection = $resource->getConnection();


        $select = $connection->select()
            ->from(
                ['q' => $resource->getTableName('quote')],
                [
                    'store_id'    => 'q.store_id',
                    'quote_id'    => 'q.entity_id',
                    'customer_id' => 'q.customer_id',
                    'updated_at'  => 'q.updated_at',
                    'created_at'  => 'q.created_at',
                ]
            )
            ->joinLeft(
                ['qa' => $resource->getTableName('quote_address')],
                'q.entity_id = qa.quote_id AND qa.address_type = "billing"',
                [
                    'customer_email'     => new \Zend_Db_Expr('IFNULL(q.customer_email, qa.email)'),
                    'customer_firstname' => new \Zend_Db_Expr('IFNULL(q.customer_firstname, qa.firstname)'),
                    'customer_lastname'  => new \Zend_Db_Expr('IFNULL(q.customer_lastname, qa.lastname)'),
                ]
            )
            ->joinInner(
                ['qi' => $resource->getTableName('quote_item')],
                'q.entity_id = qi.quote_id',
                [
                    'i_created_at' => new \Zend_Db_Expr('MAX(qi.created_at)'),
                ]
            )
            ->joinLeft(array('order' => $resource->getTableName('sales_order')),
                'order.quote_id = q.entity_id',
                array()
            )
            ->where('order.entity_id IS NULL')
            ->where('q.is_active = 1')
            ->where('q.items_count > 0')
            ->where('q.customer_email IS NOT NULL OR qa.email IS NOT NULL')
            ->where('qi.parent_item_id IS NULL')
            ->group('q.entity_id')
            ->having(
                '(q.created_at > ? OR MAX(qi.created_at) > ?)',
                $updatedAtFrom
            )
            ->having(
                '(q.created_at < ? OR MAX(qi.created_at) < ?)',
                $updatedAtTo
            )
            ->order('q.updated_at');

        $quotes = $connection->fetchAll($select);


        foreach ($quotes as $quote) {

            $params = [

                'store_id'       => $quote['store_id'],
                'quote_id'              => $quote['quote_id'],
                'customer_id'           => $quote['customer_id'],
                'customer_email' => $quote['customer_email'],
                'customer_tname'  => $quote['customer_firstname'] . ' ' . $quote['customer_lastname'],
                'created_at'     => max($quote['created_at'], $quote['i_created_at']),
            ];

            echo $quote['quote_id'];

            /*$this->eventdispatch->register(
                'quote_abandoned',
                [$params['quote_id']],
                $params
            );*/ 
            // Dispatch Event here and writelogic in that event which you want
        }

?>

Результатом запроса вышеприведенного скрипта является:

SELECT `q`.`store_id`, `q`.`entity_id` AS `quote_id`, `q`.`customer_id`, `q`.`updated_at`, `q`.`created_at`, IFNULL(q.customer_email, qa.email) AS `customer_email`, IFNULL(q.customer_firstname, qa.firstname) AS `customer_firstname`, IFNULL(q.customer_lastname, qa.lastname) AS `customer_lastname`, MAX(qi.created_at) AS `i_created_at` FROM `quote` AS `q` LEFT JOIN `quote_address` AS `qa` ON q.entity_id = qa.quote_id AND qa.address_type = "billing" INNER JOIN `quote_item` AS `qi` ON q.entity_id = qi.quote_id LEFT JOIN `sales_order` AS `order` ON order.quote_id = q.entity_id WHERE (order.entity_id IS NULL) AND (q.is_active = 1) AND (q.items_count > 0) AND (q.customer_email IS NOT NULL OR qa.email IS NOT NULL) AND (qi.parent_item_id IS NULL) GROUP BY `q`.`entity_id` HAVING ((q.created_at > '2019-06-19 19:00:00' OR MAX(qi.created_at) > '2019-06-19 19:00:00')) AND ((q.created_at < '2019-06-19 20:30:00' OR MAX(qi.created_at) < '2019-06-19 20:30:00')) ORDER BY `q`.`updated_at` ASC 
Кетан Борада
источник