Search code examples
sessionmagentologgingvisitor-pattern

How do I create a Magento session outside of Magento?


I am able to access an existing session outside of Magento perfectly fine using the popular method below.

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

This works great, but how do I actually create a Magento session outside of Magento that would populate the log_url, log_visitor, etc. tables as well as assigning the visitor data to the session?

Currently, the user arrives at a page on my site directly from another website. This specific page is outside of Magento but I need to access their Visitor ID using the following code:

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

This works fine if the user has previously been to my Magento store, but if not, it just returns a boolean false. What I would like to do is check to see if there is a value set for the Visitor ID and if not, create the visitor on this first page which is outside of Magento so I can use the Visitor ID right on this page. It is also important that as soon as the user enters my Magento store, the same Visitor ID will be applied throughout their navigation of my catalog, i.e. the same session. Any ideas?


Solution

  • Well, I've figured it out. Although I must admit it's not the cleanest solution, it works exactly as I had hoped. For anyone else who's looking to do this, I've pasted my code excerpt below:

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

    I hope this helps someone else so they're not ripping their hair out like I was.