2012-01-28 75 views
3

我可以使用下面流行的方法,很好地訪問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商店,但如果不是,它只是返回一個布爾型的假。我想要做的是檢查是否爲Visitor ID設置了值,如果不是,請在Magento之外的首頁創建訪問者,以便我可以在此頁面上使用Visitor ID。同樣重要的是,只要用戶進入我的Magento商店,相同的訪問者ID將在我的目錄導航中應用,即同一會話。有任何想法嗎?

回答

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

我希望這可以幫助別人使它們不會撕裂了頭髮像我了。

+0

這幫助我,謝謝你。到獲得會話在不同領域工作的關鍵是線' $ core_session = Mage :: getSingleton('core/session',array('name'=>'frontend')'在使用其他數據之前。 – Ian 2013-01-23 19:59:34

1

不知道這是否有幫助,但這裏有一段代碼可以幫助更加準確地通過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)); 
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, '/'); 

(I使用DOCUMENT_ROOT的原因是因爲我使用從該模塊,它通過一個符號鏈接運行代碼modman映射)。重要的部分是setcookie()。你會從檢查http頭文件中看到兩個cookie被設置。一個用於「/ foo」,一個用於「/」。如果沒有對setCookie的調用,只會創建第一個會話,當通過「/index.php」而不是「/ foo/test」訪問時,Magento不會看到該會話。PHP的」

+0

正是我所需要的!我想了一切,但沒有注意到餅乾範圍!乾杯隊友!:) – justabuzz 2015-04-04 01:41:13

-1
Mage::getSingleton('core/session', array ('name' => 'frontend'))->setCaptchaValue($digit); 

而且

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

的外面的Magento會議工作的Magento