button - Agregar un botón al CMS en SilverStripe
content-management-system (2)
No estoy seguro si esto es útil, pero así es como puede agregar botones de acción a un ModelAdmin.
(vuelve a cargar la página)
... en la clase de administración:
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 }
}
¿Cómo agrego un botón al back-end del CMS que dispara una acción? Puedo mostrar el botón donde quiero usar:
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->addFieldsToTab("Root.ButtonTest", array(
FormAction::create(''doAction'', ''Action button'')
)
);
return $fields;
}
public function doAction()
{
//Do something
}
Sin embargo, el botón agregado no hace nada cuando se hace clic.
He visto un ejemplo de cómo poner un botón en la barra de acciones principal (al lado de guardar / publicar) pero eso no es lo que estoy tratando de hacer.
Al mirar la única página de documentación que puedo encontrar, ¿debo hacer algo dentro de:
public function getCMSActions()
{
$actions = parent::getCMSActions();
//Something here?
}
No está muy claro cómo crear la acción que llama el botón.
Tendrás que extender / decorar LeftAndMain
con tu propia extensión y la acción a la que deseas llamar. Aquí hay un ejemplo:
<?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);
}
}
Una vez que haya escrito una extensión como esta, tendrá que aplicarla a LeftAndMain
agregando lo siguiente a su mysite/_config/config.yml
:
LeftAndMain:
extensions:
- MyExtension
Eso es. Su botón doAction
ahora debería hacer algo.