我可以使用下面的流行方法完美地访问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。有什么想法吗?
答案 0 :(得分:5)
好吧,我已经明白了。虽然我必须承认这不是最干净的解决方案,但它的工作原理与我希望的完全一样。对于其他想要这样做的人,我已经粘贴了下面的代码摘录:
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 :(得分:1)
不确定这是否有帮助,但这里有一些代码可以通过app()bootstrap方法更准确地加载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));
答案 2 :(得分:1)
实际上这些答案不起作用,因为我在Magento的子目录中运行代码。 Magento查看SCRIPT_NAME变量的dirname,并将其设置在那里。因此,如果您从/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看不到该会话
答案 3 :(得分:-1)
Mage::getSingleton('core/session', array ('name' => 'frontend' ))->setCaptchaValue($digit);
并且
Mage::getSingleton('core/session', array ('name' => 'frontend' ))->getCaptchaValue();
为Magento以外的Magento会议工作