BUGFIX: add capability of redirecting form actions.

Form actions assume that they are reloading the form afterwards. But
this is not always the case - for example "delete" action will redirect
back to the panel, so we need to be able to set the X-Pjax headers
accordingly.
This commit is contained in:
Mateusz Uzdowski 2012-05-18 17:36:06 +12:00
parent 4f42b2e773
commit 8b4b896578
3 changed files with 15 additions and 6 deletions

View File

@ -106,7 +106,7 @@ class LeftAndMain extends Controller implements PermissionProvider {
); );
/** /**
* @var PJAXResponseNegotiator * @var PjaxResponseNegotiator
*/ */
protected $responseNegotiator; protected $responseNegotiator;
@ -416,12 +416,12 @@ class LeftAndMain extends Controller implements PermissionProvider {
/** /**
* Caution: Volatile API. * Caution: Volatile API.
* *
* @return PJAXResponseNegotiator * @return PjaxResponseNegotiator
*/ */
public function getResponseNegotiator() { public function getResponseNegotiator() {
if(!$this->responseNegotiator) { if(!$this->responseNegotiator) {
$controller = $this; $controller = $this;
$this->responseNegotiator = new PJAXResponseNegotiator(array( $this->responseNegotiator = new PjaxResponseNegotiator(array(
'CurrentForm' => function() use(&$controller) { 'CurrentForm' => function() use(&$controller) {
return $controller->getEditForm()->forTemplate(); return $controller->getEditForm()->forTemplate();
}, },

View File

@ -80,10 +80,18 @@
// as automatic browser ajax response redirects seem to discard the hash/fragment. // as automatic browser ajax response redirects seem to discard the hash/fragment.
formData.push({name: 'BackURL', value:History.getPageUrl()}); formData.push({name: 'BackURL', value:History.getPageUrl()});
// Some action buttons are redirecting to content areas as oposed to reloading the form.
// They will have pjax-content class on them.
var pjaxType = 'CurrentForm', pjaxSelector = '.cms-edit-form';
if ($(button).hasClass('pjax-content')) {
pjaxType = 'Content';
pjaxSelector = '.cms-content';
}
jQuery.ajax(jQuery.extend({ jQuery.ajax(jQuery.extend({
headers: { headers: {
"X-Pjax" : "CurrentForm", "X-Pjax" : pjaxType,
'X-Pjax-Selector': '.cms-edit-form' 'X-Pjax-Selector': pjaxSelector
}, },
url: form.attr('action'), url: form.attr('action'),
data: formData, data: formData,

View File

@ -291,8 +291,9 @@ class GridFieldDetailForm_ItemRequest extends RequestHandler {
if($this->record->ID !== 0) { if($this->record->ID !== 0) {
$actions->push(FormAction::create('doSave', _t('GridFieldDetailForm.Save', 'Save')) $actions->push(FormAction::create('doSave', _t('GridFieldDetailForm.Save', 'Save'))
->setUseButtonTag(true)->addExtraClass('ss-ui-action-constructive')->setAttribute('data-icon', 'accept')); ->setUseButtonTag(true)->addExtraClass('ss-ui-action-constructive')->setAttribute('data-icon', 'accept'));
// The delete action will redirect, hence pjax-content class.
$actions->push(FormAction::create('doDelete', _t('GridFieldDetailForm.Delete', 'Delete')) $actions->push(FormAction::create('doDelete', _t('GridFieldDetailForm.Delete', 'Delete'))
->addExtraClass('ss-ui-action-destructive')); ->addExtraClass('ss-ui-action-destructive')->addExtraClass('pjax-content'));
}else{ // adding new record }else{ // adding new record
//Change the Save label to 'Create' //Change the Save label to 'Create'
$actions->push(FormAction::create('doSave', _t('GridFieldDetailForm.Create', 'Create')) $actions->push(FormAction::create('doSave', _t('GridFieldDetailForm.Create', 'Create'))