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

Author: copndz, 2013-04-12

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.

  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 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>
    
  2. Crear servicio de administración ProductStatisticsAdmin en Acme/Bundle/DemoAdminBundle/Admin/ProductStatisticsAdmin.php. La clase será muy simple, porque solo necesitaremos list 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'));
        }
    }
    
  3. Crea tu controlador ProductStatisticsAdminController en Acme/Bundle/DemoAdminBundle/Controller/ProductStatisticsAdminController.php y sobrecarga listAction() 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,
                    ));
        }
    }
    
  4. Crear plantilla product_statistics.html.twig para generar gráficos y mostrar 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 %}
    
 37
Author: pulzarraider,
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 }
 19
Author: copndz,
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.

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

  2. 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
    );
    
 14
Author: Sarim,
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
 1
Author: eikes,
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.

 0
Author: Viktor,
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