I'm trying to conditionally set a cookie IF a certain query string parameter exists. My Class is an observer. The config.xml
code:
<frontend>
<events>
<controller_action_predispatch>
<observers>
<my_module>
<class>my_module/observer</class>
<method>setCookie</method>
</my_module>
</observers>
</controller_action_predispatch>
</events>
</frontend>
The observer class (app/code/local/My/Module/Model/Observer.php
):
class My_Module_Model_Observer
{
public $_defaultParam = null;
public function setCookie(Varien_Event_Observer $observer = null, $setCookie = true)
{
$myCookie = 'source';
$myCookieVal = $this->getQueryString($myCookie);
$myCookiePeriod = (int) 86400 * 30;
$myCookieEnabled = Mage::getStoreConfig('my_module/my_group/source_cookie', Mage::app()->getStore());
if ($setCookie) {
if ($myCookieEnabled == 1 && $myCookieVal) {
$doCookie = $this->setCookie($myCookie, $myCookieVal, $myCookiePeriod, false);
} else {
if ($this->getCookie($myCookie)) {
$doCookie = $this->delCookie($myCookie);
}
}
} else {
$doCookie = $this->getCookie($myCookie, true);
}
return $doCookie;
}
public function getQueryString($param = null)
{
$queryParam = Mage::app()->getRequest()->getParam($param, 'notset');
$paramValue = $queryParam ? (string) $queryParam : $this->_defaultParam;
var_dump('ParamValue: ' . $paramValue);
return $paramValue;
}
public function setCookie($cookieName = null, $cookieVal = null, $cookiePeriod = 3600, $setEncode = true)
{
$model = Mage::getModel('core/cookie');
if ($setEncode) {
$cookieVal = base64_encode($cookieVal);
}
$curStore = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
$urlPath = parse_url($curStore);
$cookiePath = rtrim(str_replace('index.php', '', $urlPath['path']), '/');
var_dump('CookieVal: ' . $cookieVal);
$theCookie = $model->set($cookieName, $cookieVal, $cookiePeriod, $cookiePath);
return $theCookie;
}
}
The query string looks like this:
mydomain.com?some=rubbish&then=what&we=really&want=this&source=my
You will notice in the method getQueryString
, I'm var_dump
'ing the variable $paramValue
. It' spits out string(14) "ParamValue: my"
.
Also, in the setCookie
method, the var_dump
spits out string(13) "CookieVal: my"
.
HOWEVER, the cookie is set with the value notset
! That means the $param
is null, yes? But the var_dumps
tell me otherwise. Why is the correct value not set in the cookie?
I guess I've been staring at this too long and need some eyes; could be my own stupidity! Thanks for taking a look.
~ Edit ~
I also tried to loop through all the query string params
by changing the getQueryString
method to the following:
public function getQueryString($param = null)
{
$queryParams = Mage::app()->getRequest()->getParams();
foreach ($queryParams as $pid => $p) {
$paramValue = ($pid == 'source') ? $p : $this->_defaultParam;
}
var_dump('ParamValue: ' . $paramValue);
return $paramValue;
}
But the result is the same.
var_dump()
to output some data? The reason is that var_dump() triggers the headers to be sent, so no cookie header could be sent after that.