SonataAdminBundle:显示非crud(统计)

cop*_*ndz 26 symfony sonata-admin symfony-2.2

我正在使用sonata管理包来生成我的后端,我很高兴它,我想用我的后端来显示统计数据.

我想我可以通过调整bundle的视图,"standard_layout.html.twig"来做到这一点.

问题是,我找不到例子甚至是人们谈论它,所以我想知道,这可能吗?是不是人们都在谈论它,因为它太简单了?你做了吗 ?

我真的很想有一个后端,所以请开导我!

谢谢你,copndz

pul*_*der 37

是的,这是可能的.可以使用Sonata Block或使用您自己的控制器完成.

如果使用控制器,则可以从默认CRUD控制器重载(一个或多个)操作以及渲染结果的外观取决于您.

  1. 将默认控制器替换SonataAdminBundle:CRUD为控制器 AcmeDemoAdminBundle:ProductStatisticsAdmin定义管理服务并删除实体,因为我们将尝试在没有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>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建管理服务 ProductStatisticsAdminAcme/Bundle/DemoAdminBundle/Admin/ProductStatisticsAdmin.php.该类将非常简单,因为我们只需要list操作而不需要其他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'));
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从Sonata的CRUDController 创建控制器 ProductStatisticsAdminController Acme/Bundle/DemoAdminBundle/Controller/ProductStatisticsAdminController.php并重载listAction().在此操作中,您可以调用数据库并检索统计信息,然后使用模板进行渲染.

    <?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,
                    ));
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 创建模板 product_statistics.html.twig以生成图表并显示统计信息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 %}
    
    Run Code Online (Sandbox Code Playgroud)


cop*_*ndz 20

由于pulzarraider向我们解释了一种方法,我将解释另一种方法.

阻止捆绑包的方式允许以非常强大的方式自定义仪表板.您可以按照模块捆绑文档在同一时间

1.在Copndz\MyBundle\Block\Service中创建StatisticsBlockService.php

我希望通过对存储的数据进行数学运算来显示统计数据:我需要

  • 导入EntityManager
  • 将属性$ em添加到服务中
  • 添加构造函数__construct,它将调用其父构造函数并使用参数中传递的EntityManager设置$ em

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

2.在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
Run Code Online (Sandbox Code Playgroud)

3.在config.yml中将此服务添加到sonata_block

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:
Run Code Online (Sandbox Code Playgroud)

4.在Copndz\MyBundle\Ressources\views\Block中创建模板block_statistics.html.twig

{% extends sonata_block.templates.block_base %}

{% block block %}
    {{ myentity.name }}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

5.最后在config.yml中的admin bundle配置中调用该服务

sonata_admin:
    dashboard:
        blocks:
            # display a dashboard block
            - { position: left, type: sonata.admin.block.admin_list }
            - { position: right, type: sonata.block.service.statistics }
Run Code Online (Sandbox Code Playgroud)


Sar*_*rim 14

实际上使用块和创建单独的页面有点不同.我认为OP正试图在sonata admin中创建单独的页面.

  1. 创建控制器,在routing.yml文件中配置其路由,如果希望URL看起来类似于sonata admin,则设置与sonata admin的前缀相同的前缀.

  2. 渲染模板.这里有两个技巧.

    首先,您需要从奏鸣曲管理员的"布局"模板扩展.如果您已将其更改config.yml,请相应地更新代码.参考

    {% extends "SonataAdminBundle::standard_layout.html.twig" %}
    
    Run Code Online (Sandbox Code Playgroud)

    现在你会看到sonata admin的菜单栏和页脚已经进入这个新页面.但菜单是空的.要显示菜单,您需要admin_pool从控制器传递到模板.

    $admin_pool = $this->get('sonata.admin.pool');
    
    return array(
        'admin_pool' => $admin_pool,
        // Other variables to pass to template
    );
    
    Run Code Online (Sandbox Code Playgroud)