login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[Symfony2] Pagina's categoriseren en selecteren op status

Offline Martijn2008 - 08/04/2013 13:54 (laatste wijziging 08/04/2013 16:05)
Avatar van Martijn2008PHP beginner Hallo allemaal,

Bedankt alvast voor het lezen van mijn topic. Deze topic komt voort uit mijn vorige topic:
[Symfony2] Hoe ....c.m. twig

Mijn vorige topic biedt een oplossing, echter is gebleken dat hetgeen dat ik wil wat complexer is. Vandaar deze nieuwe topic.

Voor het gemak zal ik nog even de kardinaliteit van de ralatie herhalen. 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.

Het gaat dus om 2 objecten:
1.) Category
2.) Page

Inmiddels heb ik op advies van WouterJ een OneToMany relatie gelegd tussen object Category en Page. Nu staan alle pagina's netjes geordend onder de category, zoals omschreven staat in mijn vorige topic. Ook zijn alle properties van beide objecten netjes beschikbaar.

Nu, met deze topic, wil ik een stapje verder: een pagina heeft namelijk ook een status: Niet gepubliceerd, Concept, Gepubliceerd. Deze benaming komt voort uit een derde object die middels property fkStatusid via object pagina is gelinkt. Je kunt ervan uitgaan dat een pagina altijd een status heeft.

Ik weet nu, dat ik hiervoor gebruik moet maken van een zogenaamde repositoryclass. Ondertussen heb ik die geschreven.

  1. <?php
  2.  
  3. // src/Acme/CmsBundle/Entity/CategoryRepository.php
  4.  
  5. namespace Acme\CmsBundle\Entity;
  6.  
  7. use Doctrine\ORM\EntityRepository;
  8.  
  9. class CategoryRepository extends EntityRepository
  10. {
  11. public function findAllPagesByStatus($status)
  12. {
  13. $results = $this->getEntityManager()
  14. ->createQuery('SELECT d FROM AcmeCmsBundle:Category d ORDER BY d.name ASC')
  15. ->getResult();
  16. $item = array();
  17.  
  18. foreach ($results as $result)
  19. {
  20. $pages = $result->getFkPageid();
  21.  
  22. // Plaats category item in de array
  23. $item[$result->getName()][] = $result;
  24.  
  25. foreach($pages as $record)
  26. {
  27. // Controleer of een pagina de juiste status heeft
  28. if($record->getFkPageid()->getfkStatusid() == $status)
  29. {
  30. // Plaats de pagina bij de juiste category in de array
  31. $item[$result->getName()]['pages'][] = $record;
  32. }
  33. }
  34. }
  35. return $item;
  36. }
  37. }
  38.  
  39. ?>


Ik denk dat deze klasse goed is, echter weet ik dat niet zeker. Ook heb ik geen idee hoe ik de twig template moet schrijven.

Mijn vraag is daarom, klopt deze klasse en hoe schrijf ik mijn twig template?

Alvast bedankt.

Martijn

4 antwoorden

Gesponsorde links
Offline UpLink - 08/04/2013 15:22
Avatar van UpLink ... Twig tut

Ben je hier wat mee?
Offline Martijn2008 - 08/04/2013 21:59 (laatste wijziging 09/04/2013 12:36)
Avatar van Martijn2008 PHP beginner Hi UpLink,
Bedankt voor de link naar de tutorial. Het is een praktische link voor de beginner met Twig, de tutorial schiet helaas tekort voor mijn situatie.

Ik ben nu al een tijdje bezig met het Symfony2 Framework (aanrader), waar Twig standaard ingebakken zit, dus de basic's snap ik.
Het betreft een complexe situatie, het is daarom handig je bedreven bent met het Symfony2 Framework.
Dus mocht je ook een app willen bouwen, dan is het slim om dat framework te kiezen, dan kunnen we elkaar helpen. 

Deze forum post moet je eigenlijk wat breder zien dan enkel en alleen Twig. Het gaat om het geheel: het ophalen van gegevens, het bewerken van die gegevens en tenslotte het tonen van de opgehaalde gegevens op het scherm.
Doe ik dit op de juiste manier (zie code hierboven en mijn vorige forum post) en hoe schrijf ik dan correct de twig template?

Kan ik het oplossen door een INNER JOIN met Doctrine2 te schrijven in de category repository class?
Offline WouterJ - 09/04/2013 13:38
Avatar van WouterJ HTML gevorderde Goed, ons doel is natuurlijk dat je over een poosje dit soort vragen niet meer op het forum hoeft te plaatsen. Daarom laat ik je even zelf nadenken:

Leg mij eens van elke regel in de CategoryRepository#findAllPagesByStatus() method uit wat het doet (wat haalt het op, wat regelt het, wat controleert het, waarom?, ect.).
Offline Martijn2008 - 09/04/2013 15:15 (laatste wijziging 11/04/2013 13:45)
Avatar van Martijn2008 PHP beginner Slim idee, daar heb je gelijk in, ik heb de code van commentaar voorzien en geplaatst op plaatscode.be.

Voor het gemak heb ik ook even de repositories erop gezet:
1.) Category
2.) Status
3.) Page

Via Symfony IRC heb ik begrepen dat het ook mogelijk moet zijn met Doctrine Query Language (DQL), dat heeft geresulteerd tot de volgende code.

  1. <?php
  2.  
  3. // src/Acme/CmsBundle/Entity/CategoryRepository.php
  4.  
  5. namespace Acme\CmsBundle\Entity;
  6.  
  7. use Doctrine\ORM\EntityRepository;
  8.  
  9. class CategoryRepository extends EntityRepository
  10. {
  11. public function findAllPagesByStatus($status)
  12. {
  13. $results = $this->getEntityManager()
  14. ->createQueryBuilder('c')
  15. ->select('c, p')->leftJoin('c.pages', 'p')
  16. ->where($qb->expr()
  17. ->like('p.fkStatusid', ':status'))
  18. ->setParameter('status', $status)
  19. ->getResult();
  20. return $results;
  21. }
  22. }
  23.  
  24. ?>


De code hierboven geeft de volgende foutmelding:

  1. Notice: Undefined offset: 0 in .....


Ik weet nu niet meer precies hoe ik het aan moet pakken. Iemand een idee?
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.199s