No hay duda de que una de las mejores características de symfony es el Admin Generator, gracias a él podemos tener un panel de administración listo para usar en cuestión de minutos y además, podemos personalizarlo todo lo que queramos.
Hoy veremos como añadir nuevas acciones sobre objetos (object_actions) a la vista del listado y cómo personalizarlas desde el archivo generator.yml
Las object_actions por defecto
Por defecto, symfony incluye dos acciones para cada elemento del listado, eliminar y editar. Estas dos acciones son un tanto especiales en el sentido de que están ya están “personalizadas”, mostrando un icono distinto e incluso saltando javascript al hacer click (el caso del botón eliminar). En el archivo generator.yml:
generator: param: config: list: object_actions: _delete: ~ _edit: ~
Si no queremos mostrar una de las acciones en el listado bastará con borrarla.
Añadiendo una object_action
Como siempre es más sencillo hablar con ejemplos concretos, supongamos que el listado que estamos mostrado es de noticias y queremos añadir una acción que sea “publicar” de manera que al hacer click sobre ella se publique la noticia. Lo primero que habría que hacer sería añadir esta acción al listado, así:
generator: param: config: list: object_actions: _delete: ~ _edit: ~ publish: ~
De esta forma, aparecerá un nuevo enlace a “modulo/:id/ListPublish” y por tanto hará falta definir la acción “ListPublish” dentro del archivo actions.class.php
// /module/moduleName/actions/actions.class.php public function executeListPublish(sfWebRequest $request) { $this->getRoute()->getObject()->publish(); $this->redirect('@moduleName'); }
Con esto estaría el trabajo hecho, pero siempre puede quedar algo más “bonito”,
.
Personalizando el texto
¿Qué ocurre si queremos que el texto que aparezca sea “Publicar Noticia” en lugar de “Publish”?, muy sencillo:
generator: param: config: list: object_actions: publish: { label: "Publicar Texto" }
Personalizando el HTML generado
¿Y si queremos añadirle una clase de CSS o un ID al anchor tag? Más fácil:
generator: param: config: list: object_actions: publish: label: "Publicar Texto" params: { class: 'myClass', id: 'publish-button' }
¿Y para que salte un javascript como en el caso del botón eliminar?
generator: param: config: list: object_actions: publish: label: "Publicar Texto" params: class: 'myClass' id: 'publish-button' onclick: 'return confirm('¿Estás seguro?');'
Notar que para cambiar la imagen del icono debemos de hacerlo a través de la hoja de estilos admin.css modificando el atributo background de
#sf_admin_container ul li.sf_admin_action_publish a
Personalizando la acción que se ejecuta
Por último, si por cualquier motivo queremos que se ejecute la acción “publish” en lugar de “ListPublish” bastará con
generator: param: config: list: object_actions: publish: action: 'publish'