我正在使用sonata admin bundle来生成我的后端,我对它很满意,我想用我的后端来显示统计数据。
我想我可以通过调整bundle的视图"standard_layout.html "来实现。树枝"也许。
问题是,我找不到例子,甚至找不到谈论它的人,所以我想知道,这可能吗?人们谈论它不是因为它太简单了吗?你做了吗?
我真的很想有一个单一的后端,所以请启发我!
谢谢你,copndz
是的,有可能。它可以用奏鸣曲块或使用自己的控制器来完成。
如果你使用你的控制器,你可以重载(一个或多个)操作从默认的CRUD控制器和如何呈现结果将取决于你。
-
将默认控制器
SonataAdminBundle:CRUD
替换为您的控制器 AcmeDemoAdminBundle:ProductStatisticsAdmin在您的管理服务的定义和删除实体,因为我们将尝试在没有CRUD操作的情况下呈现我们的统计数据。<service id="acme_demo_admin.product_statistics" class="AcmeBundleDemoAdminBundleAdminProductStatisticsAdmin"> <tag name="sonata.admin" manager_type="orm" group="statistics_group" label_catalogue="admin" label="Product Statistics" /> <argument /> <argument /> <argument>AcmeDemoAdminBundle:ProductStatisticsAdmin</argument> </service>
-
在
Acme/Bundle/DemoAdminBundle/Admin/ProductStatisticsAdmin.php
中创建管理服务ProductStatisticsAdmin
。该类将非常简单,因为我们只需要list
操作而不需要其他CRUD操作。<?php namespace AcmeBundleDemoAdminBundleAdmin; use SonataAdminBundleAdminAdmin; use SonataAdminBundleRouteRouteCollection; class ProductStatisticsAdmin extends Admin { protected $baseRoutePattern = 'product-statistics'; protected $baseRouteName = 'productStatistics'; protected function configureRoutes(RouteCollection $collection) { $collection->clearExcept(array('list')); } }
-
创建您的控制器 ProductStatisticsAdminController在
Acme/Bundle/DemoAdminBundle/Controller/ProductStatisticsAdminController.php
和超载listAction()
从索纳塔的CRUDController。在此操作中,您可以调用DB并检索统计数据,然后使用模板呈现它们。<?php namespace AcmeBundleDemoAdminBundleController; use SonataAdminBundleControllerCRUDController as Controller; use SymfonyComponentSecurityCoreExceptionAccessDeniedException; 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, )); } }
-
创建模板
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 %}
既然pulzarraider向我们解释了一种方法,那么我将解释另一种方法。
block bundle的方式允许以一种非常强大的方式自定义仪表板。你可以同时跟随Block bundle doc
1。创建StatisticsBlockService.php在CopndzMyBundleBlockService
我想通过对存储的数据进行数学运算来显示统计数据:我需要
- 导入EntityManager
- 为服务添加属性$em
- 添加构造函数__construct,它将调用父构造函数并设置$em与EntityManager传入参数
namespace CopndzMyBundleBlockService;
use SymfonyComponentHttpFoundationResponse;
use SonataAdminBundleFormFormMapper;
use SonataAdminBundleValidatorErrorElement;
use SonataBlockBundleModelBlockInterface;
use SonataBlockBundleBlockBaseBlockService;
use DoctrineORMEntityManager;
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。在MyBundle resources configservices.yml
中创建服务 sonata.block.service.statistics:
class: CopndzMyBundleBlockServiceStatisticsBlockService
tags:
- { name: sonata.block }
arguments:
- "sonata.block.service.statistics"
- @templating
- @doctrine.orm.entity_manager
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:
4。创建模板block_statistics.html。在CopndzMyBundle resources viewsBlock
{% extends sonata_block.templates.block_base %}
{% block block %}
{{ myentity.name }}
{% endblock %}
5。最后调用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 }
实际上使用块和创建单独的页面有点不同。我认为OP试图在sonata管理中创建单独的页面。
-
创建一个控制器,在
routing.yml
文件中配置它的路由,如果你想让URL看起来像sonata admin的前缀,设置一个与sonata admin相同的前缀 -
渲染模板。这里有两个技巧。
首先你需要从sonata admin的"layout"模板扩展。如果您在
config.yml
中更改了它,请相应地更新代码。Ref{% extends "SonataAdminBundle::standard_layout.html.twig" %}
现在您将看到sonata管理的菜单栏和页脚已经来到这个新页面。但是菜单是空的。要显示菜单,需要将
admin_pool
从控制器传递到模板。$admin_pool = $this->get('sonata.admin.pool'); return array( 'admin_pool' => $admin_pool, // Other variables to pass to template );
这是你的问题的另一个解决方案:http://blog.eike.se/2014/03/custom-page-controller-in-sonata-admin.html
我相信你想要实现的可以使用Sonata Block Bundle的Sonata Admin Bundle部分来完成。
Sonata Admin Dashboard文档http://sonata-project.org/bundles/admin/2-1/doc/reference/dashboard.html
我自己还没有做过。