symfony - SonataAdminBundle: display non crud(estadísticas)
sonata-admin symfony-2.2 (5)
Aquí hay otra solución a su problema: http://blog.eike.se/2014/03/custom-page-controller-in-sonata-admin.html
Estoy usando el paquete de administración de sonata para generar mi backend, estoy tan contento con él que me gustaría utilizar mi backend para mostrar estadísticas también.
Creo que puedo hacer eso ajustando las vistas de paquete, "standard_layout.html.twig" quizás.
El problema es que no puedo encontrar ejemplos o incluso personas que hablen de eso, así que me pregunto si es posible. ¿No habla la gente porque es demasiado simple? Lo has hecho ?
Realmente me gustaría tener un backend único, así que pls me iluminará!
Gracias, copndz
Como pulzarraider nos explicó una forma de hacerlo, le explicaré la otra.
El camino del bloque de bloques permite personalizar el tablero de una manera bastante poderosa. Puede seguir el documento Block bundle al mismo tiempo
1. Crea StatisticsBlockService.php en Copndz / MyBundle / Block / Service
Quiero mostrar estadísticas haciendo matemáticas con datos almacenados: necesito
- importar el EntityManager
- agregar atributo $ em al servicio
- agregar constructor __construct que llamará a su constructor padre y establecer $ em con EntityManager pasado en argumento
namespace Copndz/MyBundle/Block/Service;
use Symfony/Component/HttpFoundation/Response;
use Sonata/AdminBundle/Form/FormMapper;
use Sonata/AdminBundle/Validator/ErrorElement;
use Sonata/BlockBundle/Model/BlockInterface;
use Sonata/BlockBundle/Block/BaseBlockService;
use Doctrine/ORM/EntityManager;
class StatisticsBlockService extends BaseBlockService
{
private $em;
/**
* {@inheritdoc}
*/
public function execute(BlockInterface $block, Response $response = null)
{
$settings = array_merge($this->getDefaultSettings(), $block->getSettings());
$myentityrepository = $this->em->getRepository(''CopndzMyBundle:MyEntity'');
$myentity = $myentityrepository->find(''5'');
return $this->renderResponse(''CopndzMyBundle:Block:block_statistics.html.twig'', array(
''block'' => $block,
''settings'' => $settings,
''myentity'' => $myentity,
), $response);
}
/**
* {@inheritdoc}
*/
public function validateBlock(ErrorElement $errorElement, BlockInterface $block)
{
// TODO: Implement validateBlock() method.
}
/**
* {@inheritdoc}
*/
public function buildEditForm(FormMapper $formMapper, BlockInterface $block)
{
$formMapper->add(''settings'', ''sonata_type_immutable_array'', array(
''keys'' => array(
array(''content'', ''textarea'', array()),
)
));
}
/**
* {@inheritdoc}
*/
public function getName()
{
return ''Text (core)'';
}
/**
* {@inheritdoc}
*/
public function getDefaultSettings()
{
return array(
''content'' => ''Insert your custom content here'',
);
}
public function __construct($name, $templating, EntityManager $entityManager)
{
parent::__construct($name, $templating);
$this->em = $entityManager;
}
}
2. Cree el servicio en MyBundle / Ressources / config / services.yml
sonata.block.service.statistics:
class: Copndz/MyBundle/Block/Service/StatisticsBlockService
tags:
- { name: sonata.block }
arguments:
- "sonata.block.service.statistics"
- @templating
- @doctrine.orm.entity_manager
3. Agregue este servicio a sonata_block en mi config.yml
sonata_block:
default_contexts: [cms]
blocks:
sonata.admin.block.admin_list:
contexts: [admin]
sonata.block.service.text:
sonata.block.service.rss:
sonata.block.service.statistics:
4. Cree la plantilla block_statistics.html.twig en Copndz / MyBundle / Ressources / views / Block
{% extends sonata_block.templates.block_base %}
{% block block %}
{{ myentity.name }}
{% endblock %}
5. Y finalmente llame al servicio en la configuración del paquete de administración en config.yml
sonata_admin:
dashboard:
blocks:
# display a dashboard block
- { position: left, type: sonata.admin.block.admin_list }
- { position: right, type: sonata.block.service.statistics }
Creo que lo que estás tratando de lograr se puede hacer usando la parte Sonata Block Bundle de Sonata Admin Bundle.
Documentación para Sonata Admin Dashboard http://sonata-project.org/bundles/admin/2-1/doc/reference/dashboard.html
Aunque no lo he hecho yo mismo.
En realidad, usar bloques y crear páginas separadas son un poco diferentes. Creo que el OP está intentando crear una página separada dentro del administrador de sonata.
Cree un controlador, configure sus rutas en el archivo
routing.yml
, establezca un prefijo igual al prefijo del administrador de sonata si desea que la URL parezca similar al administrador de sonata.Renderiza la plantilla. Hay dos trucos aquí.
Primero necesita extender desde la plantilla de "diseño" del administrador de sonata. Si lo ha cambiado en
config.yml
, actualice el código en consecuencia. Ref{% extends "SonataAdminBundle::standard_layout.html.twig" %}
Ahora verás que la barra de menú y el pie de página del administrador de sonata han llegado a esta nueva página. Pero el menú está vacío. Para mostrar el menú, debe pasar
admin_pool
del controlador a la plantilla.$admin_pool = $this->get(''sonata.admin.pool''); return array( ''admin_pool'' => $admin_pool, // Other variables to pass to template );
Sí, es posible. Se puede hacer con Sonata Block o usando su propio controlador.
Si usa su controlador , puede sobrecargar (una o más) acciones del controlador CRUD predeterminado y la forma en que se verá el resultado procesado depende de usted.
Reemplace el controlador predeterminado
SonataAdminBundle:CRUD
con su controlador AcmeDemoAdminBundle: ProductStatisticsAdmin en la definición de su servicio de administración y elimine la entidad porque intentaremos representar nuestras estadísticas sin operaciones CRUD.<service id="acme_demo_admin.product_statistics" class="Acme/Bundle/DemoAdminBundle/Admin/ProductStatisticsAdmin"> <tag name="sonata.admin" manager_type="orm" group="statistics_group" label_catalogue="admin" label="Product Statistics" /> <argument /> <argument /> <argument>AcmeDemoAdminBundle:ProductStatisticsAdmin</argument> </service>
Crear el servicio de administración
ProductStatisticsAdmin
enAcme/Bundle/DemoAdminBundle/Admin/ProductStatisticsAdmin.php
. La clase será muy simple, ya que solo necesitaremos una acción delist
y ninguna otra operación de CRUD.<?php namespace Acme/Bundle/DemoAdminBundle/Admin; use Sonata/AdminBundle/Admin/Admin; use Sonata/AdminBundle/Route/RouteCollection; class ProductStatisticsAdmin extends Admin { protected $baseRoutePattern = ''product-statistics''; protected $baseRouteName = ''productStatistics''; protected function configureRoutes(RouteCollection $collection) { $collection->clearExcept(array(''list'')); } }
Cree su controlador ProductStatisticsAdminController en
Acme/Bundle/DemoAdminBundle/Controller/ProductStatisticsAdminController.php
y sobrecarguelistAction()
del Sonata`s CRUDController. Dentro de esta acción puede llamar a su base de datos y recuperar las estadísticas y luego renderizarlas con su plantilla.<?php namespace Acme/Bundle/DemoAdminBundle/Controller; use Sonata/AdminBundle/Controller/CRUDController as Controller; use Symfony/Component/Security/Core/Exception/AccessDeniedException; class ProductStatisticsAdminController extends Controller { public function listAction() { if (false === $this->admin->isGranted(''LIST'')) { throw new AccessDeniedException(); } //... use any methods or services to get statistics data $statisticsData = ... return $this->render(''AcmeDemoAdminBundle:ProductStatistics:product_statistics.html.twig'', array( ''statistics_data'' => $statisticsData, )); } }
Cree la plantilla
product_statistics.html.twig
para generar gráficos y visualizar estadísticas enAcme/Bundle/DemoAdminBundle/Resources/views/ProductStatistics/product_statistics.html.twig
{% extends base_template %} {% block javascripts %} {{ parent() }} {# put links to javascript libraries here if you need any #} {% endblock %} {% block content %} {# put some html code to display statistics data or use some javascript library to generate cool graphs #} {% endblock %}