SonataAdminBundle: mostrar no crud (estadísticas)
Estoy usando sonata admin bundle para generar mi backend, estoy tan contento con él que me gustaría usar mi backend para mostrar estadísticas también.
Supongo que puedo hacer eso ajustando las vistas de bundle, "standard_layout.HTML.ramita " tal vez.
El problema es que no puedo encontrar ejemplos o incluso personas hablando de ello, así que me pregunto, ¿es eso posible ? ¿No está la gente hablando de ello porque es demasiado simple ? Lo hiciste ?
Realmente me gustaría tener un solo backend, así que por favor ilumíname !
Gracias, copndz
5 answers
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 cómo se verá el resultado renderizado 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 renderice 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 servicio de administración
ProductStatisticsAdmin
enAcme/Bundle/DemoAdminBundle/Admin/ProductStatisticsAdmin.php
. La clase será muy simple, porque solo necesitaremoslist
acción y ninguna otra operación 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')); } }
-
Crea tu controlador ProductStatisticsAdminController en
Acme/Bundle/DemoAdminBundle/Controller/ProductStatisticsAdminController.php
y sobrecargalistAction()
desde CRUDController de Sonata. Dentro de esta acción puede llamar a su base de datos y recuperar 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, )); } }
-
Crear plantilla
product_statistics.html.twig
para generar gráficos y mostrar 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 %}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-26 04:57:58
Ya que pulzarraider nos explicó una manera de hacer esto, explicaré la otra.
La forma del paquete de bloques permite personalizar el panel de una manera bastante poderosa. Puedes seguir Block bundle doc al mismo tiempo
1. Crear StatisticsBlockService.php en Copndz\MyBundle \ Block \ Service
Quiero mostrar estadísticas haciendo matemáticas con los datos almacenados : necesito
- importa el EntityManager
- añadir atributo em em a la servicio
- add constructor _ _ construct que llamará a su constructor padre y establecerá $em con EntityManager pasado en el 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. Añadir este servicio a sonata_block en mi configuración.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. Crea la plantilla block_statistics.HTML.ramita 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 }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-15 10:22:57
En realidad usar bloques y crear páginas separadas son un poco diferentes. Creo que el OP está tratando de crear una página separada dentro de sonata admin.
Cree un controlador, configure sus rutas en el archivo
routing.yml
, establezca un prefijo igual que el prefijo de sonata admin si desea que la URL aparezca de forma similar a sonata admin.-
Renderiza la plantilla. Hay dos trucos aquí.
Primero necesitas extender desde la plantilla "layout" del administrador de sonata. Si lo has 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 );
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-12 17:03:59
Aquí hay otra solución a su Problema: http://blog.eike.se/2014/03/custom-page-controller-in-sonata-admin.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-19 13:15:12
Creo que lo que estás tratando de lograr podría hacerse usando la parte del Paquete de Bloques Sonata del Paquete de Administración Sonata.
Documentación para el Panel de administración de Sonata http://sonata-project.org/bundles/admin/2-1/doc/reference/dashboard.html
No lo he hecho yo mismo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-12 11:41:02