Adding a button to the CMS in SilverStripe

后端 未结 2 1014
日久生厌
日久生厌 2020-12-19 12:28

How do I add a button to the backend of the CMS that fires an action? I can display the button where I want using:

public function getCMSFields()
{
    $fiel         


        
相关标签:
2条回答
  • 2020-12-19 12:51

    You'll have to extend/decorate LeftAndMain with your own extension and the action you want to call. Here's an example:

    <?php
    class MyExtension extends LeftAndMainExtension
    {
        private static $allowed_actions = array(
            'doAction'  
        );
    
        public function doAction($data, $form){
            $className = $this->owner->stat('tree_class');
            $SQL_id = Convert::raw2sql($data['ID']);
    
            $record = DataObject::get_by_id($className, $SQL_id);
    
            if(!$record || !$record->ID){
                throw new SS_HTTPResponse_Exception(
                    "Bad record ID #" . (int)$data['ID'], 404);
            }
    
            // at this point you have a $record, 
            // which is your page you can work with!
    
            // this generates a message that will show up in the CMS
            $this->owner->response->addHeader(
                'X-Status',
                rawurlencode('Success message!') 
            );
    
            return $this->owner->getResponseNegotiator()
                   ->respond($this->owner->request);
        }
    }
    

    Once you have written an extension like this, you'll have to apply it to LeftAndMain by adding the following to your mysite/_config/config.yml:

    LeftAndMain:
      extensions:
        - MyExtension
    

    That's it. Your doAction button should now actually do something!

    0 讨论(0)
  • 2020-12-19 12:52

    Not sure if this is helpful, but here's how you can add action-buttons to a ModelAdmin.
    (does reload the page)

    ...in the admin class:

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

    MyGridFieldDetailForm_ItemRequest.php

    class MyGridFieldDetailForm_ItemRequest extends GridFieldDetailForm_ItemRequest
    {
        function ItemEditForm()
        {
            $form = parent::ItemEditForm();
            $formActions = $form->Actions();
    
            $button = FormAction::create('myAction');
            $button->setTitle('button label');
            $button->addExtraClass('ss-ui-action-constructive');
            $formActions->push($button);
    
    
            $form->setActions($formActions);
            return $form;
        }
    
        public function myAction(){ //do things } 
    
    }
    
    0 讨论(0)
提交回复
热议问题