Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][SF2][Symfony2] Sonata - zmiany w dashboard.
Forum PHP.pl > Forum > PHP > Frameworki
gaua69
Czesc, jestem nowy w Symfony. Zaznajomilem sie z dokumentacja i czescia cookbooka. Postanowilem w koncu cos napisac. Wystartowalem od backendu z Sonata Admin Bundle. Utworzylem modele, pozniej po nierownej walce z Sonata, skonfigurowalem ja, utworzylem klasy Adminow dla moich modeli i wszystko calkiem fajnie dziala(oprocz kiepskiej dokumentacji samej Sonaty biggrin.gif ). Akcje CRUDoskie wygenerowaly sie calkiem sprawnie.

Teraz moje wlasciwe pytanie, chcialbym przerobic domyslnego dashboarda, dodajac taki panel ze statystykami(ilosci userow, postow, co nowego do moderacji, jakies linki, moze wykres, itp). W dokumentacji Sonaty zalecaja uzywanie Block Bundle, niestety po przeczytaniu instrukcji tworzenia nowego blocka, nadal mam sporo watpliwosci(pewnie to braki w zrozumieniu symfony). Bylbym bardzo wdzieczny jakby ktos mi to lopatologicznie wytlumaczyl, jak stworzyc takiego blocka, jak dobrac sie do zawartosci modeli w tym blocku, jak to pozniej wyswietlic w szablonach. Mile widziane jakies solidne linki w tej tematyce, strasznie ciezko cos znalezc.

PS: Uzywam Doctrine ODM i mongodb, to troche komplikuje sprawe. Przepraszam za brak polskich liter wink.gif.
pyro
Cześć.

Musisz zadawać konkretniejsze pytania.
gaua69
Ok, tak wiec konkretniej. Na podstawie dokumentacji Admin Bundle, wywnioskowalem, ze dashboard sklada sie z blockow(Block Bundle), wiec aby dodac cos swojego, musze stworzyc swoj wlasny block, tak jak przykladowy tutaj:

http://sonata-project.org/bundles/block/ma...irst_block.html

Pytanie jak w tym bloku dostac sie do bazy danych, w contorlerze wyglada to tak:

  1. $user = $this->get('doctrine_mongodb')
  2. ->getRepository('MyBundle:User')
  3. ->find($id);


Co zrobic zeby, wyswietlic w tym bloku nazwe ostatnio dodanego uzytkownika?
destroyerr
Cytat
Pytanie jak w tym bloku dostac sie do bazy danych

Cytat
Co zrobic zeby, wyswietlic w tym bloku nazwe ostatnio dodanego uzytkownika?

Z dokumentacji wynika, że taki blok to zwykła usługa. Wystarczy wstrzyknąć odpowiednie zależności, np. repozytorium użytkowników. Wtedy bez problemu pobierasz ostatnio dodanego użytkownika.
gaua69
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:
  1. <?php
  2.  
  3. namespace MyBundle\AdminBundle\Block;
  4.  
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\OptionsResolver\OptionsResolverInterface;
  7. use Sonata\BlockBundle\Model\BlockInterface;
  8. use Sonata\BlockBundle\Block\BlockContextInterface;
  9. use Sonata\BlockBundle\Block\BaseBlockService;
  10. use Sonata\AdminBundle\Form\FormMapper;
  11. use Sonata\AdminBundle\Validator\ErrorElement;
  12. use Symfony\Component\DependencyInjection\ContainerInterface;
  13.  
  14. class StatisticsBlockService extends BaseBlockService
  15. {
  16. protected $container;
  17.  
  18. public function setContainer(ContainerInterface $container)
  19. {
  20. $this->container = $container;
  21. }
  22.  
  23. function setDefaultSettings(OptionsResolverInterface $resolver)
  24. {
  25. $resolver->setDefaults(array(
  26. 'title' => 'Statystyki',
  27. 'template' => 'MyBundle:Block:block_statistics.html.twig',
  28. ));
  29. }
  30.  
  31. public function buildEditForm(FormMapper $formMapper, BlockInterface $block)
  32. {
  33. }
  34.  
  35. function validateBlock(ErrorElement $errorElement, BlockInterface $block)
  36. {
  37. }
  38.  
  39. public function execute(BlockContextInterface $blockContext, Response $response = null)
  40. {
  41. $settings = $blockContext->getSettings();
  42.  
  43. $statistics = $this->container->get('sonata.admin.statistics');
  44.  
  45. return $this->renderResponse($blockContext->getTemplate(), array(
  46. 'block' => $blockContext->getBlock(),
  47. 'settings' => $settings,
  48. 'statistics' => $statistics
  49. ), $response);
  50. }
  51. }


Dodatkowo utworzylem usluge, ktora zajmuje sie pobieraniem danych z modeli zeby nie zasmiecac niepotrzebnie metody execute. Nastepnie tworzymy szablon:
  1. {% extends sonata_block.templates.block_base %}
  2. {% block block %}
  3. <div class>
  4. <table class="table table-hover table-bordered">
  5. <caption><h4>Uzytkownicy</h4></caption>
  6. <tbody>
  7. <tr>
  8. <th>Zarejestrowani:</th>
  9. <td>{{ statistics.registeredUsers }}</td>
  10. </tr>
  11. <tr>
  12. <th>Nieaktywni:</th>
  13. <td>{{ statistics.inActiveUsers }}</td>
  14. </tr>
  15. <tr>
  16. <th>Zbanowani:</th>
  17. <td>{{ statistics.lockedUsers }}</td>
  18. </tr>
  19. <tr>
  20. <th>Ostatnio zarejestrowany:</th>
  21. <td>{{ statistics.lastRegisteredUser }}</td>
  22. </tr>
  23. </tbody>
  24. </table>
  25. {% endblock %}


Na koniec pozostaje konfiguracja uslugi:
  1. sonata.block.service.statistics:
  2. class: MyBundle\AdminBundle\Block\StatisticsBlockService
  3. tags:
  4. - { name: sonata.block }
  5. arguments: [ "sonata.block.service.statistics", @templating ]
  6. calls:
  7. - [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:
  1. $user = $this->get('doctrine_mongodb')
  2. ->getRepository('MyBundle:User')
  3. ->find($id);
  4.  
  5. return $this->renderResponse($blockContext->getTemplate(), array(
  6. 'block' => $blockContext->getBlock(),
  7. 'settings' => $settings,
  8. 'user' => $user
  9. ), $response);
destroyerr
Mała rada dla Ciebie:
Cytat
Injecting a service container is like bringing the whole supermarket to cook, instead of just the ingredients

Więc dla Twojego bloku wystarczy ustawić tylko sonata.admin.statistics, a nie cały kontener.
gaua69
Racja, poprawie swoj kod. Dzieki za rade. Swoja droga zastanawia mnie, jak to jest z wydajnoscia podczas wstrzykiwania lancucha uslug, tj. pobieram usluge, ktora w sobie pobiera inna usluge itd. Jeszcze nie zaglebialem sie w szczegoly tego mechanizmu wink.gif.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.