Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony][SF2][Symfony2] Sonata - zmiany w dashboard., Symfony 2.2
gaua69
post
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.06.2013

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/wink.gif) .
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
pyro
post
Post #2





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Cześć.

Musisz zadawać konkretniejsze pytania.
Go to the top of the page
+Quote Post
gaua69
post
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.06.2013

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
destroyerr
post
Post #4





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
gaua69
post
Post #5





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.06.2013

Ostrzeżenie: (0%)
-----


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);
Go to the top of the page
+Quote Post
destroyerr
post
Post #6





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
gaua69
post
Post #7





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.06.2013

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/wink.gif) .
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 16:07