Magento: как определить, прервал ли клиент процесс оформления заказа - PullRequest
1 голос
/ 09 июля 2010

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

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

Две проблемы с моей идеей:

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

Буду очень признателен, если вы поможете ответить на эти вопросы или даже предложите лучший подход!

Ответы [ 2 ]

2 голосов
/ 09 июля 2010

Я бы использовал немного другой подход к проблеме брошенной корзины.

Каждый раз, когда вы «создаете корзину», добавляя продукт, вы создаете Mage_Sales_Model_Quote, который magento хранит в базе данных.Каждый раз, когда вы выполняете заказ, вы создаете объект Mage_Sales_Model_Order.Объекты Mage_Sales_Model_Order сохраняют ссылку на свои оригинальные идентификаторы котировок.

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

//may start to degrade as orders pile up.  Add date filters to 
//prevent or look into properly joining things in.
$orders = Mage::getModel('sales/order')
->getCollection()
->addAttributeToSelect('*');

var_dump('Order Count', count($orders));

$quote_ids  = $orders->getColumnValues('quote_id');
$quote_ids = array_filter($quote_ids, 'is_numeric');

$carts      = Mage::getModel('sales/quote')
->getCollection();

var_dump('All Cart Count:');
var_dump(count($carts));

$carts      = Mage::getModel('sales/quote')
->getCollection()
->addFieldToFilter('entity_id',array('nin'=>$quote_ids));

var_dump('Filtered Cart Count:');
var_dump(count($carts));

foreach($carts as $cart)
{
    var_dump('abandoned cart', $cart);
}

Что касается других ваших вопросов, они слишком сложны, чтобы попасть в один вопрос переполнения стека.Я бы прочитал в Magento, чтобы почувствовать основную архитектуру, а затем использовал бы демонстрацию Commerce Bug , чтобы выяснить, какой контроллер вам нужен.(оба проекта, упомянутые выше, принадлежат мне, самостоятельная ссылка, покупатель остерегается и т. д.)

0 голосов
/ 13 июля 2010

Поскольку мне нужно знать в режиме реального времени момент, когда посетитель покинул кассу, я использовал переменную сеанса с именем IsUserInCheckout. Это значение равно true, когда выполняется indexAction () извлечения.

Затем я создал наблюдателя событий, который запускался до того, как запрос был отправлен контроллеру. Он проверяет, какой контроллер вызывается. Если запрос не для контроллера извлечения, я смотрю на переменную сеанса, чтобы увидеть, начал ли пользователь извлечение. Как только я запускаю какую-то собственную логику, я изменяю переменную сеанса IsUserInCheckout на false.

Я чувствую, что он достаточно легкий. Он работает при каждой загрузке страницы, но в 98% случаев он читает переменные сеанса, видит false и ничего не делает.

...