symfony sonata-admin symfony-2.2

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 }



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.

  1. 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.

  2. 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.

  1. 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>

  2. Crear el servicio de administración ProductStatisticsAdmin en Acme/Bundle/DemoAdminBundle/Admin/ProductStatisticsAdmin.php . La clase será muy simple, ya que solo necesitaremos una acción de list 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'')); } }

  3. Cree su controlador ProductStatisticsAdminController en Acme/Bundle/DemoAdminBundle/Controller/ProductStatisticsAdminController.php y sobrecargue listAction() 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, )); } }

  4. Cree la plantilla product_statistics.html.twig para generar gráficos y visualizar estadísticas en Acme/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 %}