Я работаю над пользовательским модулем, который должен знать, прервал ли пользователь процесс контроля. "Прерывание" просто означает, что они приземлились на indexAction контроля, но не завершали процесс. Абсолютно необходимо, чтобы я знал, происходит ли это.
Я думал, возможно, устанавливает переменную сеанса, что они ввели контроль. На каждой загрузке страницы выполните блок кода, который проверяет эту переменную. Если true
, это проверит, какой контроллер используется. Если это не будет контроллер контроля, то я буду знать, что они уехали.
Две проблемы с моей идеей:
Я был бы очень признателен, если Вы могли бы помочь ответить на те вопросы или даже предложить лучший подход!
Поскольку мне нужно знать в реальном времени, когда посетитель покинул кассу, я использовал переменную сессии под названием IsUserInCheckout
. Она устанавливается в true
, когда выполняется indexAction() кассы.
Затем я создал наблюдатель событий, который запускается перед отправкой запроса контроллеру. Он проверяет, какой контроллер вызывается. Если запрос не относится к контроллеру checkout, я смотрю на переменную сессии, чтобы узнать, начал ли пользователь checkout. Как только я запускаю некоторую пользовательскую логику, я изменяю переменную сессии IsUserInCheckout
на false
.
Мне кажется, что он достаточно легкий. Он действительно запускается при каждой загрузке страницы, но 98% времени он просто читает переменные сессии, видит false
и ничего не делает.
Я бы применил несколько иной подход к проблеме брошенных корзин.
Каждый раз, когда вы "создаете корзину", добавляя товар, вы создаете объект 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);
}
Что касается других ваших вопросов, то они слишком сложны, чтобы уместить их в один вопрос stack overflow. Я бы почитал о Magento, чтобы получить представление о базовой архитектуре, а затем использовал живую демонстрацию Commerce Bug, чтобы понять, какой контроллер вам нужен. (оба проекта, ссылки на которые приведены выше, являются моими, самоссылка, покупатель остерегается и т.д.)
.