SonataAdminBundle: отображение не crud (статистика)
Я использую пакет sonata admin для генерации моего бэкэнда, я так счастлив, что хотел бы использовать свой сервер для отображения статистики.
Я думаю, что я могу это сделать, изменив представления пакетов, "standard_layout.html.twig", возможно.
Проблема в том, что я не могу найти примеров или даже людей, говорящих об этом, так что мне интересно, возможно ли это? Разве люди не говорят об этом, потому что это слишком просто? Вы сделали это?
Я действительно хотел бы иметь один бэкэнд, поэтому PLS просветит меня!
Спасибо,
copndz
Ответы
Ответ 1
Так как pulzarraider объяснил нам один способ сделать это, я объясню другой.
Способ связывания блоков позволяет настраивать панель управления довольно мощным способом.
Вы можете одновременно следить за Документом о пакете пакетов
1. Создать StatisticsBlockService.php в Copndz\MyBundle\Block\Service
Я хочу отобразить статистику, выполнив математику с сохраненными данными: мне нужно
- импортировать EntityManager
- добавить атрибут $em в службу
- добавить конструктор __construct, который вызывается его родительским конструктором и устанавливает $em с EntityManager, переданным в аргументе
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. Добавьте эту службу в sonata_block в мой config.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. Создайте шаблон block_statistics.html.twig в папке Copndz\MyBundle\Ressources\views\Block
{% 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 }
Ответ 2
Да, это возможно. Это можно сделать с помощью блока Sonata или с помощью вашего собственного контроллера.
Если вы используете контроллер, вы можете перегружать (одно или несколько) действий с контроллера 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'));
}
}
-
Создайте свой контроллер ProductStatisticsAdminController в Acme/Bundle/DemoAdminBundle/Controller/ProductStatisticsAdminController.php
и перегрузите listAction()
из CRUDController от Sonata. Внутри этого действия вы можете вызвать свою БД и получить статистику, а затем визуализировать их с помощью своего шаблона.
<?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 %}
Ответ 3
Фактически использование блоков и создание отдельных страниц несколько отличаются. Я думаю, что OP пытается создать отдельную страницу внутри администратора сонаты.
-
Создайте контроллер, настройте его маршруты в файле routing.yml
, установите префикс так же, как префикс администратора сонаты, если вы хотите, чтобы URL-адрес выглядел похожим на администратора сонаты.
-
Выделите шаблон. Здесь есть два трюка.
Сначала вам нужно перейти от шаблона шаблона администратора сонаты. Если вы изменили его в config.yml
, обновите код соответствующим образом. Ref
{% extends "SonataAdminBundle::standard_layout.html.twig" %}
Теперь вы увидите панель меню администратора соната и нижний колонтитул на этой новой странице. Но меню пуст. Чтобы отобразить меню, вам необходимо передать admin_pool
с контроллера на шаблон.
$admin_pool = $this->get('sonata.admin.pool');
return array(
'admin_pool' => $admin_pool,
// Other variables to pass to template
);
Ответ 4
Вот еще одно решение вашей проблемы: http://blog.eike.se/2014/03/custom-page-controller-in-sonata-admin.html
Ответ 5
Я считаю, что то, что вы пытаетесь добиться, может быть выполнено с помощью блока "Соната", входящего в состав пакета Sonata Admin Bundle.
Документация для панели управления администратора Sonata http://sonata-project.org/bundles/admin/2-1/doc/reference/dashboard.html
Я не делал этого сам, хотя.