Source of file VisualEditor.php
Size: 13,078 Bytes - Last Modified: 2021-12-23T10:59:17+00:00
/var/www/docs.ssmods.com/process/src/code/admin/VisualEditor.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 | <?php /** * Created by PhpStorm. * User: Conrad * Date: 5/07/2016 * Time: 3:26 PM */ class VisualEditor extends LeftAndMain implements PermissionProvider { private static $url_segment = 'content-modules/visual-editor'; private static $menu_title = 'Visual Editor'; private static $url_priority = 41; private static $url_rule = '/$Action/$ID/$OtherID'; private static $menu_priority = -100; private static $tree_class = 'SiteTree'; private static $session_namespace = 'VisualEditor'; private static $allowed_actions = array( 'edit', 'EditPageForm', 'EditSettingsForm', 'page', 'publishPage', 'publishSettings', 'savePage', 'saveSettings', 'settings', 'SiteTreeForm' ); public function init() { parent::init(); //hack to set locale, cms sets Locale instead of locale, //has to be after init, as TranslatableCMSMainExtension changes locale if (class_exists('Translatable') && ($locale = $this->getRequest()->getVar('Locale'))) { Translatable::set_current_locale($locale); } Requirements::css(INPAGE_MODULES_DIR . '/css/VisualEditor.css'); Requirements::combine_files('VisualEditor.js', [ INPAGE_MODULES_DIR . '/javascript/VisualEditor.js', INPAGE_MODULES_DIR . '/javascript/VisualEditor.Preview.js', INPAGE_MODULES_DIR . '/javascript/VisualEditor.ToolBox.js', INPAGE_MODULES_DIR . '/javascript/VisualEditor.Form.js', INPAGE_MODULES_DIR . '/javascript/VisualEditor.ModuleManager.js' ]); //todo, get fontawesome css Requirements::javascript('https://use.fontawesome.com/99eadabf1d.js'); Versioned::reading_stage("Stage"); //lets see if this works - we want to include js from CMSMain //not sure why we needed this, but it plays havoc with the translations // singleton('CMSMain')->init(); } /** * @param SS_HTTPRequest $request * @return SS_HTTPResponse */ public function edit($request) { if ($id = $request->param('ID')) { $this->setCurrentPageID($id); } return $this->getResponseNegotiator()->respond($request); } private $_currentPage = null; public function getCurrentPage($id = null) { $record = $this->currentPage(); //translations //todo put this in extension or somethine so it's not hardcoded if (!empty($record->Locale)) { if (class_exists('Translatable')) { Translatable::set_current_locale($record->Locale); } } return $record; } public function getEditForm($id = null, $fields = null) { if (!$id) { $id = $this->getRequest()->param('ID'); } $fields = FieldList::create(); $actions = FieldList::create(); $fields->push(HiddenField::create('ID')->setValue($id)); return Form::create($this, 'EditForm', $fields, $actions); } public function EditPageForm() { return $this->getEditPageForm(); } public function getEditPageForm($id = null, $fields = null) { if (!$id) { $id = $this->getRequest()->requestVar('ID'); } $page = $this->getCurrentPage($id); //grab tab Root.Main from page $mainFields = $page->getCMSFields()->fieldByName('Root.Main'); //remove visual editor link if it's there if ($mainFields->fieldByName('VisualEditorLink')) { $mainFields->removeByName('VisualEditorLink'); } $fields = FieldList::create( TabSet::create('Root', Tab::create('Main', $mainFields ) ) ); $actions = FieldList::create( FormAction::create('savePage', 'Save') ->addExtraClass('save')->setAttribute('data-icon', 'disk') ->setUseButtonTag(true), FormAction::create('publishPage', 'Publish') ->addExtraClass('publish') ->setAttribute('data-icon', 'accept') ->setUseButtonTag(true) ); //add in fields for stages etc from CMSMain - hopefully gets url segment working $deletedFromStage = $page->getIsDeletedFromStage(); $deleteFromLive = !$page->getExistsOnLive(); $fields->push($idField = new HiddenField("ID", false, $id)); // Necessary for different subsites $fields->push($liveLinkField = new HiddenField("AbsoluteLink", false, $page->AbsoluteLink())); $fields->push($liveLinkField = new HiddenField("LiveLink")); $fields->push($stageLinkField = new HiddenField("StageLink")); $fields->push(new HiddenField("TreeTitle", false, $page->TreeTitle)); if ($page->ID && is_numeric($page->ID)) { $liveLink = $page->getAbsoluteLiveLink(); if ($liveLink) { $liveLinkField->setValue($liveLink); } if (!$deletedFromStage) { $stageLink = Controller::join_links($page->AbsoluteLink(), '?stage=Stage'); if ($stageLink) { $stageLinkField->setValue($stageLink); } } } $form = Form::create($this, 'EditPageForm', $fields, $actions); $form ->loadDataFrom($page) ->setTemplate('VisualEditor_EditForm') ->addExtraClass('cms-edit-form cms-content'); return $form; } public function savePage($data, $form) { $record = $this->CurrentPage($data['ID']); if ($record && !$record->canEdit()) { return Security::permissionFailure($this); } if (!$record || !$record->ID) { throw new SS_HTTPResponse_Exception("Bad record ID #{$data['ID']}", 404); } $form->saveInto($record); $record->write(); return ContentModuleUtilities::json_response(array( 'Status' => 1, 'Message' => 'Page ' . $record->Title . ' saved', 'Content' => $this->page()->forTemplate() )); } public function publishPage($data, $form) { $record = $this->CurrentPage($data['ID']); if ($record && !$record->canEdit()) { return Security::permissionFailure($this); } if (!$record || !$record->ID) { throw new SS_HTTPResponse_Exception("Bad record ID #{$data['ID']}", 404); } $form->saveInto($record); $record->write(); $record->doPublish(); return ContentModuleUtilities::json_response(array( 'Status' => 1, 'Message' => 'Page ' . $record->Title . ' published', 'Content' => $this->page()->forTemplate() )); } public function page() { if (!$this->CurrentPage()->canEdit()) { return Security::permissionFailure($this); } return $this->getEditPageForm()->forTemplate(); } public function EditSettingsForm() { return $this->getEditSettingsForm(); } public function getEditSettingsForm($id = null, $fields = null) { if (!$id) { $id = $this->getRequest()->requestVar('ID'); } $page = $this->getCurrentPage($id); $fields = FieldList::create( TabSet::create('Root', Tab::create('Settings', $page->getSettingsFields()->fieldByName('Root.Settings') )) ); $actions = FieldList::create( FormAction::create('saveSettings', 'Save') ->addExtraClass('save')->setAttribute('data-icon', 'disk') ->setUseButtonTag(true), FormAction::create('publishSettings', 'Publish') ->addExtraClass('publish') ->setAttribute('data-icon', 'accept') ->setUseButtonTag(true) ); $fields->push(HiddenField::create('ID')->setValue($id)); $form = Form::create($this, 'EditSettingsForm', $fields, $actions); $form ->loadDataFrom($page) ->setTemplate('VisualEditor_EditForm') ->addExtraClass('cms-edit-form cms-content'); return $form; } public function saveSettings($data, $form) { $record = $this->CurrentPage($data['ID']); if ($record && !$record->canEdit()) { return Security::permissionFailure($this); } if (!$record || !$record->ID) { throw new SS_HTTPResponse_Exception("Bad record ID #{$data['ID']}", 404); } $form->saveInto($record); $record->write(); return ContentModuleUtilities::json_response(array( 'Status' => 1, 'Message' => 'Page ' . $record->Title . ' saved', 'Content' => $this->settings()->forTemplate() )); } public function publishSettings($data, $form) { $record = $this->CurrentPage($data['ID']); if ($record && !$record->canEdit()) { return Security::permissionFailure($this); } if (!$record || !$record->ID) { throw new SS_HTTPResponse_Exception("Bad record ID #{$data['ID']}", 404); } $form->saveInto($record); $record->write(); $record->doPublish(); return ContentModuleUtilities::json_response(array( 'Status' => 1, 'Message' => 'Page ' . $record->Title . ' published', 'Content' => $this->settings()->forTemplate() )); } public function settings() { if (!$this->CurrentPage()->canEdit()) { return Security::permissionFailure($this); } return $this->getEditSettingsForm()->forTemplate(); } public function SiteTreeForm() { $fields = FieldList::create( TreeDropdownField::create('SiteTreeID', '', 'SiteTree')->setValue($this->currentPageID()) ); $actions = FieldList::create(); return Form::create($this, 'SiteTreeForm', $fields, $actions)->addExtraClass('site-tree-form'); } public function PageEditLink() { return Controller::join_links(singleton('CMSPageEditController')->Link('show'), $this->CurrentPage()->ID); } /** * Caution: Volatile API. * * @return PjaxResponseNegotiator */ public function getResponseNegotiator() { if (!$this->responseNegotiator) { $controller = $this; $this->responseNegotiator = new PjaxResponseNegotiator( array( 'CurrentForm' => function () use (&$controller) { return $controller->getEditForm()->forTemplate(); }, 'Content' => function () use (&$controller) { return $controller->renderWith($controller->getTemplatesWithSuffix('_Content')); }, 'default' => function () use (&$controller) { return $controller->renderWith($controller->getViewer('edit')); } ), $this->getResponse() ); } return $this->responseNegotiator; } public function getSilverStripeNavigator() { $page = $this->currentPage(); if ($page) { $navigator = new VisualEditorSilverStripeNavigator($page); return $navigator->renderWith($this->getTemplatesWithSuffix('_SilverStripeNavigator')); } else { return false; } } public function providePermissions() { return array( "CMS_ACCESS_VisualEditor" => array( 'name' => _t('VisualEditor.ACCESS', "Access to '{title}' section", array('title' => 'Content Module Page Editor')), 'category' => _t('Permission.CMS_ACCESS_CATEGORY', 'CMS Access'), 'help' => _t( 'VisualEditor.ACCESS_HELP', 'Allow using the page editor for modules.' ), 'sort' => -99 // below "CMS_ACCESS_LeftAndMain", but above everything else ) ); } public function Link($action = null, $id = null, $otherID = null, $otherParam = null) { // Handle missing url_segments if($this->config()->url_segment) { $segment = $this->config()->get('url_segment', Config::FIRST_SET); } else { $segment = $this->class; }; $link = Controller::join_links( $this->stat('url_base', true), $segment, '/', // trailing slash needed if $action is null! "$action", $id, $otherID, $otherParam ); $this->extend('updateLink', $link); return $link; } } |