Smarty/PHP For each lus

Pagina: 1
Acties:
  • 615 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
In PHP + Smarty ben ik bezig om uit een database categorieën en subcategorieën te halen beiden verdeelt over twee tabellen.

Ik maak gebruik van een for each lus die de hoofdcategorie ophaalt. Daarbinnen staat dan weer een for each lus die de sub categoriën ophaalt en toont wanneer hij bij de hoofdcategorie hoort doormiddel van het id als referentie.

Dit herhaalt zich net zolang de hoofdcategorieën op zijn. Maar het probleem is dat hij alleen de eerste subcategorieën toont.

De oplossing lijkt mij een reset van de for each te doen zodat hij weer opnieuw begint maar ik weet niet hoe en of dat mogelijk is. Ik heb al gekeken op diverse fora's en in de smarty guide maar nog geen antwoord gevonden.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom gebruik je geen join? Join de subcategorieën met de hoofdcategorieën op id, en doe domweg while ($row = mysql_fetch_assoc($resultset)). Dan alleen even bijhouden óf de hoofdcategorie van het huidige record anders is dan die van het vorige en je kan alles weergeven wat je maar wil. :o

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het moet eigenlijk wel in smarty.

Een collega had for each dubbel voorgestelt zodoende.

Acties:
  • 0 Henk 'm!

  • Dennahz
  • Registratie: November 2001
  • Laatst online: 17-09 21:50

Dennahz

Life feels like hell should.

Maar die array die je met Smarty verwerkt vul je toch in je PHP script? Met Smarty kan je ook if en else etc gebruiken hoor. Dit kan prima in 1 loop.

[ Voor 9% gewijzigd door Dennahz op 21-01-2008 11:17 ]

Twitter


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Hoe ziet je code er nu uit dan? En je tabelstructuur? Op deze manier is het alleen maar raden, terwijl wat ik aandraag eigenlijk de meest logische oplossing is, IMO. Waarom wil je het eigenlijk per se in Smarty doen?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
Controleer of je array correct gevuld is en probeer het eens door de verschillende foreach lussen een naam te geven.

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Tabel: categories heeft een uniek id

Deze wordt gebruikt in:

Tabel: categorie_items in een veld categorie_id.

Zo kunnen dus alle velden gekoppeld worden aan elkaar.

De query wordt dan:
SELECT categories.id, categories.categorienaam, category_items.naam
FROM categories
LEFT JOIN category_items ON ( categories.id = category_items.categorie_id )

Maar ik krijg dan categorienaam vaker terug in de lijst met resultaten dat is ook niet de bedoeling.

[ Voor 45% gewijzigd door Verwijderd op 21-01-2008 12:03 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
wackmaniac schreef op maandag 21 januari 2008 @ 11:29:
Controleer of je array correct gevuld is en probeer het eens door de verschillende foreach lussen een naam te geven.
Het zijn twee aparte querys die uitgevoerd worden maar de tweede wordt met een id uit de eerste vergeleken maar de tweede zou telkens overnieuw moeten beginnen maar dat doet hij niet.

Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Dan gebruik je de id uit de ene kolom als array index en dan kan je dit gewoon doenin smarty.

PHP:
1
2
3
{foreach from=$lijst item=i}
  {foreach from=$lijst2[$i.id] item=i2}
    ... etc.

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Gebruik in ieder geval na het joinen in je query ook een order by hoofdcategorie,subcategorie anders kan het flink fout lopen bij het afdrukken. In php bouw je dus gewoon een array op van hoofdcategorieen, en elke hoofdcategorie in deze array (elke key dus) is weer een array met subcategorieen.

In smarty is het dan met een geneste foreach niet zo moeilijk om dit allemaal af te drukken lijkt me :s

edit
Verwijderd schreef op maandag 21 januari 2008 @ 11:33:
Maar ik krijg dan categorienaam vaker terug in de lijst met resultaten dat is ook niet de bedoeling.
Als er meerdere subcats zijn dan klopt dat ook, maar dat betekent niet dat je die hoofdcategorie ook steeds hoeft af te drukken :) Het lijkt mss niet echt logisch om het meerdere keren binnen te halen, maar het is nog altijd beter qua performance dat je het nu in 1 query doet ;)

