login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[Symfony2] Hoe maak ik gebruik van een nested repeater i.c.m. twig (Opgelost)

Offline Martijn2008 - 01/04/2013 21:35
Avatar van Martijn2008PHP beginner Hallo allemaal,

Ik heb een controller aangemaakt met de naam overzicht. Het is de bedoeling dat de controller een overzicht gaat tonen van categorieën en pagina's.
Een pagina hoort altijd bij 1 categorie en een categorie heeft 0 of meerdere pagina's in zich.

Het overzicht moet er visueel als volgt uitzien:

Categorie 1
- Pagina 1
- Pagina 4
- Pagina 5
Categorie 2
- Pagina 2
- Pagina 3
Categorie 3
- Pagina 6

Met ASP.net webforms kun je gebruik maken van een nested repeater om dit probleem op te lossen, echter met Symfony2 in combinatie met Twig template engine heb ik geen idee hoe ik dit aan moet pakken.

Iemand een idee voor een goede aanpak?

Alvast bedankt.

Martijn



12 antwoorden

Gesponsorde links
Offline Joost - 01/04/2013 21:54 (laatste wijziging 01/04/2013 21:54)
Avatar van Joost PHP expert Ik heb geen verstand van Twig of Symfony maar ik neem aan dat zoiets toch wel moet kunnen:

  1. <ul id="navigation">
  2. {% for item in categories %}
  3. <strong>{{ item.name }}</strong>
  4. {% for it in categories.pages %}
  5. {{ it.name }}
  6. {% endfor %}
  7. {% endfor %}
  8. </ul>
Bedankt door: Martijn2008
Offline Martijn2008 - 01/04/2013 21:59
Avatar van Martijn2008 PHP beginner Ik denk dat je gelijk hebt. Hoe zal de code in de controller er dan uit komen te zien?
Ik heb te doen met twee objecten: Categorie en Pagina.
Offline WouterJ - 01/04/2013 22:34 (laatste wijziging 01/04/2013 22:38)
Avatar van WouterJ HTML gevorderde Goed, je hebt hoop ik een OneToMany relatie tussen Categorie en Pagina?

Dan maak je een PageRepository met een nieuwe method:
  1. // src/Martijn/PageBundle/Entity/PageRepository.php
  2.  
  3. // ...
  4. class PageRepository extends BaseRepository
  5. {
  6. public function findAllSortedByCategory()
  7. {
  8. $results = $this->getEntityManager()
  9. ->createQuery('SELECT ... ORDER BY category')
  10. ->getResult();
  11. $pages = array();
  12.  
  13. foreach ($results as $result) {
  14. $cat = $result->getCategory()->getName();
  15. if (!isset($pages[$cat])) {
  16. $pages[$cat] = array();
  17. }
  18.  
  19. $pages[$cat][] = $result;
  20. }
  21.  
  22. return $pages;
  23. }
  24. }


