Dzieki bardzo za odpowiedz, naprowadziles mnie na wlasciwy tor i udalo mi sie zrealizowac to co chialem. Mala instrukcja dla osob z podobnym problemem:
-tworzy wlasny Block implementujac w naszej klasie interfejs BaseBlockService:
<?php
namespace MyBundle\AdminBundle\Block;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Sonata\BlockBundle\Model\BlockInterface;
use Sonata\BlockBundle\Block\BlockContextInterface;
use Sonata\BlockBundle\Block\BaseBlockService;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Validator\ErrorElement;
use Symfony\Component\DependencyInjection\ContainerInterface;
class StatisticsBlockService extends BaseBlockService
{
protected $container;
public function setContainer(ContainerInterface $container)
{
$this->container = $container;
}
function setDefaultSettings(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array( 'title' => 'Statystyki',
'template' => 'MyBundle:Block:block_statistics.html.twig',
));
}
public function buildEditForm(FormMapper $formMapper, BlockInterface $block)
{
}
function validateBlock(ErrorElement $errorElement, BlockInterface $block)
{
}
public function execute(BlockContextInterface $blockContext, Response $response = null)
{
$settings = $blockContext->getSettings();
$statistics = $this->container->get('sonata.admin.statistics');
return $this->renderResponse($blockContext->getTemplate(), array( 'block' => $blockContext->getBlock(),
'settings' => $settings,
'statistics' => $statistics
), $response);
}
}
Dodatkowo utworzylem usluge, ktora zajmuje sie pobieraniem danych z modeli zeby nie zasmiecac niepotrzebnie metody execute. Nastepnie tworzymy szablon:
{% extends sonata_block.templates.block_base %}
{% block block %}
<div class>
<table class="table table-hover table-bordered">
<caption><h4>Uzytkownicy</h4></caption>
<tbody>
<tr>
<th>Zarejestrowani:</th>
<td>{{ statistics.registeredUsers }}</td>
</tr>
<tr>
<th>Nieaktywni:</th>
<td>{{ statistics.inActiveUsers }}</td>
</tr>
<tr>
<th>Zbanowani:</th>
<td>{{ statistics.lockedUsers }}</td>
</tr>
<tr>
<th>Ostatnio zarejestrowany:</th>
<td>{{ statistics.lastRegisteredUser }}</td>
</tr>
</tbody>
</table>
{% endblock %}
Na koniec pozostaje konfiguracja uslugi:
sonata.block.service.statistics:
class: MyBundle\AdminBundle\Block\StatisticsBlockService
tags:
- { name: sonata.block }
arguments: [ "sonata.block.service.statistics", @templating ]
calls:
- [setContainer, [@service_container]]
Jezeli ktos chcialby pobrac cos z bazy bezposrednio w metodzie execute, to wystarczy tylko pobrac document menagera i przekazac dane jako parametry do szablonu:
$user = $this->get('doctrine_mongodb')
->getRepository('MyBundle:User')
->find($id);
return $this->renderResponse($blockContext->getTemplate(), array( 'block' => $blockContext->getBlock(),
'settings' => $settings,
'user' => $user
), $response);