/** * Returns the available statuses given an action and a state * * @param $actionName * @param $stateName * @return array * @throws \Exception */ public function getAvailableStatuses($actionName, $stateName) { $actionConfig = $this->workflow->getActionConfig($actionName); $globalAction = $this->workflow->isGlobalAction($actionName); $hasTransition = $this->actionHasTransition($actionConfig); if ($globalAction || !$hasTransition) { $objectStatus = $this->getElementStatus(); $availableStatuses = [$objectStatus => $this->workflow->getStatusConfig($objectStatus)]; } else { //we have a check here for the state being an existing one if (!isset($actionConfig['transitionTo'][$stateName])) { throw new \Exception("Workflow::getAvailableStatuses, State [{$stateName}] not valid for action [{$actionName}] on element [{$this->element->getId()}] with status [{$this->getElementStatus()}]"); } $availableStatuses = []; foreach ($actionConfig['transitionTo'][$stateName] as $statusName) { $availableStatuses[$statusName] = $this->workflow->getStatusConfig($statusName); } } return $availableStatuses; }
/** * @see Object\ClassDefinition\Data::getDataForEditmode * @param Asset|Document|Object\AbstractObject $data * @param null|Model\Object\AbstractObject $object * @return array */ public function getDataForEditmode($data, $object = null) { if ($data instanceof Element\ElementInterface) { $r = array("id" => $data->getId(), "path" => $data->getFullPath(), "subtype" => $data->getType(), "type" => Element\Service::getElementType($data)); return $r; } return; }
/** * @param Document $parent * @return void */ public function setParent($parent) { $this->parent = $parent; if ($parent instanceof Document) { $this->parentId = $parent->getId(); } return $this; }
/** * */ 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); } }
/** * @param Document $document */ public static function getSiteForDocument($document) { $cacheKey = "sites_full_list"; if (\Zend_Registry::isRegistered($cacheKey)) { $sites = \Zend_Registry::get($cacheKey); } else { $sites = new Site\Listing(); $sites = $sites->load(); \Zend_Registry::set($cacheKey, $sites); } foreach ($sites as $site) { if (preg_match("@^" . $site->getRootPath() . "/@", $document->getRealFullPath()) || $site->getRootDocument()->getId() == $document->getId()) { return $site; } } return; }
/** * @param Document|Asset|Object\AbstractObject $element * @return array */ public static function getDependencyForFrontend($element) { if ($element instanceof ElementInterface) { return array("id" => $element->getId(), "path" => $element->getFullPath(), "type" => self::getElementType($element), "subtype" => $element->getType()); } }
/** * @param Document $target * @param Document $source * @return Document copied document */ public function copyRecursive($target, $source) { // avoid recursion if (!$this->_copyRecursiveIds) { $this->_copyRecursiveIds = array(); } if (in_array($source->getId(), $this->_copyRecursiveIds)) { return; } if (method_exists($source, "getElements")) { $source->getElements(); } $source->getProperties(); $new = clone $source; $new->id = null; $new->setChilds(null); $new->setKey(Element\Service::getSaveCopyName("document", $new->getKey(), $target)); $new->setParentId($target->getId()); $new->setUserOwner($this->_user->getId()); $new->setUserModification($this->_user->getId()); $new->setResource(null); $new->setLocked(false); $new->setCreationDate(time()); if (method_exists($new, "setPrettyUrl")) { $new->setPrettyUrl(null); } $new->save(); // add to store $this->_copyRecursiveIds[] = $new->getId(); foreach ($source->getChilds() as $child) { $this->copyRecursive($new, $child); } $this->updateChilds($target, $new); return $new; }
/** * @param Site $site * @param Document $document * @return int */ public function getDocumentIdFromHardlinkInSameSite(Site $site, Document $document) { return $this->db->fetchOne("SELECT documents.id FROM documents\n LEFT JOIN documents_hardlink ON documents.id = documents_hardlink.id\n WHERE documents_hardlink.sourceId = ? AND documents.path LIKE ?", array($document->getId(), $site->getRootPath() . "/%")); }
/** * @param Document $document */ public function removeTranslation(Document $document) { $this->db->delete("documents_translations", "id = " . $document->getId()); // if $document is a source-document, we need to move them over to a new document $newSourceId = $this->db->fetchOne("SELECT id FROM documents_translations WHERE sourceId = ?", $document->getId()); if ($newSourceId) { $this->db->update("documents_translations", ["sourceId" => $newSourceId], "sourceId = " . $document->getId()); $this->db->delete("documents_translations", "id = " . $newSourceId); } }
/** * @param Document $target * @param Document $source * @return Document copied document */ public function copyRecursive($target, $source) { // avoid recursion if (!$this->_copyRecursiveIds) { $this->_copyRecursiveIds = []; } if (in_array($source->getId(), $this->_copyRecursiveIds)) { return; } if (method_exists($source, "getElements")) { $source->getElements(); } $source->getProperties(); $new = clone $source; $new->id = null; $new->setChilds(null); $new->setKey(Element\Service::getSaveCopyName("document", $new->getKey(), $target)); $new->setParentId($target->getId()); $new->setUserOwner($this->_user->getId()); $new->setUserModification($this->_user->getId()); $new->setDao(null); $new->setLocked(false); $new->setCreationDate(time()); if (method_exists($new, "setPrettyUrl")) { $new->setPrettyUrl(null); } $new->save(); // add to store $this->_copyRecursiveIds[] = $new->getId(); foreach ($source->getChilds() as $child) { $this->copyRecursive($new, $child); } $this->updateChilds($target, $new); // triggers actions after the complete document cloning \Pimcore::getEventManager()->trigger('document.postCopy', $new, ['base_element' => $source]); return $new; }