Introduction
This guide gives an example how to work with sessions in X-Cart. X-Cart identifies a session data by a value stored in xid cookie – unless changed by decoration of \XLite\Core\Session class.
For the sake of example, we will create a module with a page cart.php?target=session_demo and this page can be called with the session_value parameter. For the very first time this page will display the Session value has not been specified yet message and it will remain the same until the session_value parameter is passed. Once it is passed, the page will display the Session value is: {session_value} message. Even if you open this page without session_value parameter after that, the message Session value is: {session_value} message will be displayed with the latest session_value submitted.
Implementation
We start with creating an empty module with developer ID XCExample and module ID SessionDemo. Then we create a page cart.php?target=session_demo in our module. For that we create:
an empty controller class
\XLite\Module\XCExample\SessionDemo\Controller\Customer\SessionDemo:<?php
// vim: set ts=4 sw=4 sts=4 et:
namespace XLite\Module\XCExample\SessionDemo\Controller\Customer;
/**
* SessionDemo
*/
class SessionDemo extends \XLite\Controller\Customer\ACustomer
{
}a page viewer class
\XLite\Module\XCExample\SessionDemo\View\Page\Customer\SessionDemowith the following content:<?php
// vim: set ts=4 sw=4 sts=4 et:
namespace XLite\Module\XCExample\SessionDemo\View\Page\Customer;
/**
* SessionDemoPage
*
* @ListChild (list="center", zone="customer")
*/
class SessionDemoPage extends \XLite\View\AView
{
/**
* Return list of allowed targets
*/
public static function getAllowedTargets()
{
return array_merge(parent::getAllowedTargets(), array('session_demo'));
}
/**
* Return widget default template
*/
public function getDefaultTemplate()
{
return 'modules/XCExample/SessionDemo/page/session_demo/body.twig';
}
}an empty page template
skins/customer/modules/XCExample/SessionDemo/page/session_demo/body.twig.
If there is session_value parameter in request to cart.php?target=session_demo page, we will save it to the session variable. To achieve that we are going to implement custom handleRequest() method in our controller class \XLite\Module\XCExample\SessionDemo\Controller\Customer\SessionDemo:
public function handleRequest()
{
$sessionValue = \XLite\Core\Request::getInstance()->session_value;
if (!empty($sessionValue)) {
\XLite\Core\Session::getInstance()->session_value = $sessionValue;
}
parent::handleRequest();
}
The code that saves the session_value param into a session is \XLite\Core\Session::getInstance()->session_value = $sessionValue;. As you can see, saving variable into a session is as simple as assigning a value.
Now, we need to add a method to our controller that will fetch a value of this session variable. It will be as follows:
public function getSessionValue()
{
if (!empty(\XLite\Core\Session::getInstance()->session_value)) {
return \XLite\Core\Session::getInstance()->session_value;
}
return null;
}
By default it returns an null, but if there is any value stored in the session_value session variable, then it will return this value.
The final version of \XLite\Module\XCExample\SessionDemo\Controller\Customer\SessionDemo class will be as follows:
<?php
// vim: set ts=4 sw=4 sts=4 et:
namespace XLite\Module\XCExample\SessionDemo\Controller\Customer;
/**
* SessionDemo
*/
class SessionDemo extends \XLite\Controller\Customer\ACustomer
{
public function handleRequest()
{
$sessionValue = \XLite\Core\Request::getInstance()->session_value;
if (!empty($sessionValue)) {
\XLite\Core\Session::getInstance()->session_value = $sessionValue;
}
parent::handleRequest();
}
public function getSessionValue()
{
if (!empty(\XLite\Core\Session::getInstance()->session_value)) {
return \XLite\Core\Session::getInstance()->session_value;
}
return null;
}
}
Now we need to define display of our page and the mod will be done. We go to the skins/customer/modules/Tony/SessionDemo/page/session_demo/body.twig template and define its content as follows:
{% if this.getSessionValue() %}
Session value is: {{ this.getSessionValue() }}
{% else %}
Session value has not been specified yet
{% endif %}
If getSessionValue() returns non-empty value, we display the Session value is: {session_value} message, otherwise we display the message Session value has not been specified yet.
That is it. Now we can check the results. Go to your cart.php?target=session_demo page and you will see the message that session variable is not defined yet:

Then, try to open this page as cart.php?target=session_demo&session_value=foo and you will see the following result:

If you try to open the same page as cart.php?target=session_demo with session_value parameter, you will still see the result with session variable defined:

If you want to see the initial message, you will have to clean up your cookies.
Module example
This module pack can be downloaded from here: XCExample-SessionDemo-v5_3_0.tar