SonataAdminBundle: affichage non crud (statistiques)

j'utilise sonata admin bundle pour générer mon backend, je suis tellement content que j'aimerais utiliser mon backend pour afficher des statistiques aussi.

je suppose que je peux le faire en modifiant le faisceau de points de vue, des "standard_layout.HTML.brindille" peut-être.

le problème, c'est que je ne trouve pas d'exemples ou même des gens qui en parlent, alors je me demande, est-ce possible ? Les gens n'en parlent pas parce que c'est trop simple ? Avez-vous le faire ?

je tiens vraiment à avoir un un seul arrière, alors éclaire-moi !

Merci, copndz

25
demandé sur copndz 2013-04-12 12:30:37

5 réponses

Oui, c'est possible. Cela peut être fait avec le bloc Sonata ou en utilisant votre propre contrôleur.

Si vous utilisez votre controller, vous pouvez surcharger (une ou plusieurs) actions du contrôleur CRUD par défaut et la façon dont le résultat Rendu apparaîtra dépend de vous.

  1. remplacer le controller par défaut SonataAdminBundle:CRUD avec votre contrôleur AcmeDemoAdminBundle:ProductStatisticsAdmin dans la définition de votre service d'administration et supprimer l'entité parce que nous essaierons de rendre nos statistiques sans opérations crues.

    <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. Créer un service d'administrationProductStatisticsAdminAcme/Bundle/DemoAdminBundle/Admin/ProductStatisticsAdmin.php. La classe va être très simple, car nous aurons besoin de seulement list action et pas d'autre opération CRUDÉE.

    <?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. Créer votre contrôleur Produitsstatisticsadmincontroller in Acme/Bundle/DemoAdminBundle/Controller/ProductStatisticsAdminController.php et la surcharge de listAction() à partir de la Sonata CRUDController. À l'intérieur de cette action vous pouvez appeler votre base de données et récupérer des statistiques, puis les rendre avec votre modèle.

    <?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. Créer un templateproduct_statistics.html.twig pour générer des graphiques et afficher des statistiques 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
répondu pulzarraider 2015-03-26 04:57:58

depuis que pulzarraider nous a expliqué une façon de faire ça, je vais vous expliquer l'autre.

la façon de bloc de paquet permettent de personnaliser le tableau de bord d'une manière assez puissante. Vous pouvez suivre Bloc bundle doc en même temps

1. Créer StatisticsBlockService.php en Copndz\MyBundle\Bloc\Service

je veux afficher les statistiques en faisant des maths avec des données stockées : j'ai besoin de

  • importer les EntityManager
  • ajouter l'attribut $ em au service
  • add constructor _ _ construct qui appellera son constructeur parent et définira $em avec EntityManager passé en argument

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. Créer le service dans 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. Ajoutez ce service à sonata_block dans ma configuration.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. Créer le modèle block_statistics.HTML.brindille dans Copndz\MyBundle\Ressources\views\Bloc

{% extends sonata_block.templates.block_base %}

{% block block %}
    {{ myentity.name }}
{% endblock %}

5. Et finalement appeler le service dans la configuration du forfait administrateur dans 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
répondu copndz 2013-04-15 10:22:57

en fait, l'utilisation de blocs et la création de pages séparées sont un peu différentes. Je pense que L'OP essaye de créer une page séparée à l'intérieur de Sonata admin.

  1. créer un controller, configurer ses routes dans routing.yml fichier, définissez un préfixe identique au préfixe de Sonata admin si vous voulez que L'URL apparaisse similaire à Sonata admin.

  2. afficher le modèle. Il y a deux truc ici.

    tout d'abord, vous devez vous étendre à partir de la disposition de Sonata admin" modèle. Si vous l'avez changé dans config.yml, mettre à jour le code en conséquence. Ref

    {% extends "SonataAdminBundle::standard_layout.html.twig" %}
    

    Maintenant vous allez voir la barre de menu de sonata admin et le pied de page est venu à cette nouvelle page. Mais le menu est vide. Pour afficher le menu, vous devez passer admin_pool depuis le contrôleur de modèle.

    $admin_pool = $this->get('sonata.admin.pool');
    
    return array(
        'admin_pool' => $admin_pool,
        // Other variables to pass to template
    );
    
14
répondu Sarim 2014-05-12 17:03:59
1
répondu eikes 2014-03-19 13:15:12

je crois que ce que vous essayez d'accomplir pourrait être fait en utilisant la partie de bloc de bloc de bloc de bloc de Sonata administrateur paquet.

Documentation pour la Sonata Admin tableau de bord http://sonata-project.org/bundles/admin/2-1/doc/reference/dashboard.html

je n'ai pas fait moi-même.

0
répondu Viktor 2013-04-12 11:41:02