/** * */ public function dispatchLoopShutdown() { if (!Tool::isHtmlResponse($this->getResponse())) { return; } if ($this->enabled) { $targets = array(); $personas = array(); $dataPush = array("personas" => $this->personas, "method" => strtolower($this->getRequest()->getMethod())); if (count($this->events) > 0) { $dataPush["events"] = $this->events; } if ($this->document instanceof Document\Page && !Model\Staticroute::getCurrentRoute()) { $dataPush["document"] = $this->document->getId(); if ($this->document->getPersonas()) { if ($_GET["_ptp"]) { // if a special version is requested only return this id as target group for this page $dataPush["personas"][] = (int) $_GET["_ptp"]; } else { $docPersonas = explode(",", trim($this->document->getPersonas(), " ,")); // cast the values to int array_walk($docPersonas, function (&$value) { $value = (int) trim($value); }); $dataPush["personas"] = array_merge($dataPush["personas"], $docPersonas); } } // check for persona specific variants of this page $personaVariants = array(); foreach ($this->document->getElements() as $key => $tag) { if (preg_match("/^persona_-([0-9]+)-_/", $key, $matches)) { $id = (int) $matches[1]; if (Model\Tool\Targeting\Persona::isIdActive($id)) { $personaVariants[] = $id; } } } if (!empty($personaVariants)) { $personaVariants = array_values(array_unique($personaVariants)); $dataPush["personaPageVariants"] = $personaVariants; } } // no duplicates $dataPush["personas"] = array_unique($dataPush["personas"]); $activePersonas = array(); foreach ($dataPush["personas"] as $id) { if (Model\Tool\Targeting\Persona::isIdActive($id)) { $activePersonas[] = $id; } } $dataPush["personas"] = $activePersonas; if ($this->document) { // @TODO: cache this $list = new Model\Tool\Targeting\Rule\Listing(); $list->setCondition("active = 1"); foreach ($list->load() as $target) { $redirectUrl = $target->getActions()->getRedirectUrl(); if (is_numeric($redirectUrl)) { $doc = \Document::getById($redirectUrl); if ($doc instanceof \Document) { $target->getActions()->redirectUrl = $doc->getFullPath(); } } $targets[] = $target; } $list = new Model\Tool\Targeting\Persona\Listing(); $list->setCondition("active = 1"); foreach ($list->load() as $persona) { $personas[] = $persona; } } $code = '<script type="text/javascript" src="/pimcore/static/js/frontend/geoip.js/"></script>'; $code .= '<script type="text/javascript">'; $code .= 'var pimcore = pimcore || {};'; $code .= 'pimcore["targeting"] = {};'; $code .= 'pimcore["targeting"]["dataPush"] = ' . \Zend_Json::encode($dataPush) . ';'; $code .= 'pimcore["targeting"]["targetingRules"] = ' . \Zend_Json::encode($targets) . ';'; $code .= 'pimcore["targeting"]["personas"] = ' . \Zend_Json::encode($personas) . ';'; $code .= '</script>'; $code .= '<script type="text/javascript" src="/pimcore/static/js/frontend/targeting.js"></script>'; $code .= "\n"; // analytics $body = $this->getResponse()->getBody(); // search for the end <head> tag, and insert the google analytics code before // this method is much faster than using simple_html_dom and uses less memory $headEndPosition = stripos($body, "<head>"); if ($headEndPosition !== false) { $body = substr_replace($body, "<head>\n" . $code, $headEndPosition, 7); } $this->getResponse()->setBody($body); } }