/** * @param Page $page * @param Request $request * @param string $code * * @return void */ public function hitPage($page, $request, $code = '200') { //don't skew results with in-house hits if (!$this->factory->getSecurity()->isAnonymous()) { return; } $hitRepo = $this->getHitRepository(); $hit = new Hit(); $hit->setDateHit(new \Datetime()); //check for existing IP $ipAddress = $this->factory->getIpAddress(); $hit->setIpAddress($ipAddress); /** @var \Mautic\LeadBundle\Model\LeadModel $leadModel */ $leadModel = $this->factory->getModel('lead'); //check for any clickthrough info $clickthrough = $request->get('ct', false); if (!empty($clickthrough)) { $clickthrough = $this->decodeArrayFromUrl($clickthrough); if (!empty($clickthrough['lead'])) { $lead = $leadModel->getEntity($clickthrough['lead']); if ($lead !== null) { $leadModel->setLeadCookie($clickthrough['lead']); $leadClickthrough = true; $leadModel->setCurrentLead($lead); } } if (!empty($clickthrough['source'])) { $hit->setSource($clickthrough['source'][0]); $hit->setSourceId($clickthrough['source'][1]); } if (!empty($clickthrough['email'])) { $hit->setEmail($this->em->getReference('MauticEmailBundle:Email', $clickthrough['email'])); } } if (empty($leadClickthrough)) { $lead = $leadModel->getCurrentLead(); } if ($page instanceof Redirect) { //use the configured redirect URL $pageURL = $page->getUrl(); } else { //use current URL // Tracking pixel is used if (strpos($request->server->get('REQUEST_URI'), '/mtracking.gif') !== false) { $pageURL = $request->server->get('HTTP_REFERER'); // if additional data were sent with the tracking pixel if ($request->server->get('QUERY_STRING')) { parse_str($request->server->get('QUERY_STRING'), $query); // URL attr 'd' is encoded so let's decode it first. $decoded = false; if (isset($query['d'])) { // parse_str auto urldecodes $query = unserialize(base64_decode($query['d'])); $decoded = true; } if (isset($query['page_url'])) { $pageURL = $query['page_url']; if (!$decoded) { $pageURL = urldecode($pageURL); } } elseif (isset($query['url'])) { $pageURL = $query['url']; if (!$decoded) { $pageURL = urldecode($pageURL); } } if (isset($query['page_referrer'])) { if (!$decoded) { $query['page_referrer'] = urldecode($query['page_referrer']); } $hit->setReferer($query['page_referrer']); } elseif (isset($query['referrer'])) { if (!$decoded) { $query['referrer'] = urldecode($query['referrer']); } $hit->setReferer($query['referrer']); } if (isset($query['page_language'])) { if (!$decoded) { $query['page_language'] = urldecode($query['page_language']); } $hit->setPageLanguage($query['page_language']); } elseif (isset($query['language'])) { if (!$decoded) { $query['language'] = urldecode($query['language']); } $hit->setPageLanguage($query['language']); } if (isset($query['page_title'])) { if (!$decoded) { $query['page_title'] = urldecode($query['page_title']); } $hit->setUrlTitle($query['page_title']); } elseif (isset($query['title'])) { if (!$decoded) { $query['title'] = urldecode($query['title']); } $hit->setUrlTitle($query['title']); } // Update lead fields if some data were sent in the URL query /** @var \Mautic\LeadBundle\Model\FieldModel $leadFieldModel */ $leadFieldModel = $this->factory->getModel('lead.field'); $availableLeadFields = $leadFieldModel->getFieldList(false, false, array('isPublished' => true, 'isPubliclyUpdatable' => true)); $uniqueLeadFields = $this->factory->getModel('lead.field')->getUniqueIdentiferFields(); $uniqueLeadFieldData = array(); $inQuery = array_intersect_key($query, $availableLeadFields); foreach ($inQuery as $k => $v) { if (empty($query[$k])) { unset($inQuery[$k]); } if (array_key_exists($k, $uniqueLeadFields)) { $uniqueLeadFieldData[$k] = $v; } } if (count($inQuery)) { if (count($uniqueLeadFieldData)) { $existingLeads = $this->em->getRepository('MauticLeadBundle:Lead')->getLeadsByUniqueFields($uniqueLeadFieldData, $lead->getId()); if (!empty($existingLeads)) { $lead = $leadModel->mergeLeads($lead, $existingLeads[0]); } $leadIpAddresses = $lead->getIpAddresses(); if (!$leadIpAddresses->contains($ipAddress)) { $lead->addIpAddress($ipAddress); } $leadModel->setCurrentLead($lead); } $leadModel->setFieldValues($lead, $inQuery); $leadModel->saveEntity($lead); } } } else { $pageURL = 'http'; if ($request->server->get('HTTPS') == 'on') { $pageURL .= 's'; } $pageURL .= '://'; if ($request->server->get('SERVER_PORT') != '80') { $pageURL .= $request->server->get('SERVER_NAME') . ':' . $request->server->get('SERVER_PORT') . $request->server->get('REQUEST_URI'); } else { $pageURL .= $request->server->get('SERVER_NAME') . $request->server->get('REQUEST_URI'); } } } $hit->setUrl($pageURL); list($trackingId, $generated) = $leadModel->getTrackingCookie(); $hit->setTrackingId($trackingId); $hit->setLead($lead); if (!$generated) { $lastHit = $request->cookies->get('mautic_referer_id'); if (!empty($lastHit)) { //this is not a new session so update the last hit if applicable with the date/time the user left $this->getHitRepository()->updateHitDateLeft($lastHit); } } if (!empty($page)) { $hitCount = $page->getHits(); $hitCount++; $page->setHits($hitCount); //check for a hit from tracking id $countById = $hitRepo->getHitCountForTrackingId($page, $trackingId); if (empty($countById)) { $uniqueHitCount = $page->getUniqueHits(); $uniqueHitCount++; $page->setUniqueHits($uniqueHitCount); } if ($page instanceof Page) { $hit->setPage($page); $hit->setPageLanguage($page->getLanguage()); if ($countById) { $variantHitCount = $page->getVariantHits(); $variantHitCount++; $page->setVariantHits($variantHitCount); } } elseif ($page instanceof Redirect) { $hit->setRedirect($page); } $this->em->persist($page); } //glean info from the IP address if ($details = $ipAddress->getIpDetails()) { $hit->setCountry($details['country']); $hit->setRegion($details['region']); $hit->setCity($details['city']); $hit->setIsp($details['isp']); $hit->setOrganization($details['organization']); } $hit->setCode($code); $hit->setReferer($request->server->get('HTTP_REFERER')); $hit->setUserAgent($request->server->get('HTTP_USER_AGENT')); $hit->setRemoteHost($request->server->get('REMOTE_HOST')); //get a list of the languages the user prefers $browserLanguages = $request->server->get('HTTP_ACCEPT_LANGUAGE'); if (!empty($browserLanguages)) { $languages = explode(',', $browserLanguages); foreach ($languages as $k => $l) { if ($pos = strpos(';q=', $l) !== false) { //remove weights $languages[$k] = substr($l, 0, $pos); } } $hit->setBrowserLanguages($languages); } if ($this->dispatcher->hasListeners(PageEvents::PAGE_ON_HIT)) { $event = new PageHitEvent($hit, $request, $code); $this->dispatcher->dispatch(PageEvents::PAGE_ON_HIT, $event); } $this->em->persist($hit); $this->em->flush(); //save hit to the cookie to use to update the exit time $this->factory->getHelper('cookie')->setCookie('mautic_referer_id', $hit->getId()); }
/** * {@inheritDoc} */ public function setHits($hits) { $this->__initializer__ && $this->__initializer__->__invoke($this, 'setHits', array($hits)); return parent::setHits($hits); }