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
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.
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>
Créer un service d'administration
ProductStatisticsAdmin
Acme/Bundle/DemoAdminBundle/Admin/ProductStatisticsAdmin.php
. La classe va être très simple, car nous aurons besoin de seulementlist
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')); } }
Créer votre contrôleur Produitsstatisticsadmincontroller in
Acme/Bundle/DemoAdminBundle/Controller/ProductStatisticsAdminController.php
et la surcharge delistAction()
à 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, )); } }
Créer un template
product_statistics.html.twig
pour générer des graphiques et afficher des statistiques 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 %}
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 }
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.
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.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 );
Voici une autre solution à votre Problème: http://blog.eike.se/2014/03/custom-page-controller-in-sonata-admin.html
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.