我正在使用sonata admin bundle来生成我的后端,我很高兴我也想使用我的后端来显示统计数据。
我想我可以通过调整bundle的视图来做到这一点,“standard_layout.html.twig”也许。
问题是,我找不到例子甚至是人们谈论它,所以我想知道,这可能吗?是不是人们都在谈论它,因为它太简单了?你做到了吗?
我真的想要一个后端,所以请开导我!
谢谢你, copndz
答案 0 :(得分:37)
是的,这是可能的。可以使用Sonata Block或使用您自己的控制器来完成。
如果你使用控制器,你可以从默认的CRUD控制器重载(一个或多个)动作,渲染结果的样子取决于你。
将默认控制器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>
在ProductStatisticsAdmin
中创建管理服务 Acme/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'));
}
}
在Acme/Bundle/DemoAdminBundle/Controller/ProductStatisticsAdminController.php
中创建您的控制器 ProductStatisticsAdminController,并从Sonata的CRUDController重载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,
));
}
}
创建模板 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 %}
答案 1 :(得分:19)
由于pulzarraider向我们解释了一种方法,我会解释另一种方法。
阻止捆绑包的方式允许以非常强大的方式自定义仪表板。 您可以同时关注Block bundle doc
<强> 1。在Copndz \ MyBundle \ Block \ Service
中创建StatisticsBlockService.php我想通过对存储的数据进行数学运算来显示统计数据:我需要
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。在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。将此服务添加到我的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。在Copndz \ MyBundle \ Ressources \ views \ Block
中创建模板block_statistics.html.twig{% extends sonata_block.templates.block_base %}
{% block block %}
{{ myentity.name }}
{% endblock %}
<强> 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 }
答案 2 :(得分:14)
实际上使用块和创建单独的页面有点不同。我认为OP正试图在sonata admin中创建单独的页面。
创建一个控制器,在routing.yml
文件中配置其路由,如果希望URL看起来类似于奏鸣曲管理员,则设置与sonata admin的前缀相同的前缀。
渲染模板。这里有两个技巧。
首先,你需要从奏鸣曲管理员的“布局”模板扩展。如果您在config.yml
中更改了它,请相应地更新代码。 Ref
{% extends "SonataAdminBundle::standard_layout.html.twig" %}
现在您将看到sonata admin的菜单栏和页脚已进入此新页面。但菜单是空的。要显示菜单,您需要将admin_pool
从控制器传递到模板。
$admin_pool = $this->get('sonata.admin.pool');
return array(
'admin_pool' => $admin_pool,
// Other variables to pass to template
);
答案 3 :(得分:1)
答案 4 :(得分:0)
我相信你想要实现的目标可以使用Sonata Admin Bundle的Sonata Block Bundle部分完成。
Sonata管理信息中心的文档http://sonata-project.org/bundles/admin/2-1/doc/reference/dashboard.html
我自己也没有这样做过。