[ Voor 38% gewijzigd door Verwijderd op 21-01-2008 12:12 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Kanttekening:

Het maakt gebruik van ADODB dus query wordt anders ingevoerd:
// Toon alleen de categorieën die getoond mogen worden!
$categoryAr = $categoryTemp->find("menu_id=$id AND tonen='ja' ORDER BY categorienaam");

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Verwijderd schreef op maandag 21 januari 2008 @ 11:15:
Het moet eigenlijk wel in smarty.

Een collega had for each dubbel voorgestelt zodoende.
Even los van hoe je het wil doen: als je dit soort relatief ingewikkelde dingen met smarty moet doen is er iets mis in je design. De reden waarom het zo moeilijk is om dit soort dingen in Smarty te doen is omdat je nu in feite datasets zit te combineren in je template parser, die hoort dat helemaal niet te doen!

In een eerder topic schreef ik al eens dat het grote voordeel van Smarty is dat je je gegevens eerst zelf goed moet ordenen voor je het naar de template engine stuurt aangezien die het niet voor je kan doen, ik wil je adviseren dit ter harte te nemen. Zet bijvoorbeeld alle gegevens in een enkele array met hoofdcatagory | subcatagory | naam. Is de hoofdcatagory anders dan de vorige hoofdcatagory dan maak je een nieuw kopje, etc.

Nog mooier eigenlijk is een array maken met catagoryType | naam en in smarty afhankelijk van het catagorytype een andere layout weer te geven. Iets meer werk aan de PHP kant, maar een stuk duidelijker en simpeler in de template :)

Dat 'een collega' het anders voorstelt is trouwens irrelevant: als je collega's designfouten maken moet je ze daar op wijzen, doe ik ook altijd - tot groot verdriet van sommige collega's overigens. Je uiteindelijke product wordt er vaak een stuk beter door ;)

//edit
Verwijderd schreef op maandag 21 januari 2008 @ 12:09:
Als er meerdere subcats zijn dan klopt dat ook, maar dat betekent niet dat je die hoofdcategorie ook steeds hoeft af te drukken :) Het lijkt mss niet echt logisch om het meerdere keren binnen te halen, maar het is nog altijd beter qua performance dat je het nu in 1 query doet ;)
Hier sluit ik me bij aan, queries binnen een foreach duiden sowieso bijna altijd op ofwel een fout in je databaseontwerp ofwel een fout in je query-opbouw en zijn bijna altijd enorme resource-hogs.

[ Voor 26% gewijzigd door FragFrog op 21-01-2008 12:43 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Krijg het toch niet voor mekaar. Maar waarschijnlijk komt dat omdat er gewerkt wordt met een aangepaste query:


$categoryAr = $categoryTemp->find("LEFT JOIN category_items ON ( categories.id = category_items.categorie_id ) ORDER BY ");

Basis informatie:
http://phplens.com/lens/adodb/docs-active-record.htm

[ Voor 13% gewijzigd door Verwijderd op 21-01-2008 14:34 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op maandag 21 januari 2008 @ 11:33:
...
De query wordt dan:
SELECT categories.id, categories.categorienaam, category_items.naam
FROM categories
LEFT JOIN category_items ON ( categories.id = category_items.categorie_id )

Maar ik krijg dan categorienaam vaker terug in de lijst met resultaten dat is ook niet de bedoeling.
Verwijderd schreef op maandag 21 januari 2008 @ 14:30:
Krijg het toch niet voor mekaar. Maar waarschijnlijk komt dat omdat er gewerkt wordt met een aangepaste query:

$categoryAr = $categoryTemp->find("LEFT JOIN category_items ON ( categories.id = category_items.categorie_id ) ORDER BY ");

Basis informatie:
http://phplens.com/lens/adodb/docs-active-record.htm
Lukt de query nou wel of niet? En wat gaat er niet goed? Zonder db-structuur kunnen we je hier trouwens zoiezo niet verder mee helpen :?

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 22:05
Verwijderd schreef op maandag 21 januari 2008 @ 14:30:
Krijg het toch niet voor mekaar. Maar waarschijnlijk komt dat omdat er gewerkt wordt met een aangepaste query:


$categoryAr = $categoryTemp->find("LEFT JOIN category_items ON ( categories.id = category_items.categorie_id ) ORDER BY ");

Basis informatie:
http://phplens.com/lens/adodb/docs-active-record.htm
Wat betekend, "Krijg het toch niet voor elkaar"? Wat werkt er niet en wat heb je al geprobeerd?

Ik zou je willen aanraden om gebruik te maken van de [code=php] [/code] tags. :)

Ik lijk wel een modje, zo 8)7

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Oftewel: kijk even naar Programming Beleid - De Quickstart zodat je voldoende informatie geeft ;)
Met "het werkt niet" kunnen we je echt niet helpen.