Dan kun je nu de resultaten tonen:
  1. // src/Martijn/PageBundle/Controller/PageController.php
  2.  
  3. // ...
  4. class PageController extends Controller
  5. {
  6. public function listAction()
  7. {
  8. $repo = $this->getRepository('MartijnPageBundle:Page');
  9. $pages = $repo->findAllSortedByCategory();
  10.  
  11. return $this->render('MartijnPageBundle:Page:list.html.twig', array(
  12. 'pages' => $pages,
  13. ));
  14. }
  15. }

  1. {# src/Martijn/PageBundle/Resources/view/Page/list.html.twig #}
  2. <ul class="page-list">
  3. {% for pages, category in categories -%}
  4. <li><strong>{{ category }}</strong>
  5.  
  6. <ul>
  7. {% for page in pages -%}
  8. <li><a href={{ page.url }}>{{ page }}</a></li>
  9. {%- endfor %}
  10. </ul>
  11. {%- endfor %}
  12. </ul>
Bedankt door: Martijn2008
Offline Martijn2008 - 01/04/2013 23:15
Avatar van Martijn2008 PHP beginner Is dit voldoende of moet ik de puntjes vervangen door wat magic??

  1. ->createQuery('SELECT ... ORDER BY category')


Btw, een categorie heeft ook een kleur, hoe zit dat?
Offline WouterJ - 01/04/2013 23:17
Avatar van WouterJ HTML gevorderde Die puntjes worden inderdaad vervangen door wat SQL magie, maar dat is 'up to you' 
Bedankt door: Martijn2008
Offline Martijn2008 - 02/04/2013 13:37
Avatar van Martijn2008 PHP beginner Haha, ik heb op de link die je stuurde een toverdrankje gevonden. In combinatie met je uitleg heb ik nu "de basis" werkend, good job, thanx.

Als ik nou ook nog de categorie kleur erbij wil pakken, dus de categorienaam en kleur. Hoe zit dat in elkaar?

Ik heb nu deze aanpassing daarvoor gemaakt.

  1. foreach ($results as $result) {
  2. $cat = $result->getCategory(); // Verwijderd: ->getName();
  3. if (!isset($pages[$cat])) {
  4. $pages[$cat] = array();
  5. }
  6.  
  7. $pages[$cat][] = $result;
  8. }


Dat levert deze foutmelding op:

  1. Warning: Illegal offset type in isset or empty in ....
Offline WouterJ - 02/04/2013 15:11
Avatar van WouterJ HTML gevorderde wat bevat $cat nu? Want nu doe je op regel 3 $pages[$cat], dan moet $cat natuurlijk wel een string zijn!
Offline Martijn2008 - 02/04/2013 15:34 (laatste wijziging 03/04/2013 12:22)
Avatar van Martijn2008 PHP beginner Category is ook een repository/entity/table. Het bevat verschillende properties: id, name, colour, created_at en ip. Totaal zijn er dus 2 objecten met diverse properties:
- Category: id, name, colour, created_at en ip
- Page: id, title, post, created_at en ip

Ik heb geen idee hoe je dat doet..
Offline WouterJ - 03/04/2013 14:08
Avatar van WouterJ HTML gevorderde - wat doet IP in page en category?
- hoe zijn category en page aan elkaar gelinkt? (zoals ik al zei, heb je een ManyToOne relatie?)
- wat denk je dat er gebeurd als je een object als index in een array gebruikt?
Offline Martijn2008 - 03/04/2013 14:21
Avatar van Martijn2008 PHP beginner Nice. Ik zal het toelichten. IP wil ik niet expliciet iets mee gaan doen, is meer voor het gemak, mocht er ooit eens iets aan de hand zijn dan kan ik misschien daar iets mee... die hoeft dus niet in de template te worden getoond.

De ralatie ziet er visueel als volgt uit:
[Page] ---(0..N)--- hoort bij ---(1..1)--- [Category]

Een pagina hoort altijd bij 1 categorie en een categorie heeft 0 of meerdere pagina's in zich.

Een object als index gebruiken? Dat gaat toch niet werken, in de index van een object wordt een string of integer verwacht, als ik je post van 02/04/2013 15:11 goed begrijp??
Offline WouterJ - 04/04/2013 23:34
Avatar van WouterJ HTML gevorderde
Citaat:
Een object als index gebruiken? Dat gaat toch niet werken, in de index van een object wordt een string of integer verwacht, als ik je post van 02/04/2013 15:11 goed begrijp??

Exact, en kijk nu eens wat jij in je code als index gebruikt?
Offline Martijn2008 - 04/04/2013 23:39
Avatar van Martijn2008 PHP beginner Een object. Ik heb de code aangepast, maar dit vind Symfony ook niet leuk

  1. public function findAllSortedByCategory()
  2. {
  3. $results = $this->getEntityManager()
  4. ->createQuery('SELECT d FROM AcmeCmsBundle:Pages d ORDER BY d.fkCategoryid ASC')
  5. ->getResult();
  6. $item = array();
  7.  
  8. foreach ($results as $result) {
  9. $cat = $result->getFkCategoryid();
  10. $name = $cat->getName();
  11.  
  12. if (!isset($item[$name])) {
  13. $item[$name] = $cat;
  14. $item[$name]['pages'] = $result;
  15. }
  16.  
  17. $item[$name]['pages'] = $result;
  18. }
  19.  
  20. return $item;
  21. }
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.215s