Как создать сеанс Magento вне Magento? - PullRequest
3 голосов
/ 29 января 2012

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

require 'app/Mage.php';
$mageRunCode = isset ( $_SERVER ['MAGE_RUN_CODE'] ) ? $_SERVER ['MAGE_RUN_CODE'] : '';
$mageRunType = isset ( $_SERVER ['MAGE_RUN_TYPE'] ) ? $_SERVER ['MAGE_RUN_TYPE'] : 'store';
$app = Mage::app ( $mageRunCode, $mageRunType );
Mage::getSingleton ( 'core/session', array ('name' => 'frontend' ) );

Это прекрасно работает, но как мне на самом деле создать сеанс Magento вне Magento, который будет заполнять таблицы log_url, log_visitor и т. Д., А также назначать данные посетителя сеансу?

В настоящее время пользователь попадает на страницу моего сайта прямо с другого сайта. Эта конкретная страница за пределами от Magento, но мне нужно получить доступ к ее идентификатору посетителя, используя следующий код:

Mage::getSingleton ( 'log/visitor' )->getId()

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

Ответы [ 4 ]

5 голосов
/ 29 января 2012

Ну, я понял это.Хотя я должен признать, что это не самое чистое решение, оно работает именно так, как я надеялся.Для тех, кто хочет это сделать, я вставил свой фрагмент кода ниже:

require 'app/Mage.php';
$mageRunCode = isset ( $_SERVER ['MAGE_RUN_CODE'] ) ? $_SERVER ['MAGE_RUN_CODE'] : '';
$mageRunType = isset ( $_SERVER ['MAGE_RUN_TYPE'] ) ? $_SERVER ['MAGE_RUN_TYPE'] : 'store';
$app = Mage::app ( $mageRunCode, $mageRunType );
$core_session = Mage::getSingleton ( 'core/session', array ('name' => 'frontend' ) );
$write = Mage::getSingleton ( 'core/resource' )->getConnection ( 'core_write' );

$url = Mage::getUrl ( '*/*/*', array ('_current' => true ) );

Mage::getSingleton ( 'core/session' )->setLastUrl ( $url );

$visitor_id = $_SESSION ['core'] ['visitor_data'] ['visitor_id'];

if (! empty ( $visitor_id )) {
    Mage::getSingleton ( 'log/visitor' )->setId ( $visitor_id );
} else {
    Mage::getSingleton ( 'customer/session' )->setWishlistItemCount ( 0 );
    Mage::getSingleton ( 'catalog/session' )->setCatalogCompareItemsCount ( 0 );

    $write->query ( "INSERT INTO log_url_info (url, referer) VALUES (?, ?)", array ($url, Mage::helper ( 'core/http' )->getHttpReferer ( true ) ) );
    $url_id = $write->lastInsertId ();
    $log_visitor = Mage::getSingleton ( 'log/visitor' )->initServerData ()->setFirstVisitAt ( now () )->setIsNewVisitor ( true )->setLastVisitAt ( now () )->setLastUrlId ( $url_id )->save ();
    $write->query ( "INSERT INTO log_url (url_id, visitor_id, visit_time) VALUES (?, ?, ?)", array ($url_id, $log_visitor->getId (), now () ) );
    $core_session->setVisitorData ( $log_visitor->getData () );

    $visitor_id = $log_visitor->getId ();
}

Надеюсь, это поможет кому-то другому, поэтому они не рвут свои волосы, как я.

1 голос
/ 18 октября 2013

На самом деле эти ответы не сработали, потому что я выполнял код в подкаталоге Magento.Magento смотрит на dirname вашей переменной SCRIPT_NAME и устанавливает его там.Поэтому, если вы устанавливаете сеанс из /foo/test.php, тогда cookie будет действителен только для / foo /, если magento находится в "/", он не увидит cookie.

Вв этом случае, если ваш сценарий является тем, который изначально создает cookie, вы должны заставить cookie быть действительным для "/".

Симптомы - ваши изменения не вступают в силу, и вы можете видетьдве сессии в "/ var / session".Это кажется непредсказуемым, но разница в том, что если Magento сначала создает сеанс, он действителен для всех путей.Если ваш сценарий создает его первым, он не подходит для Magento, браузер пропускает его, а Magento создает новый сеанс.

Пример рабочего кода:

<?php
ini_set('display_errors', 1);
require_once $_SERVER['DOCUMENT_ROOT'] . '/app/Mage.php';

Mage::app('mystore', 'website');

$session = Mage::getSingleton('core/session', array('name' => 'frontend'));
$sessionName = $session->getSessionName();
$sessionId = $session->getSessionId();

/**
 * Magento sets the cookie valid for the path "/recommend", but we need it available always (path "/")
 */
setcookie($sessionName, $sessionId, null, '/');

(причина, по которой я использовал DOCUMENT_ROOTпотому что я использую отображение modman из этого модуля, который запускает код через символическую ссылку).Важной частью является setcookie ().Из изучения заголовков http вы увидите, что установлены два куки.Один для "/ foo" и один для "/".Без вызова setCookie создается только первый сеанс, который не виден Magento при доступе через "/index.php" вместо "/foo/test.php"

1 голос
/ 07 мая 2012

Не уверен, поможет ли это, но вот немного кода, который поможет немного более точно загрузить magento с помощью метода начальной загрузки app ().Отправляя некоторые события, он создает экземпляр объекта посетителя и загружает некоторые другие полезные объекты / ресурсы, которые делают его функционирующим аналогичным функции run () собственного Magento:

<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/app/Mage.php';
umask(0);
//Scope
$scope = 'frontend';
// Initialize Mage_Core_Model_App object
$app = Mage::app('', 'store');
// Grab the front controller
$frontController = $app->getFrontController();
// Load configuration
Mage::getConfig()->init();
// Load event observers for specified scope
Mage::getConfig()->loadEventObservers($scope);
// Set the theme (not sure if needed, appears it falls back to whats set in the admin)
//Mage::getdesign()->setTheme('morris-v2');
// Add event area for event dispatching
$app->addEventArea($scope);
//Init the session by calling singleton
Mage::getSingleton('core/session', array('name'=>$scope));
//dispatch  layout load before event, this is useful for observing in case of ab testing etc
Mage::dispatchEvent('controller_action_layout_load_before', array('action'=>$frontController, 'layout'=>Mage::getSingleton('core/layout')));
//dispatch action predispatch, this has some observers which instantiate needed variables such as log/visitor
Mage::dispatchEvent('controller_action_predispatch', array('controller_action'=>$frontController));
0 голосов
/ 18 февраля 2016
Mage::getSingleton('core/session', array ('name' => 'frontend' ))->setCaptchaValue($digit); 

И

Mage::getSingleton('core/session', array ('name' => 'frontend' ))->getCaptchaValue();

Работа для сеанса Magento вне Magento

...