[ Voor 14% gewijzigd door Creepy op 21-01-2008 15:56 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De query wordt niet uitgevoerd omdat er gewerkt wordt met ADODB.

Die werkt anders met querys dan normale SELECT * FROM tbl WHERE enz enz.

De query zelf is wel juist die heb ik getest in phpmyadmin en doet het uitstekend.

Dus het zit hem in ADODB waar ik nog geen oplossing voor heb gevonden.

Acties:
  • 0 Henk 'm!

Verwijderd

zie puntje 12, error handling. Met de gegeven info kunnen wij je zo toch echt weinig verder helpen. Door te zeggen 'de query werkt wel in phpmyadmin' en 'het zit hem in adodb' komen we hier niet veel verder.

Wat werkt er dan niet in adodb?
Any errors?
Wat werkt er niet? Vreemde output of iets anders?

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Verwijderd schreef op maandag 21 januari 2008 @ 20:39:
De query wordt niet uitgevoerd omdat er gewerkt wordt met ADODB.

Die werkt anders met querys dan normale SELECT * FROM tbl WHERE enz enz.

De query zelf is wel juist die heb ik getest in phpmyadmin en doet het uitstekend.

Dus het zit hem in ADODB waar ik nog geen oplossing voor heb gevonden.
Hmmm, als het echt in ADODB zit dan moet je die ertussenuit halen. Of je pakt gewoon even de handleiding van ADODB erbij om even te kijken hoe je het moet herschrijven, want afaik kan je in adodb ook gewoon select * query's invoeren

Query's in loopjes zijn nooit aan te raden.
6 hoofdcategorieen lijdt al tot minimaal 7 query's.

P.S. Waarom gebruik je trouwens smarty en ADODB? Niet lullig bedoeld, maar je gebruikt het op een inefficiente manier die het alleen maar vertraagt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is een standaard die gebruikt wordt bij ons op het werk. Een frame dat voorzien is van verschillende functies/procedures en mogelijkheden wat programmeerwerk scheelt.

Ik heb het probleem opgelost met php in smarty niet al te netjes maar het werkt.

Bedankt voor jullie hulp!

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Verwijderd schreef op dinsdag 22 januari 2008 @ 10:30:
Het is een standaard die gebruikt wordt bij ons op het werk. Een frame dat voorzien is van verschillende functies/procedures en mogelijkheden wat programmeerwerk scheelt.

Ik heb het probleem opgelost met php in smarty niet al te netjes maar het werkt.

Bedankt voor jullie hulp!
Hmmm, ik zou toch maar even wat vraagtekens bij deze standaard gaan zetten, lullig gezegd :
Jij gebruikt het verkeerd,
Je collega geeft verkeerde adviezen.
Je zit nu een interne standaard (ADODB) te omzeilen om een simpele left join query werkend te krijgen.

Dat het programmeerwerk scheelt daar zet ik hele grote vraagtekens bij in jullie situatie. Het kan een boel programmeerwerk schelen als je de adviezen van FragFrog eerst eens goed toepast.

Ik vermoed dat door jouw niet al te nette oplossing iemand die bedreven is in smarty / php / adodb eerst eens 5x moet kijken voordat hij snapt hoe je het doet waardoor het hele nut van smarty / adodb verdwijnt, want het is niet meer gestructureerd. En soms is het nodig om je framework te omzeilen, maar voor zoiets als dit, niet echt...
Pagina: 1