14.cache.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. <?php return '/*
  2. * This file is part of the Fred package.
  3. *
  4. * Copyright (c) MODX, LLC
  5. *
  6. * For the full copyright and license information, please view the LICENSE
  7. * file that was distributed with this source code.
  8. */
  9. $corePath = $modx->getOption(\'fred.core_path\', null, $modx->getOption(\'core_path\', null, MODX_CORE_PATH) . \'components/fred/\');
  10. /** @var Fred $fred */
  11. $fred = $modx->getService(
  12. \'fred\',
  13. \'Fred\',
  14. $corePath . \'model/fred/\',
  15. array(
  16. \'core_path\' => $corePath
  17. )
  18. );
  19. switch ($modx->event->name) {
  20. case \'OnDocFormPrerender\':
  21. if(!empty($resource) && !empty($fred->getTheme($resource->template))) {
  22. //Disable ContentBlocks
  23. $isContentBlocks = $resource->getProperty(\'_isContentBlocks\', \'contentblocks\', null);
  24. if($isContentBlocks !== false){
  25. $resource->setProperty(\'_isContentBlocks\', false, \'contentblocks\');
  26. $resource->save();
  27. }
  28. $data = $resource->getProperty(\'data\', \'fred\');
  29. $fingerprint = !empty($data[\'fingerprint\']) ? $data[\'fingerprint\'] : \'\';
  30. //Load Open in Fred button
  31. $modx->lexicon->load(\'fred:default\');
  32. $modx->controller->addLexiconTopic(\'fred:default\');
  33. $modx->controller->addHtml("
  34. <script>
  35. Ext.ComponentMgr.onAvailable(\'modx-resource-content\', function(right) {
  36. right.on(\'beforerender\', function() {
  37. var content = Ext.getCmp(\'ta\'),
  38. contentvalue = content.getValue(),
  39. panel = Ext.getCmp(\'modx-page-update-resource\');
  40. content.destroy();
  41. right.insert(0,{
  42. xtype: \'button\'
  43. ,fieldLabel: _(\'fred.open_in_fred\')
  44. ,hideLabel: true
  45. ,cls: \'primary-button\'
  46. ,style: {padding: \'10px 15px\'}
  47. ,html: _(\'fred.open_in_fred\')
  48. ,handler: function(){
  49. window.open(panel.config.preview_url)
  50. }
  51. });
  52. right.insert(1,{
  53. xtype: \'textarea\'
  54. ,hideLabel: true
  55. ,anchor: \'100%\'
  56. ,grow: true
  57. ,style: {marginTop:\'15px\'}
  58. ,disabled: true
  59. ,value: contentvalue
  60. });
  61. });
  62. right.on(\'afterrender\', function() {
  63. var panel = Ext.getCmp(\'modx-panel-resource\');
  64. panel.on(\'success\', function(){
  65. location.reload();
  66. });
  67. var fingerprint = document.createElement(\'input\');
  68. fingerprint.setAttribute(\'type\', \'hidden\');
  69. fingerprint.setAttribute(\'name\', \'fingerprint\');
  70. fingerprint.setAttribute(\'value\', \'" . $fingerprint . "\');
  71. panel.form.el.dom.appendChild(fingerprint);
  72. });
  73. });
  74. </script>");
  75. }
  76. break;
  77. case \'OnLoadWebDocument\':
  78. $theme = $fred->getTheme($modx->resource->template);
  79. if (!empty($theme)) {
  80. $themeUri = $theme->getThemeFolderUri();
  81. $modx->setPlaceholder(\'+fred.theme_dir\', $themeUri);
  82. $modx->setOption(\'fred.theme_dir\', $themeUri);
  83. }
  84. break;
  85. case \'OnWebPagePrerender\':
  86. $theme = $fred->getTheme($modx->resource->template);
  87. if (!empty($theme)) {
  88. if (!$modx->user) return;
  89. if (!($modx->user->hasSessionContext(\'mgr\') || $modx->user->hasSessionContext($modx->resource->context_key))) return;
  90. if (!$modx->hasPermission(\'fred\')) return;
  91. $modx->lexicon->load(\'fred:fe\');
  92. $fredMode = 1;
  93. if (isset($_SESSION[\'fred\'])) {
  94. $fredMode = intval($_SESSION[\'fred\']);
  95. }
  96. if (isset($_GET[\'fred\'])) {
  97. $fredMode = intval($_GET[\'fred\']);
  98. }
  99. if ($fredMode === 4) {
  100. $fredMode = 0;
  101. $_SESSION[\'fred\'] = 0;
  102. }
  103. if ($fredMode === 1) {
  104. $_SESSION[\'fred\'] = 1;
  105. }
  106. $get = $_GET;
  107. unset($get[$modx->getOption(\'request_param_alias\', [], \'q\')]);
  108. if ($fredMode === 0) {
  109. $button = "<a href=\\"" . str_replace(\'&amp;\', \'&\', $modx->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(&quot;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&quot;); 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</a>";
  110. $modx->resource->_output = preg_replace(\'/(<\\/body>(?:<\\/body>)?)/i\', "{$button}\\r\\n$1", $modx->resource->_output);
  111. return;
  112. }
  113. if ($fredMode === 3) {
  114. $modx->resource->_output = \'\';
  115. return;
  116. }
  117. $html = Wa72\\HtmlPageDom\\HtmlPageCrawler::create($modx->resource->_output);
  118. $dzs = $html->filter(\'[data-fred-dropzone]\');
  119. $dzs->each(function(Wa72\\HtmlPageDom\\HtmlPageCrawler $node, $i) {
  120. $node->setInnerHtml(\'\');
  121. });
  122. $modx->resource->_output = $html->saveHTML();
  123. if ($fredMode === 2) {
  124. return;
  125. }
  126. $scripts = $html->filter(\'script\');
  127. $scripts->each(function(Wa72\\HtmlPageDom\\HtmlPageCrawler $node, $i) {
  128. $newNode = Wa72\\HtmlPageDom\\HtmlPageCrawler::create(\'<script-fred></script-fred>\');
  129. $attrs = $node->getNode(0)->attributes;
  130. foreach ($attrs as $attr) {
  131. $newNode->attr($attr->nodeName, $attr->nodeValue);
  132. }
  133. $newNode->setAttribute(\'data-fred-script\', $node->getInnerHtml());
  134. $node->replaceWith($newNode);
  135. });
  136. $modx->resource->_output = $html->saveHTML();
  137. $beforeRenderResults = $modx->invokeEvent(\'FredBeforeRender\');
  138. $includes = \'\';
  139. $beforeRender = \'\';
  140. $lexicons = [];
  141. foreach ($beforeRenderResults as $result) {
  142. if ($result[\'includes\']) {
  143. $includes .= $result[\'includes\'];
  144. }
  145. if ($result[\'beforeRender\']) {
  146. $beforeRender .= $result[\'beforeRender\'];
  147. }
  148. if ($result[\'lexicons\'] && is_array($result[\'lexicons\'])) {
  149. $lexicons = array_merge($lexicons, $result[\'lexicons\']);
  150. }
  151. }
  152. /** @var FredElementRTEConfig[] $rteConfigs */
  153. $rteConfigs = $modx->getIterator(\'FredElementRTEConfig\');
  154. $rteConfigString = [];
  155. foreach ($rteConfigs as $rteConfig) {
  156. if (empty($rteConfig->get(\'data\'))) continue;
  157. $rteConfigString[] = $rteConfig->name . \':\' . $rteConfig->data;
  158. }
  159. $rteConfigString = implode(\',\', $rteConfigString);
  160. $payload = [
  161. \'iss\' => $modx->user->id,
  162. \'resource\' => $modx->resource->id,
  163. \'context\' => $modx->resource->context_key,
  164. \'queryParams\' => $_GET
  165. ];
  166. $jwt = \\Firebase\\JWT\\JWT::encode($payload, $fred->getSecret());
  167. $fredContent = \'
  168. <script type="text/javascript" src="\' . $fred->getOption(\'webAssetsUrl\') . \'fred.min.js"></script>
  169. <link rel="stylesheet" href="\' . $fred->getOption(\'webAssetsUrl\') . \'fred.css" type="text/css" />
  170. \' . $includes . \'
  171. <script>
  172. var fred = new Fred({
  173. theme: \' . $theme->id . \',
  174. assetsUrl: "\' . $fred->getOption(\'webAssetsUrl\') . \'",
  175. managerUrl: "\' . MODX_MANAGER_URL . \'",
  176. fredOffUrl: "\' . str_replace(\'&amp;\', \'&\', $modx->makeUrl($modx->resource->id, \'\', array_merge($get, [\'fred\' => 4]) , \'abs\')) . \'",
  177. contextKey: "\' . $modx->resource->context_key. \'",
  178. launcherPosition: "\' . $fred->getOption(\'launcher_position\') . \'",
  179. iconEditor: "\' . $fred->getOption(\'icon_editor\') . \'",
  180. imageEditor: "\' . $fred->getOption(\'image_editor\') . \'",
  181. rte: "\' . $fred->getOption(\'rte\') . \'",
  182. rteConfig: {\' . $rteConfigString . \'},
  183. jwt: "\' . $jwt . \'",
  184. resource: {
  185. "id": \' . $modx->resource->id . \',
  186. "parent": \' . $modx->resource->parent . \',
  187. "previewUrl": "\' . str_replace(\'&amp;\', \'&\', $modx->makeUrl($modx->resource->id, \'\', array_merge($get, [\'fred\' => 2]) , \'abs\')) . \'",
  188. "emptyUrl": "\' . str_replace(\'&amp;\', \'&\', $modx->makeUrl($modx->resource->id, \'\', array_merge($get, [\'fred\' => 3]) , \'abs\')) . \'",
  189. "save": \' . (int)$modx->resource->checkPolicy(\'save\') . \',
  190. "delete": \' . (int)$modx->resource->checkPolicy(\'delete\') . \',
  191. "undelete": \' . (int)$modx->resource->checkPolicy(\'undelete\') . \',
  192. "publish": \' . (int)$modx->resource->checkPolicy(\'publish\') . \',
  193. "unpublish": \' . (int)$modx->resource->checkPolicy(\'unpublish\') . \',
  194. },
  195. permission: {
  196. "fred_settings": \' . (int)$modx->hasPermission(\'fred_settings\') . \',
  197. "fred_settings_advanced": \' . (int)$modx->hasPermission(\'fred_settings_advanced\') . \',
  198. "fred_settings_tags": \' . (int)$modx->hasPermission(\'fred_settings_tags\') . \',
  199. "fred_settings_tvs": \' . (int)$modx->hasPermission(\'fred_settings_tvs\') . \',
  200. "fred_elements": \' . (int)$modx->hasPermission(\'fred_elements\') . \',
  201. "fred_blueprints": \' . (int)$modx->hasPermission(\'fred_blueprints\') . \',
  202. "fred_element_screenshot": \' . (int)$modx->hasPermission(\'fred_element_screenshot\') . \',
  203. "fred_element_move": \' . (int)$modx->hasPermission(\'fred_element_move\') . \',
  204. "fred_element_delete": \' . (int)$modx->hasPermission(\'fred_element_delete\') . \',
  205. "fred_blueprint_categories_save": \' . (int)$modx->hasPermission(\'fred_blueprint_categories_save\') . \',
  206. "fred_blueprint_categories_create_public": \' . (int)$modx->hasPermission(\'fred_blueprint_categories_create_public\') . \',
  207. "fred_blueprints_save": \' . (int)$modx->hasPermission(\'fred_blueprints_save\') . \',
  208. "fred_blueprints_create_public": \' . (int)$modx->hasPermission(\'fred_blueprints_create_public\') . \',
  209. "save_document": \' . (int)$modx->hasPermission(\'save_document\') . \',
  210. "delete_document" : \' . (int)$modx->hasPermission(\'delete_document\') . \',
  211. "undelete_document" : \' . (int)$modx->hasPermission(\'undelete_document\') . \',
  212. "publish_document" : \' . (int)$modx->hasPermission(\'publish_document\') . \',
  213. "unpublish_document" : \' . (int)$modx->hasPermission(\'unpublish_document\') . \',
  214. "new_document" : \' . (int)$modx->hasPermission(\'new_document\') . \',
  215. "resource_duplicate" : \' . (int)$modx->hasPermission(\'resource_duplicate\') . \',
  216. "new_document_in_root" : \' . (int)$modx->hasPermission(\'new_document_in_root\') . \'
  217. },
  218. lexicons: \' . json_encode($lexicons) . \',
  219. beforeRender: function() {
  220. \' . $beforeRender . \'
  221. }
  222. });
  223. </script>\';
  224. $modx->resource->_output = preg_replace(\'/(<\\/head>(?:<\\/head>)?)/i\', "{$fredContent}\\r\\n$1", $modx->resource->_output);
  225. }
  226. break;
  227. case \'OnBeforeDocFormSave\':
  228. if ($mode !== \'upd\') return;
  229. if (empty($fred->getTheme($resource->template))) return;
  230. $data = $resource->getProperty(\'data\', \'fred\');
  231. if (!empty($data[\'fingerprint\'])) {
  232. if (empty($resource->fingerprint)) {
  233. $modx->event->_output = \'No fingerprint was provided.\';
  234. return;
  235. }
  236. if ($data[\'fingerprint\'] !== $resource->fingerprint) {
  237. $modx->event->_output = \'Your page is outdated, please reload the page.\';
  238. return;
  239. }
  240. }
  241. break;
  242. case \'OnDocFormSave\':
  243. if ($mode !== \'upd\') return;
  244. if (empty($fred->getTheme($resource->template))) return;
  245. $renderResource = new \\Fred\\RenderResource($resource, $modx);
  246. $renderResource->render();
  247. break;
  248. case \'OnTemplateRemove\':
  249. /** @var modTemplate $template */
  250. $templateId = $template->id;
  251. if (!empty($templateId)) {
  252. /** @var FredThemedTemplate $themedTemplate */
  253. $themedTemplate = $modx->getObject(\'FredThemedTemplate\', [\'template\' => $templateId]);
  254. if ($themedTemplate) {
  255. $themedTemplate->remove();
  256. }
  257. }
  258. break;
  259. case \'OnTVInputRenderList\':
  260. $modx->event->output($corePath . \'elements/tvs/input/\');
  261. break;
  262. case \'OnTVInputPropertiesList\':
  263. $modx->event->output($corePath . \'elements/tvs/input/options/\');
  264. break;
  265. case \'OnManagerPageBeforeRender\':
  266. $modx->controller->addLexiconTopic(\'fred:default\');
  267. break;
  268. }
  269. return;
  270. return;
  271. ';