Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony][SF2][Symfony2] Sonata - zmiany w dashboard., Symfony 2.2
gaua69
post 25.06.2013, 20:28:34
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 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.
Go to the top of the page
+Quote Post
pyro
post 25.06.2013, 20:45:17
Post #2





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

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


Cześć.

Musisz zadawać konkretniejsze pytania.


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
gaua69
post 25.06.2013, 22:24:29
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 25.06.2013, 22:46:46
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 27.06.2013, 17:19:32
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 27.06.2013, 20:11:53
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 27.06.2013, 20:52:56
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 wink.gif.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 08:00