Как добавить пользовательскую кнопку и ее функциональность в Admin Silverstripe?
Пожалуйста, скажите мне решение.
Пользовательская кнопка добавляет только в одно меню.
Как и @wmk, упомянутые в комментариях, вы можете просто взять код рамки для GridFieldPrintButton
в качестве базы и перейти оттуда. SilverStripe также имеет базовое руководство по созданию пользовательского ActionProvider
.
Вместо того, чтобы переучивать учебник здесь, я предоставлю вам очень простой пользовательский поставщик действий, который вы можете скопировать и расширить, чтобы делать то, что вам нужно. Пока вы не заметите точный результат, который вы хотите от кнопки, я предоставил бы просто очень общий класс.
Этот код является урезанной версией GridFieldPrintButton
, упомянутой в @wmk. Он поддерживает как сама кнопка, вызывающая пользовательский код, так и URL.
Я заметил в коде ссылку, которую я сохранил для «grid-print-button», чтобы сделать вашу кнопку сидеть рядом с печатью, а не сидеть на другой строке (как это было в моем тестировании на более старый сайт, который я построил).
class GridFieldCustomButton implements GridField_HTMLProvider, GridField_ActionProvider, GridField_URLHandler { protected $targetFragment; protected $someCustomConstructData; //TargetFragment is just for positioning control of the HTML fragment //SomeCustomConstructData is just an example of providing some default options into your butotn public function __construct($targetFragment = "after", $someCustomConstructData = null) { $this->targetFragment = $targetFragment; $this->someCustomConstructData = $someCustomConstructData; } //Generate the HTML fragment for the GridField public function getHTMLFragments($gridField) { $button = new GridField_FormAction( $gridField, 'custom', 'Custom Action', 'custom', null ); return array( //Note: "grid-print-button" is used here to match the styling of the buttons in ModelAdmin $this->targetFragment => '<p class="grid-print-button">' . $button->Field() . '</p>', ); } public function getActions($gridField) { return array('myCustomAction'); } public function handleAction(GridField $gridField, $actionName, $arguments, $data) { if($actionName == 'myCustomAction') { return $this->handleMyCustomAction(); } } //For accessing the custom action from the URL public function getURLHandlers($gridField) { return array( 'myCustomAction' => 'handleMyCustomAction', ); } //Handle the custom action, for both the action button and the URL public function handleMyCustomAction($gridField, $request = null) { //Do your stuff here! } }
Продолжая обсуждение в комментариях, вам нужно будет изменить свой собственный ModelAdmin
чтобы добавить новые компоненты в свой GridField
.
class MyCustomAdmin extends ModelAdmin { private static $managed_models = array( 'MyCustomObject' ); private static $url_segment = 'custom-admin'; private static $menu_title = 'All Custom Objects'; public function getEditForm($ID = null, $Fields = null) { $form = parent::getEditForm($ID, $Fields); $fields = $form->Fields(); $gridField = $fields->fieldByName('MyCustomObject'); $gridFieldConfig = $gridField->getConfig(); $gridFieldConfig->addComponent(new GridFieldCustomButton()); return $form; } }
В частности, строка $gridFieldConfig->addComponent(new GridFieldCustomButton())
выполняет эту работу, беря вашу пользовательскую кнопку, как я показал выше, и добавил ее в ModelAdmin
. Вы также можете указать, куда он должен идти в GridField
, предоставив «кнопки-перед-левым» в качестве первого аргумента в конструкторе GridFieldCustomButton
.
например. $gridFieldConfig->addComponent(new GridFieldCustomButton("buttons-before-left"))
Более подробную информацию о фрагментах GridField
можно найти в документации разработчика SilverStripe .