如何在Magento之外创建Magento会话



我可以使用下面流行的方法非常好地访问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的外部,但我需要使用以下代码访问他们的访客ID:

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

如果用户以前去过我的Magento商店,这很好,但如果没有,它只会返回一个布尔值false。我想做的是检查是否为访问者ID设置了值,如果没有,请在Magento之外的第一个页面上创建访问者,这样我就可以在这个页面上使用访问者ID。同样重要的是,一旦用户进入我的Magento商店,相同的访问者ID将应用于他们对我的目录的导航,即相同的会话。有什么想法吗?

好吧,我已经想通了。虽然我必须承认这不是最干净的解决方案,但它确实如我所希望的那样有效。对于其他想这样做的人,我把我的代码摘录粘贴在下面:

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

我希望这能帮助其他人,这样他们就不会像我一样把头发扯掉。

不确定这是否有帮助,但这里有一些代码可以帮助通过app()引导方法更准确地加载magento。通过调度一些事件,它实例化访问者对象,并加载一些其他有用的对象/资源,使其功能类似于本地Magento的run():

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

实际上,这些答案不起作用,因为我在Magento的子目录中运行代码。Magento查看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标头,您将看到设置了两个cookie。一个表示"/foo",一个表示为"/"。如果不调用setCookie,则只创建第一个会话,当通过"/index.php"而不是"/foo/test.php"

访问时,Magento看不到该会话
Mage::getSingleton('core/session', array ('name' => 'frontend' ))->setCaptchaValue($digit); 

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

在Magento 之外为Magento会话工作

最新更新