mirror of
https://github.com/silverstripe/silverstripe-cms
synced 2024-10-22 08:05:56 +02:00
Merge pull request #1410 from open-sausages/features/form-schema
Form Schema
This commit is contained in:
commit
a737f9c901
@ -294,6 +294,20 @@ class AssetAdmin extends LeftAndMain implements PermissionProvider{
|
|||||||
$form->setAttribute('data-pjax-fragment', 'CurrentForm');
|
$form->setAttribute('data-pjax-fragment', 'CurrentForm');
|
||||||
$form->Fields()->findOrMakeTab('Root')->setTemplate('CMSTabSet');
|
$form->Fields()->findOrMakeTab('Root')->setTemplate('CMSTabSet');
|
||||||
|
|
||||||
|
// Optionally handle form submissions with 'X-Formschema-Request'
|
||||||
|
// which rely on having validation errors returned as structured data
|
||||||
|
$form->setValidationResponseCallback(function() use ($form) {
|
||||||
|
$request = $this->getRequest();
|
||||||
|
if($request->getHeader('X-Formschema-Request')) {
|
||||||
|
$data = $this->getSchemaForForm($form);
|
||||||
|
$response = new SS_HTTPResponse(Convert::raw2json($data));
|
||||||
|
$response->addHeader('Content-Type', 'application/json');
|
||||||
|
return $response;
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
$this->extend('updateEditForm', $form);
|
$this->extend('updateEditForm', $form);
|
||||||
|
|
||||||
return $form;
|
return $form;
|
||||||
@ -417,7 +431,8 @@ class AssetAdmin extends LeftAndMain implements PermissionProvider{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function AddForm() {
|
public function AddForm() {
|
||||||
$form = CMSForm::create(
|
$negotiator = $this->getResponseNegotiator();
|
||||||
|
$form = Form::create(
|
||||||
$this,
|
$this,
|
||||||
'AddForm',
|
'AddForm',
|
||||||
new FieldList(
|
new FieldList(
|
||||||
@ -430,7 +445,19 @@ class AssetAdmin extends LeftAndMain implements PermissionProvider{
|
|||||||
->setTitle(_t('AssetAdmin.ActionAdd', 'Add folder'))
|
->setTitle(_t('AssetAdmin.ActionAdd', 'Add folder'))
|
||||||
)
|
)
|
||||||
)->setHTMLID('Form_AddForm');
|
)->setHTMLID('Form_AddForm');
|
||||||
$form->setResponseNegotiator($this->getResponseNegotiator());
|
$form->setValidationResponseCallback(function() use ($negotiator, $form) {
|
||||||
|
$request = $this->getRequest();
|
||||||
|
if($request->isAjax() && $negotiator) {
|
||||||
|
$form->setupFormErrors();
|
||||||
|
$result = $form->forTemplate();
|
||||||
|
|
||||||
|
return $negotiator->respond($request, array(
|
||||||
|
'CurrentForm' => function() use($result) {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
));
|
||||||
|
}
|
||||||
|
});
|
||||||
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
|
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
|
||||||
// TODO Can't merge $FormAttributes in template at the moment
|
// TODO Can't merge $FormAttributes in template at the moment
|
||||||
$form->addExtraClass('add-form 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());
|
||||||
|
@ -588,7 +588,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
|||||||
/**
|
/**
|
||||||
* @param int $id
|
* @param int $id
|
||||||
* @param FieldList $fields
|
* @param FieldList $fields
|
||||||
* @return CMSForm
|
* @return Form
|
||||||
*/
|
*/
|
||||||
public function getEditForm($id = null, $fields = null) {
|
public function getEditForm($id = null, $fields = null) {
|
||||||
if(!$id) $id = $this->currentPageID();
|
if(!$id) $id = $this->currentPageID();
|
||||||
@ -656,18 +656,8 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
|||||||
$validator = new RequiredFields();
|
$validator = new RequiredFields();
|
||||||
}
|
}
|
||||||
|
|
||||||
$form = CMSForm::create(
|
|
||||||
$this, "EditForm", $fields, $actions, $validator
|
|
||||||
)->setHTMLID('Form_EditForm');
|
|
||||||
$form->setResponseNegotiator($this->getResponseNegotiator());
|
|
||||||
$form->loadDataFrom($record);
|
|
||||||
$form->disableDefaultAction();
|
|
||||||
$form->addExtraClass('cms-edit-form');
|
|
||||||
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
|
|
||||||
// TODO Can't merge $FormAttributes in template at the moment
|
// TODO Can't merge $FormAttributes in template at the moment
|
||||||
$form->addExtraClass('center ' . $this->BaseCSSClasses());
|
$form->addExtraClass('center ' . $this->BaseCSSClasses());
|
||||||
// if($form->Fields()->hasTabset()) $form->Fields()->findOrMakeTab('Root')->setTemplate('CMSTabSet');
|
|
||||||
$form->setAttribute('data-pjax-fragment', 'CurrentForm');
|
|
||||||
// Set validation exemptions for specific actions
|
// Set validation exemptions for specific actions
|
||||||
$form->setValidationExemptActions(array('restore', 'revert', 'deletefromlive', 'delete', 'unpublish', 'rollback', 'doRollback'));
|
$form->setValidationExemptActions(array('restore', 'revert', 'deletefromlive', 'delete', 'unpublish', 'rollback', 'doRollback'));
|
||||||
|
|
||||||
@ -684,10 +674,9 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
|||||||
$this->extend('updateEditForm', $form);
|
$this->extend('updateEditForm', $form);
|
||||||
return $form;
|
return $form;
|
||||||
} else if($id) {
|
} else if($id) {
|
||||||
$form = CMSForm::create( $this, "EditForm", new FieldList(
|
$form = Form::create( $this, "EditForm", new FieldList(
|
||||||
new LabelField('PageDoesntExistLabel',_t('CMSMain.PAGENOTEXISTS',"This page doesn't exist"))), new FieldList()
|
new LabelField('PageDoesntExistLabel',_t('CMSMain.PAGENOTEXISTS',"This page doesn't exist"))), new FieldList()
|
||||||
)->setHTMLID('Form_EditForm');
|
)->setHTMLID('Form_EditForm');
|
||||||
$form->setResponseNegotiator($this->getResponseNegotiator());
|
|
||||||
return $form;
|
return $form;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -842,14 +831,27 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
|||||||
}
|
}
|
||||||
));
|
));
|
||||||
|
|
||||||
$listview = CMSForm::create(
|
$negotiator = $this->getResponseNegotiator();
|
||||||
|
$listview = Form::create(
|
||||||
$this,
|
$this,
|
||||||
'ListViewForm',
|
'ListViewForm',
|
||||||
new FieldList($gridField),
|
new FieldList($gridField),
|
||||||
new FieldList()
|
new FieldList()
|
||||||
)->setHTMLID('Form_ListViewForm');
|
)->setHTMLID('Form_ListViewForm');
|
||||||
$listview->setAttribute('data-pjax-fragment', 'ListViewForm');
|
$listview->setAttribute('data-pjax-fragment', 'ListViewForm');
|
||||||
$listview->setResponseNegotiator($this->getResponseNegotiator());
|
$listview->setValidationResponseCallback(function() use ($negotiator, $listview) {
|
||||||
|
$request = $this->getRequest();
|
||||||
|
if($request->isAjax() && $negotiator) {
|
||||||
|
$listview->setupFormErrors();
|
||||||
|
$result = $listview->forTemplate();
|
||||||
|
|
||||||
|
return $negotiator->respond($request, array(
|
||||||
|
'CurrentForm' => function() use($result) {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
$this->extend('updateListView', $listview);
|
$this->extend('updateListView', $listview);
|
||||||
|
|
||||||
|
@ -113,14 +113,26 @@ class CMSPageAddController extends CMSPageEditController {
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->extend('updatePageOptions', $fields);
|
$this->extend('updatePageOptions', $fields);
|
||||||
|
|
||||||
$form = CMSForm::create(
|
$negotiator = $this->getResponseNegotiator();
|
||||||
|
$form = Form::create(
|
||||||
$this, "AddForm", $fields, $actions
|
$this, "AddForm", $fields, $actions
|
||||||
)->setHTMLID('Form_AddForm');
|
)->setHTMLID('Form_AddForm');
|
||||||
$form->setAttribute('data-hints', $this->SiteTreeHints());
|
$form->setAttribute('data-hints', $this->SiteTreeHints());
|
||||||
$form->setAttribute('data-childfilter', $this->Link('childfilter'));
|
$form->setAttribute('data-childfilter', $this->Link('childfilter'));
|
||||||
|
$form->setValidationResponseCallback(function() use ($negotiator, $form) {
|
||||||
|
$request = $this->getRequest();
|
||||||
|
if($request->isAjax() && $negotiator) {
|
||||||
|
$this->setupFormErrors();
|
||||||
|
$result = $this->forTemplate();
|
||||||
|
|
||||||
$form->setResponseNegotiator($this->getResponseNegotiator());
|
return $negotiator->respond($request, array(
|
||||||
|
'CurrentForm' => function() use($result) {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
));
|
||||||
|
}
|
||||||
|
});
|
||||||
$form->addExtraClass('cms-add-form stacked cms-content center cms-edit-form ' . $this->BaseCSSClasses());
|
$form->addExtraClass('cms-add-form stacked cms-content center cms-edit-form ' . $this->BaseCSSClasses());
|
||||||
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
|
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
|
||||||
|
|
||||||
|
@ -253,13 +253,13 @@ class CMSPageHistoryController extends CMSMain {
|
|||||||
// Use <button> to allow full jQuery UI styling
|
// Use <button> to allow full jQuery UI styling
|
||||||
foreach($actions->dataFields() as $action) $action->setUseButtonTag(true);
|
foreach($actions->dataFields() as $action) $action->setUseButtonTag(true);
|
||||||
|
|
||||||
$form = CMSForm::create(
|
$negotiator = $this->getResponseNegotiator();
|
||||||
|
$form = Form::create(
|
||||||
$this,
|
$this,
|
||||||
'VersionsForm',
|
'VersionsForm',
|
||||||
$fields,
|
$fields,
|
||||||
$actions
|
$actions
|
||||||
)->setHTMLID('Form_VersionsForm');
|
)->setHTMLID('Form_VersionsForm');
|
||||||
$form->setResponseNegotiator($this->getResponseNegotiator());
|
|
||||||
$form->loadDataFrom($this->getRequest()->requestVars());
|
$form->loadDataFrom($this->getRequest()->requestVars());
|
||||||
$hiddenID->setValue($id);
|
$hiddenID->setValue($id);
|
||||||
$form->unsetValidator();
|
$form->unsetValidator();
|
||||||
|
@ -522,7 +522,7 @@ class CMSMainTest extends FunctionalTest {
|
|||||||
$page = $this->objFromFixture('Page', 'page1');
|
$page = $this->objFromFixture('Page', 'page1');
|
||||||
$controller = new CMSMain();
|
$controller = new CMSMain();
|
||||||
$form = $controller->getEditForm($page->ID);
|
$form = $controller->getEditForm($page->ID);
|
||||||
$this->assertInstanceOf("CMSForm", $form);
|
$this->assertInstanceOf("Form", $form);
|
||||||
|
|
||||||
// Ensure that the form will not "validate" on delete or "unpublish" actions.
|
// Ensure that the form will not "validate" on delete or "unpublish" actions.
|
||||||
$exemptActions = $form->getValidationExemptActions();
|
$exemptActions = $form->getValidationExemptActions();
|
||||||
@ -536,7 +536,7 @@ class CMSMainTest_ClassA extends Page implements TestOnly {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class CMSMainTest_ClassB extends Page implements TestOnly {
|
class CMSMainTest_ClassB extends Page implements TestOnly {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class CMSMainTest_NotRoot extends Page implements TestOnly {
|
class CMSMainTest_NotRoot extends Page implements TestOnly {
|
||||||
@ -544,5 +544,5 @@ class CMSMainTest_NotRoot extends Page implements TestOnly {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class CMSMainTest_HiddenClass extends Page implements TestOnly, HiddenClass {
|
class CMSMainTest_HiddenClass extends Page implements TestOnly, HiddenClass {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user