2013-08-21 2 views
3

При управлении Dataobject с ModelAdmin в Silverstripe 3 мне было интересно, как вы можете добавлять кнопки для пользовательских действий в представление списка, а также на страницу редактирования.Добавить кнопки для пользовательских действий в ModelAdmin

мне удалось добавить кнопку для действий на редактирования-страницы, установив ItemRequest на ModelAdmin в сек GridField класса на код ниже:

class MyModelAdmin extends ModelAdmin 
{ 
    //... 

    public function getEditForm($id = null, $fields = null) 
    { 
     $form = parent::getEditForm($id, $fields); 
     $form 
      ->Fields() 
      ->fieldByName($this->sanitiseClassName($this->modelClass)) 
      ->getConfig() 
      ->getComponentByType('GridFieldDetailForm') 
      ->setItemRequestClass('MyModelGridFieldDetailForm_ItemRequest'); 

     return $form; 
    } 

} 

MyModelGridFieldDetailForm_ItemRequest.php

class MyModelGridFieldDetailForm_ItemRequest extends GridFieldDetailForm_ItemRequest 
{ 
    function ItemEditForm() 
    { 
     $form = parent::ItemEditForm(); 
     $formActions = $form->Actions(); 

     $button = FormAction::create('myAction'); 
     $button->setTitle('My Custom Action'); 
     $button->addExtraClass('ss-ui-action-constructive'); 
     $formActions->push($button); 

     $form->setActions($formActions); 
     return $form; 
    } 


    function myAction($data, $form) 
    { 

     //do things 

     $form->sessionMessage('My Action has been successful', 'good'); 

     if ($this->gridField->getList()->byId($this->record->ID)) { 
      return $this->edit(Controller::curr()->getRequest()); 
     } else { 
      $noActionURL = Controller::curr()->removeAction($data['url']); 
      Controller::curr()->getRequest()->addHeader('X-Pjax', 'Content'); 
      return Controller::curr()->redirect($noActionURL, 302); 
     } 
    } 

} 

Вопрос в следующем:

Может ли я ve a кнопка для такое же действие в ModelAdminGridField Listview? Так что рядом с ним появится редактирования и кнопка удаления:

ModelAdmin GridField actions

ответ

5

Вы можете сделать это путем создания собственных GridFieldComponent реализации GridField_ColumnProvider и GridField_ActionProvider.

В вашем случае вы можете в значительной степени скопировать GridFieldDeleteAction класс и редактировать getColumnContent() с вашими собственными GridField_FormAction и редактировать handleAction() делать свою магию.

+0

что будет делать - спасибо :) Я как бы надеялся на какой-то магический метод, такой как getCMSActions(), который мне нужно было бы переопределить, чтобы изменить обе области ... –

Смежные вопросы