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;