diff --git a/code/controllers/AssetAdmin.php b/code/controllers/AssetAdmin.php index 57f875c1..ab2ea92b 100644 --- a/code/controllers/AssetAdmin.php +++ b/code/controllers/AssetAdmin.php @@ -328,21 +328,23 @@ JS } public function AddForm() { - $form = parent::AddForm(); $folder = singleton('Folder'); - - $form->Actions()->fieldByName('action_doAdd') - ->setTitle(_t('AssetAdmin.ActionAdd', 'Add folder')) - ->setAttribute('data-icon', 'accept'); - - $fields = $folder->getCMSFields(); - $fields->replaceField('Name', new TextField("Name", _t('File.Name'))); - $fields->dataFieldByName('ParentID')->setValue($this->request->getVar('ParentID')); - $form->setFields($fields); - + $form = new Form( + $this, + 'AddForm', + new FieldList( + new TextField("Name", _t('File.Name')), + new HiddenField('ParentID', false, $this->request->getVar('ParentID')) + ), + new FieldList( + FormAction::create('doAdd', _t('AssetAdmin_left.ss.GO','Go')) + ->addExtraClass('ss-ui-action-constructive')->setAttribute('data-icon', 'accept') + ->setTitle(_t('AssetAdmin.ActionAdd', 'Add folder')) + ) + ); $form->setTemplate($this->getTemplatesWithSuffix('_EditForm')); // TODO Can't merge $FormAttributes in template at the moment - $form->addExtraClass('cms-add-form cms-edit-form cms-panel-padded center ' . $this->BaseCSSClasses()); + $form->addExtraClass('add-form cms-add-form cms-edit-form cms-panel-padded center ' . $this->BaseCSSClasses()); return $form; } diff --git a/code/controllers/CMSMain.php b/code/controllers/CMSMain.php index d1ed8651..65fbdb13 100644 --- a/code/controllers/CMSMain.php +++ b/code/controllers/CMSMain.php @@ -28,7 +28,6 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr static $subitem_class = "Member"; static $allowed_actions = array( - 'addpage', 'buildbrokenlinks', 'deleteitems', 'DeleteItemsForm', @@ -40,7 +39,6 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr 'PublishItemsForm', 'submit', 'EditForm', - 'AddForm', 'SearchForm', 'SiteTreeAsUL', 'getshowdeletedsubtree', @@ -372,23 +370,6 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr return $result; } - /** - * Save the current sites {@link SiteConfig} into the database - * - * @param array $data - * @param Form $form - * @return FormResponse - */ - function save_siteconfig($data, $form) { - $siteConfig = SiteConfig::current_site_config(); - $form->saveInto($siteConfig); - $siteConfig->write(); - - $this->response->addHeader('X-Status', _t('LeftAndMain.SAVEDUP')); - - return $form->forTemplate(); - } - /** * Get a database record to be managed by the CMS. * @@ -618,51 +599,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr return $form->forTemplate(); } - public function doAdd($data, $form) { - $className = isset($data['PageType']) ? $data['PageType'] : "Page"; - $parentMode = isset($data['ParentModeField']) ? $data['ParentModeField'] : "top"; - $parentID = isset($data['ParentID']) ? (int)$data['ParentID'] : 0; - - if ($parentMode == "top") $parentID = 0; - - $suffix = isset($data['Suffix']) ? "-" . $data['Suffix'] : null; - - if(!$parentID && isset($data['Parent'])) { - $page = SiteTree:: get_by_link(Convert::raw2sql($data['Parent'])); - if($page) $parentID = $page->ID; - } - - if(is_numeric($parentID) && $parentID > 0) $parentObj = DataObject::get_by_id("SiteTree", $parentID); - else $parentObj = null; - - if(!$parentObj || !$parentObj->ID) $parentID = 0; - - if($parentObj) { - if(!$parentObj->canAddChildren()) return Security::permissionFailure($this); - if(!singleton($className)->canCreate()) return Security::permissionFailure($this); - } else { - if(!SiteConfig::current_site_config()->canCreateTopLevel()) - return Security::permissionFailure($this); - } - - $record = $this->getNewItem("new-$className-$parentID".$suffix, false); - if(class_exists('Translatable') && $record->hasExtension('Translatable')) $record->Locale = $data['Locale']; - $record->write(); - - $form = $this->getEditForm($record->ID); - - $link = Controller::join_links(singleton('CMSPageEditController')->Link('show'), $record->ID); - $this->getResponse()->addHeader('X-ControllerURL', $link); - - if(isset($data['returnID'])) { - return $record->ID; - } else if(Director::is_ajax()) { - $form = $this->getEditForm($record->ID); - return $form->forTemplate(); - } else { - return $this->redirect($link); - } - } + /** * @uses LeftAndMainExtension->augmentNewSiteTreeItem() @@ -938,77 +875,6 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr } } - /** - * @return Form - */ - function AddForm() { - $record = $this->currentPage(); - - $pageTypes = array(); - foreach($this->PageTypes() as $type) { - $html = sprintf('%s%s', - $type->getField('ClassName'), - $type->getField('AddAction'), - $type->getField('Description') - ); - $pageTypes[$type->getField('ClassName')] = $html; - } - // Ensure generic page type shows on top - if(isset($pageTypes['Page'])) { - $pageTitle = $pageTypes['Page']; - $pageTypes = array_merge(array('Page' => $pageTitle), $pageTypes); - } - - $numericLabelTmpl = '%d%s'; - $fields = new FieldList( - // new HiddenField("ParentID", false, ($this->parentRecord) ? $this->parentRecord->ID : null), - // TODO Should be part of the form attribute, but not possible in current form API - $hintsField = new LiteralField('Hints', sprintf('', $this->SiteTreeHints())), - new LiteralField('PageModeHeader', sprintf($numericLabelTmpl, 1, _t('CMSMain.ChoosePageParentMode', 'Choose where to create this page'))), - $parentModeField = new SelectionGroup( - "ParentModeField", - array( - "top//Top level" => null, //new LiteralField("Dummy", ''), - "child//Under another page" => $parentField = new TreeDropdownField( - "ParentID", - "", - 'SiteTree' - ) - ) - ), - $typeField = new OptionsetField( - "PageType", - sprintf($numericLabelTmpl, 2, _t('CMSMain.ChoosePageType', 'Choose page type')), - $pageTypes, - 'Page' - ) - ); - $parentField->setShowSearch(true); - - $parentModeField->setValue("child"); - - // CMSMain->currentPageID() automatically sets the homepage, - // which we need to counteract in the default selection (which should default to root, ID=0) - $homepageSegment = RootURLController::get_homepage_link(); - if($record && $record->URLSegment != $homepageSegment) { - $parentField->setValue($record->ID); - } - - $actions = new FieldList( - // $resetAction = new ResetFormAction('doCancel', _t('CMSMain.Cancel', 'Cancel')), - FormAction::create("doAdd", _t('CMSMain.Create',"Create")) - ->addExtraClass('ss-ui-action-constructive')->setAttribute('data-icon', 'accept') - ->setUseButtonTag(true) - ); - - $this->extend('updatePageOptions', $fields); - - $form = new Form($this, "AddForm", $fields, $actions); - $form->addExtraClass('cms-add-form stacked'); - - return $form; - } - function publishall($request) { if(!Permission::check('ADMIN')) return Security::permissionFailure($this); diff --git a/code/controllers/CMSPageAddController.php b/code/controllers/CMSPageAddController.php index 46c40f35..6773f39e 100644 --- a/code/controllers/CMSPageAddController.php +++ b/code/controllers/CMSPageAddController.php @@ -6,23 +6,129 @@ class CMSPageAddController extends CMSMain { static $url_priority = 42; static $menu_title = 'Add page'; static $required_permission_codes = 'CMS_ACCESS_CMSMain'; - - function AddForm() { - $form = parent::AddForm(); - $form->addExtraClass('cms-content center cms-edit-form ' . $this->BaseCSSClasses()); + static $allowed_actions = array( + 'AddForm' + ); + + /** + * @return Form + */ + function AddForm() { + $record = $this->currentPage(); + + $pageTypes = array(); + foreach($this->PageTypes() as $type) { + $html = sprintf('%s%s', + $type->getField('ClassName'), + $type->getField('AddAction'), + $type->getField('Description') + ); + $pageTypes[$type->getField('ClassName')] = $html; + } + // Ensure generic page type shows on top + if(isset($pageTypes['Page'])) { + $pageTitle = $pageTypes['Page']; + $pageTypes = array_merge(array('Page' => $pageTitle), $pageTypes); + } + + $numericLabelTmpl = '%d%s'; + $fields = new FieldList( + // new HiddenField("ParentID", false, ($this->parentRecord) ? $this->parentRecord->ID : null), + // TODO Should be part of the form attribute, but not possible in current form API + $hintsField = new LiteralField('Hints', sprintf('', $this->SiteTreeHints())), + new LiteralField('PageModeHeader', sprintf($numericLabelTmpl, 1, _t('CMSMain.ChoosePageParentMode', 'Choose where to create this page'))), + $parentModeField = new SelectionGroup( + "ParentModeField", + array( + "top//Top level" => null, //new LiteralField("Dummy", ''), + "child//Under another page" => $parentField = new TreeDropdownField( + "ParentID", + "", + 'SiteTree' + ) + ) + ), + $typeField = new OptionsetField( + "PageType", + sprintf($numericLabelTmpl, 2, _t('CMSMain.ChoosePageType', 'Choose page type')), + $pageTypes, + 'Page' + ) + ); + $parentField->setShowSearch(true); + + $parentModeField->setValue("child"); + + // CMSMain->currentPageID() automatically sets the homepage, + // which we need to counteract in the default selection (which should default to root, ID=0) + $homepageSegment = RootURLController::get_homepage_link(); + if($record && $record->URLSegment != $homepageSegment) { + $parentField->setValue($record->ID); + } + + $actions = new FieldList( + // $resetAction = new ResetFormAction('doCancel', _t('CMSMain.Cancel', 'Cancel')), + FormAction::create("doAdd", _t('CMSMain.Create',"Create")) + ->addExtraClass('ss-ui-action-constructive')->setAttribute('data-icon', 'accept') + ->setUseButtonTag(true) + ); + + $this->extend('updatePageOptions', $fields); + + $form = new Form($this, "AddForm", $fields, $actions); + $form->addExtraClass('cms-add-form stacked cms-content center cms-edit-form ' . $this->BaseCSSClasses()); $form->setTemplate($this->getTemplatesWithSuffix('_EditForm')); + if($parentID = $this->request->getVar('ParentID')) { $form->Fields()->dataFieldByName('ParentID')->setValue((int)$parentID); } - + return $form; } - function doAdd($data, $form) { - $return = parent::doAdd($data, $form); - $this->getResponse()->addHeader('X-Controller', 'CMSPageEditController'); - return $return; + public function doAdd($data, $form) { + $className = isset($data['PageType']) ? $data['PageType'] : "Page"; + $parentMode = isset($data['ParentModeField']) ? $data['ParentModeField'] : "top"; + $parentID = isset($data['ParentID']) ? (int)$data['ParentID'] : 0; + + if ($parentMode == "top") $parentID = 0; + + $suffix = isset($data['Suffix']) ? "-" . $data['Suffix'] : null; + + if(!$parentID && isset($data['Parent'])) { + $page = SiteTree:: get_by_link(Convert::raw2sql($data['Parent'])); + if($page) $parentID = $page->ID; + } + + if(is_numeric($parentID) && $parentID > 0) $parentObj = DataObject::get_by_id("SiteTree", $parentID); + else $parentObj = null; + + if(!$parentObj || !$parentObj->ID) $parentID = 0; + + if($parentObj) { + if(!$parentObj->canAddChildren()) return Security::permissionFailure($this); + if(!singleton($className)->canCreate()) return Security::permissionFailure($this); + } else { + if(!SiteConfig::current_site_config()->canCreateTopLevel()) + return Security::permissionFailure($this); + } + + $record = $this->getNewItem("new-$className-$parentID".$suffix, false); + if(class_exists('Translatable') && $record->hasExtension('Translatable')) $record->Locale = $data['Locale']; + $record->write(); + + $form = $this->getEditForm($record->ID); + + $link = Controller::join_links(singleton('CMSPageEditController')->Link('show'), $record->ID); + $this->getResponse()->addHeader('X-ControllerURL', $link); + + if(Director::is_ajax()) { + $form = $this->getEditForm($record->ID); + return $form->forTemplate(); + } else { + return $this->redirect($link); + } } } \ No newline at end of file diff --git a/code/controllers/CMSSettingsController.php b/code/controllers/CMSSettingsController.php index d9010792..b73dbb7c 100644 --- a/code/controllers/CMSSettingsController.php +++ b/code/controllers/CMSSettingsController.php @@ -32,6 +32,23 @@ class CMSSettingsController extends CMSMain { return $form; } + + /** + * Save the current sites {@link SiteConfig} into the database + * + * @param array $data + * @param Form $form + * @return String + */ + function save_siteconfig($data, $form) { + $siteConfig = SiteConfig::current_site_config(); + $form->saveInto($siteConfig); + $siteConfig->write(); + + $this->response->addHeader('X-Status', _t('LeftAndMain.SAVEDUP')); + + return $form->forTemplate(); + } function PreviewLink() { return false; diff --git a/tests/controller/CMSMainTest.php b/tests/controller/CMSMainTest.php index 05fbf2cd..8233850e 100644 --- a/tests/controller/CMSMainTest.php +++ b/tests/controller/CMSMainTest.php @@ -198,9 +198,9 @@ class CMSMainTest extends FunctionalTest { // with insufficient permissions $cmsUser->logIn(); - $this->get('admin/pages'); + $this->get('admin/page/add'); $response = $this->post( - 'admin/pages/AddForm', + 'admin/page/add/AddForm', array('ParentID' => '0', 'ClassName' => 'Page', 'Locale' => 'en_US', 'action_doAdd' => 1) ); // should redirect, which is a permission error @@ -208,10 +208,10 @@ class CMSMainTest extends FunctionalTest { // with correct permissions $rootEditUser->logIn(); - $response = $this->get('admin/pages/'); + $response = $this->get('admin/page/add'); $response = $this->post( - 'admin/pages/AddForm', + 'admin/page/add/AddForm', array('ParentID' => '0', 'ClassName' => 'Page', 'Locale' => 'en_US', 'action_doAdd' => 1) );