Source of file SingleObjectAdmin.php
Size: 10,065 Bytes - Last Modified: 2021-12-23T10:02:21+00:00
/var/www/docs.ssmods.com/process/src/src/SingleObjectAdmin.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334 | <?php namespace LittleGiant\SingleObjectAdmin; use SilverStripe\Control\HTTPRequest; use SilverStripe\Forms\Form; use SilverStripe\Admin\AdminRootController; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\FieldType\DBHTMLText; use SilverStripe\ORM\ValidationResult; use SilverStripe\Security\Permission; use SilverStripe\Versioned\Versioned; use SilverStripe\Forms\HiddenField; use SilverStripe\CMS\Controllers\SilverStripeNavigator; use SilverStripe\Forms\LiteralField; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\FormAction; use SilverStripe\Control\Controller; use SilverStripe\Control\PjaxResponseNegotiator; use SilverStripe\ORM\ValidationException; use SilverStripe\Admin\LeftAndMain; use SilverStripe\Security\PermissionProvider; /** * Defines the Single Object Administration interface for the CMS * * @package SingleObjectAdmin * @author Jeremy Bridson with help from Stevie Mayhew */ class SingleObjectAdmin extends LeftAndMain implements PermissionProvider { private static $url_rule = '/$Action/$ID/$OtherID'; private static $menu_icon = 'littlegiant/silverstripe-singleobjectadmin:dist/images/singleobjectadmin.png'; private static $allowed_actions = [ 'EditForm' ]; /** * @config * @var array Allows developers to create adaptations to this plugin by giving a class name top-level uri access */ private static $plugins = []; public function canView($member = null) { return Permission::check("CMS_ACCESS_SingleObjectAdmin"); } public function providePermissions() { return [ "CMS_ACCESS_SingleObjectAdmin" => [ 'name' => "Access to Single Object Administration", 'category' => 'CMS Access', 'help' => 'Allow use of Single Object Administration' ] ]; } /** * @return DataObject */ public function getCurrentObject() { $objectClass = $this->config()->get('tree_class'); /** @var DataObject|Versioned $object */ $object = $objectClass::get()->first(); if ($object && $object->exists()) { return $object; } $currentStage = Versioned::get_stage(); Versioned::set_stage('Stage'); $object = $objectClass::create(); $object->write(); if ($objectClass::has_extension(Versioned::class)) { $object->publishRecursive(); } Versioned::set_stage($currentStage); return $object; } /** * @return FieldList */ public function getCMSActions() { $actions = new FieldList(FormAction::create('doSave', 'Save')->addExtraClass('btn-primary font-icon-save')); $this->extend('updateCMSActions', $actions); return $actions; } /** * @param null $id Not used. * @param null $fields Not used. * * @return Form */ public function getEditForm($id = null, $fields = null) { $object = $this->getCurrentObject(); $fields = $object->getCMSFields(); $fields->push(HiddenField::create('ID', 'ID', $object->ID)); $fields->push($navField = new LiteralField(SilverStripeNavigator::class, $this->getSilverStripeNavigator())); $navField->setAllowHTML(true); $actions = $this->getCMSActions(); $negotiator = $this->getResponseNegotiator(); // Retrieve validator, if one has been setup if ($object->hasMethod("getCMSValidator")) { $validator = $object->getCMSValidator(); } else { $validator = null; } $form = Form::create($this, 'EditForm', $fields, $actions, $validator)->setHTMLID('Form_EditForm'); $form->setValidationResponseCallback(function (ValidationResult $errors) use ($negotiator, $form) { $request = $this->getRequest(); if ($request->isAjax() && $negotiator) { $result = $form->forTemplate(); return $negotiator->respond($request, [ 'CurrentForm' => function () use ($result) { return $result; } ]); } }); $form->addExtraClass('flexbox-area-grow fill-height cms-content cms-edit-form'); $form->setAttribute('data-pjax-fragment', 'CurrentForm'); if ($form->Fields()->hasTabSet()) { $form->Fields()->findOrMakeTab('Root')->setTemplate('SilverStripe\\Forms\\CMSTabSet'); } $form->loadDataFrom($object); $form->setTemplate($this->getTemplatesWithSuffix('_EditForm')); // Use <button> to allow full jQuery UI styling $actions = $actions->dataFields(); if ($actions) { /** @var FormAction $action */ foreach ($actions as $action) { $action->setUseButtonTag(true); } } $this->extend('updateEditForm', $form); return $form; } public function EditForm($request = null) { return $this->getEditForm(); } /** * Used for preview controls, mainly links which switch between different states of the page. * * @return DBHTMLText|string */ public function getSilverStripeNavigator() { return $this->renderWith(SingleObjectAdmin::class . '_SilverStripeNavigator'); } /** * @return PjaxResponseNegotiator */ public function getResponseNegotiator() { $neg = parent::getResponseNegotiator(); $controller = $this; $neg->setCallback('CurrentForm', function () use (&$controller) { return $controller->renderWith(SingleObjectAdmin::class . '_Content'); }); return $neg; } /** * @param array $data * @param Form $form * * @return mixed */ public function doSave($data, $form) { $objectClass = $this->config()->get('tree_class'); /** @var DataObject|Versioned $object */ $object = $objectClass::get()->byID($data['ID']); $currentStage = Versioned::get_stage(); Versioned::set_stage('Stage'); $controller = Controller::curr(); if (!$object->canEdit()) { return $controller->httpError(403); } try { $form->saveInto($object); $object->write(); } catch (ValidationException $e) { $result = $e->getResult(); $form->loadMessagesFrom($result); $responseNegotiator = new PjaxResponseNegotiator([ 'CurrentForm' => function () use (&$form) { return $form->forTemplate(); }, 'default' => function () use (&$controller) { return $controller->redirectBack(); } ]); if ($controller->getRequest()->isAjax()) { $controller->getRequest()->addHeader('X-Pjax', 'CurrentForm'); } return $responseNegotiator->respond($controller->getRequest()); } Versioned::set_stage($currentStage); if ($objectClass::has_extension(Versioned::class)) { if ($object->isPublished()) { $this->publish($data, $form); } } $link = '"' . $object->singular_name() . '"'; $message = _t('GridFieldDetailForm.Saved', 'Saved {name} {link}', [ 'name' => $object->singular_name(), 'link' => $link ]); $form->sessionMessage($message, 'good'); $action = $this->edit(Controller::curr()->getRequest()); return $action; } /** * @param HTTPRequest $request * * @return DBHTMLText|string */ public function edit($request) { $controller = Controller::curr(); $form = $this->EditForm($request); $return = $this->customise([ 'Backlink' => $controller->hasMethod('Backlink') ? $controller->Backlink() : $controller->Link(), 'EditForm' => $form, ])->renderWith(SingleObjectAdmin::class . '_Content'); if ($request->isAjax()) { return $return; } return $controller->customise([ 'Content' => $return, ]); } /** * @param array $data * @param Form $form */ private function publish($data, $form) { $currentStage = Versioned::get_stage(); Versioned::set_stage('Stage'); $objectClass = $this->config()->get('tree_class'); /** @var DataObject|Versioned $object */ $object = $objectClass::get()->byID($data['ID']); if ($object) { $object->publishRecursive(); $form->sessionMessage($object->singular_name() . ' has been saved.', 'good'); } else { $form->sessionMessage('Something failed, please refresh your browser.', 'bad'); } Versioned::set_stage($currentStage); } /** * Overridden to avoid the BadMethodCallException exception when a url_segment is undefined * * @param string $action * * @return string * @throws \BadMethodCallException */ public function Link($action = null) { $allowedPlugins = $this->config()->get('plugins'); $allowedPlugins[] = SingleObjectAdmin::class; $this->extend('updateAllowedPlugins', $allowedPlugins); // LeftAndMain methods have a top-level uri access if (in_array(static::class, $allowedPlugins)) { $segment = ''; } else { // Get url_segment $segment = $this->config()->get('url_segment'); if (!$segment) { throw new \BadMethodCallException("SingleObjectAdmin subclasses must have url_segment"); } } $link = Controller::join_links(AdminRootController::admin_url(), $segment, '/', "$action"); $this->extend('updateLink', $link); return $link; } } |