getOption(\'fred.core_path\', null, $modx->getOption(\'core_path\', null, MODX_CORE_PATH) . \'components/fred/\'); /** @var Fred $fred */ $fred = $modx->getService( \'fred\', \'Fred\', $corePath . \'model/fred/\', array( \'core_path\' => $corePath ) ); switch ($modx->event->name) { case \'OnDocFormPrerender\': if(!empty($resource) && !empty($fred->getTheme($resource->template))) { //Disable ContentBlocks $isContentBlocks = $resource->getProperty(\'_isContentBlocks\', \'contentblocks\', null); if($isContentBlocks !== false){ $resource->setProperty(\'_isContentBlocks\', false, \'contentblocks\'); $resource->save(); } $data = $resource->getProperty(\'data\', \'fred\'); $fingerprint = !empty($data[\'fingerprint\']) ? $data[\'fingerprint\'] : \'\'; //Load Open in Fred button $modx->lexicon->load(\'fred:default\'); $modx->controller->addLexiconTopic(\'fred:default\'); $modx->controller->addHtml(" "); } break; case \'OnLoadWebDocument\': $theme = $fred->getTheme($modx->resource->template); if (!empty($theme)) { $themeUri = $theme->getThemeFolderUri(); $modx->setPlaceholder(\'+fred.theme_dir\', $themeUri); $modx->setOption(\'fred.theme_dir\', $themeUri); } break; case \'OnWebPagePrerender\': $theme = $fred->getTheme($modx->resource->template); if (!empty($theme)) { if (!$modx->user) return; if (!($modx->user->hasSessionContext(\'mgr\') || $modx->user->hasSessionContext($modx->resource->context_key))) return; if (!$modx->hasPermission(\'fred\')) return; $modx->lexicon->load(\'fred:fe\'); $fredMode = 1; if (isset($_SESSION[\'fred\'])) { $fredMode = intval($_SESSION[\'fred\']); } if (isset($_GET[\'fred\'])) { $fredMode = intval($_GET[\'fred\']); } if ($fredMode === 4) { $fredMode = 0; $_SESSION[\'fred\'] = 0; } if ($fredMode === 1) { $_SESSION[\'fred\'] = 1; } $get = $_GET; unset($get[$modx->getOption(\'request_param_alias\', [], \'q\')]); if ($fredMode === 0) { $button = "makeUrl($modx->resource->id, \'\', array_merge($get, [\'fred\' => 1]) , \'abs\')) . "\\" title=\\"" . $modx->lexicon(\'fred.fe.turn_on_fred\') . "\\" role=\\"button\\" style=\\"display: block; text-decoration: none; background-color: #4D4D4D; background-image: url("data:image/svg+xml, %3Csvg xmlns=\'http://www.w3.org/2000/svg\' width=\'48\' height=\'48\' viewBox=\'-14.584 -8.583 48 48\'%3E%3ClinearGradient id=\'a\' gradientUnits=\'userSpaceOnUse\' x1=\'2164.318\' y1=\'-2519.043\' x2=\'2047.448\' y2=\'-2442.941\' gradientTransform=\'matrix(.1471 0 0 -.1471 -290.574 -365.794)\'%3E%3Cstop offset=\'0\' stop-color=\'%2380c3e6\'/%3E%3Cstop offset=\'1\' stop-color=\'%233380c2\'/%3E%3C/linearGradient%3E%3Cpath fill=\'url(%23a)\' d=\'M22.035 11.468l9.602-15.406H8.488L5.236 1.17z\'/%3E%3Cpath opacity=\'.15\' d=\'M5.236 1.17l1.702-2.633 15.097 12.931z\'/%3E%3ClinearGradient id=\'b\' gradientUnits=\'userSpaceOnUse\' x1=\'2184.769\' y1=\'-2694.977\' x2=\'2097.394\' y2=\'-2637.275\' gradientTransform=\'matrix(.1471 0 0 -.1471 -290.574 -365.794)\'%3E%3Cstop offset=\'0\' stop-color=\'%23f38649\'/%3E%3Cstop offset=\'.185\' stop-color=\'%23f28147\'/%3E%3Cstop offset=\'.409\' stop-color=\'%23ef7242\'/%3E%3Cstop offset=\'.654\' stop-color=\'%23ea5a3a\'/%3E%3Cstop offset=\'.911\' stop-color=\'%23e4382e\'/%3E%3Cstop offset=\'1\' stop-color=\'%23e12a29\'/%3E%3C/linearGradient%3E%3Cpath fill=\'url(%23b)\' d=\'M27.068 39.416V16.268l-4.957-3.176L11.583 29.74z\'/%3E%3Cpath opacity=\'.15\' d=\'M11.583 29.74l2.632 1.625 7.896-18.273z\'/%3E%3ClinearGradient id=\'c\' gradientUnits=\'userSpaceOnUse\' x1=\'1896.918\' y1=\'-2571.592\' x2=\'2064.08\' y2=\'-2467.137\' gradientTransform=\'matrix(.1471 0 0 -.1471 -290.574 -365.794)\'%3E%3Cstop offset=\'0\' stop-color=\'%2342ab4a\'/%3E%3Cstop offset=\'1\' stop-color=\'%23add155\'/%3E%3C/linearGradient%3E%3Cpath fill=\'url(%23c)\' d=\'M-10.25-8.583v23.148l5.419 3.175 26.866-6.272z\'/%3E%3ClinearGradient id=\'d\' gradientUnits=\'userSpaceOnUse\' x1=\'1933.576\' y1=\'-2758.292\' x2=\'2069.413\' y2=\'-2540.907\' gradientTransform=\'matrix(.1471 0 0 -.1471 -290.574 -365.794)\'%3E%3Cstop offset=\'0\' stop-color=\'%2342ab4a\'/%3E%3Cstop offset=\'1\' stop-color=\'%23add155\'/%3E%3C/linearGradient%3E%3Cpath fill=\'url(%23d)\' d=\'M-4.985 19.52l-9.599 15.093H8.565l13.546-21.521z\'/%3E%3C/svg%3E"); height: 48px; width: 48px; border-radius: 50%; outline: 0; border: none; background-repeat: no-repeat; background-size: 60%; background-position: center; box-shadow: rgba(18,55,100,0.34) 0 4px 8px; margin: 0; padding: 0; text-indent: -9999px; cursor: pointer; position: fixed; z-index: 10010; margin: 32px; bottom: 0; left: 0; opacity: 0.8; transition: .3s; box-sizing: border-box;\\" onmouseover=\\"this.style.transform=\'scale(1.05)\';\\" onmouseout=\\"this.style.transform=\'initial\'\\";>Fred"; $modx->resource->_output = preg_replace(\'/(<\\/body>(?:<\\/body>)?)/i\', "{$button}\\r\\n$1", $modx->resource->_output); return; } if ($fredMode === 3) { $modx->resource->_output = \'\'; return; } $html = Wa72\\HtmlPageDom\\HtmlPageCrawler::create($modx->resource->_output); $dzs = $html->filter(\'[data-fred-dropzone]\'); $dzs->each(function(Wa72\\HtmlPageDom\\HtmlPageCrawler $node, $i) { $node->setInnerHtml(\'\'); }); $modx->resource->_output = $html->saveHTML(); if ($fredMode === 2) { return; } $scripts = $html->filter(\'script\'); $scripts->each(function(Wa72\\HtmlPageDom\\HtmlPageCrawler $node, $i) { $newNode = Wa72\\HtmlPageDom\\HtmlPageCrawler::create(\'\'); $attrs = $node->getNode(0)->attributes; foreach ($attrs as $attr) { $newNode->attr($attr->nodeName, $attr->nodeValue); } $newNode->setAttribute(\'data-fred-script\', $node->getInnerHtml()); $node->replaceWith($newNode); }); $modx->resource->_output = $html->saveHTML(); $beforeRenderResults = $modx->invokeEvent(\'FredBeforeRender\'); $includes = \'\'; $beforeRender = \'\'; $lexicons = []; foreach ($beforeRenderResults as $result) { if ($result[\'includes\']) { $includes .= $result[\'includes\']; } if ($result[\'beforeRender\']) { $beforeRender .= $result[\'beforeRender\']; } if ($result[\'lexicons\'] && is_array($result[\'lexicons\'])) { $lexicons = array_merge($lexicons, $result[\'lexicons\']); } } /** @var FredElementRTEConfig[] $rteConfigs */ $rteConfigs = $modx->getIterator(\'FredElementRTEConfig\'); $rteConfigString = []; foreach ($rteConfigs as $rteConfig) { if (empty($rteConfig->get(\'data\'))) continue; $rteConfigString[] = $rteConfig->name . \':\' . $rteConfig->data; } $rteConfigString = implode(\',\', $rteConfigString); $payload = [ \'iss\' => $modx->user->id, \'resource\' => $modx->resource->id, \'context\' => $modx->resource->context_key, \'queryParams\' => $_GET ]; $jwt = \\Firebase\\JWT\\JWT::encode($payload, $fred->getSecret()); $fredContent = \' \' . $includes . \' \'; $modx->resource->_output = preg_replace(\'/(<\\/head>(?:<\\/head>)?)/i\', "{$fredContent}\\r\\n$1", $modx->resource->_output); } break; case \'OnBeforeDocFormSave\': if ($mode !== \'upd\') return; if (empty($fred->getTheme($resource->template))) return; $data = $resource->getProperty(\'data\', \'fred\'); if (!empty($data[\'fingerprint\'])) { if (empty($resource->fingerprint)) { $modx->event->_output = \'No fingerprint was provided.\'; return; } if ($data[\'fingerprint\'] !== $resource->fingerprint) { $modx->event->_output = \'Your page is outdated, please reload the page.\'; return; } } break; case \'OnDocFormSave\': if ($mode !== \'upd\') return; if (empty($fred->getTheme($resource->template))) return; $renderResource = new \\Fred\\RenderResource($resource, $modx); $renderResource->render(); break; case \'OnTemplateRemove\': /** @var modTemplate $template */ $templateId = $template->id; if (!empty($templateId)) { /** @var FredThemedTemplate $themedTemplate */ $themedTemplate = $modx->getObject(\'FredThemedTemplate\', [\'template\' => $templateId]); if ($themedTemplate) { $themedTemplate->remove(); } } break; case \'OnTVInputRenderList\': $modx->event->output($corePath . \'elements/tvs/input/\'); break; case \'OnTVInputPropertiesList\': $modx->event->output($corePath . \'elements/tvs/input/options/\'); break; case \'OnManagerPageBeforeRender\': $modx->controller->addLexiconTopic(\'fred:default\'); break; } return; return; ';