[smarty] Categorieën in een loop, hoe?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Ariën  -
Beheerder

- Ariën -

31/05/2017 22:10:56
Quote Anchor link
Ik hoop dat er hier kenners van Smarty zitten, want ik zit met een vraagstukje waar ik niet uit kom.

Hoe kan ik binnen een loop alle items groeperen op een bepaald categorie-veld?
Ik doel dus op een structuur zoals dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
-Train A
 2101
 2102
-Train B
 2103
- Train C
 2104


Op dit moment heb ik deze array in mijn console, met een categorienaam bij elk item.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Smarty_Variable Object (3)
->value = Array (9)
  0 => Array (8)
    nummer => "2101"
    opmerkingen => ""
    aflevering => "0000-00-00"
    indienststelling => "0000-00-00"
    gesloopt => "2007-02-15"
    status => "Gesloopt"
    categorie => "Train A"
  1 => Array (8)
    nummer => "2102"
    opmerkingen => ""
    aflevering => "0000-00-00"
    indienststelling => "0000-00-00"
    gesloopt => "0000-00-00"
    status => "Gesloopt"
    categorie => "Train A"
  2 => Array (8)
    nummer => "2103"
    opmerkingen => ""
    aflevering => "0000-00-00"
    indienststelling => "0000-00-00"
    gesloopt => "0000-00-00"
    status => "Gesloopt"
    categorie => "Train B"
  3 => Array (8)
    nummer => "2104"
    opmerkingen => ""
    aflevering => "0000-00-00"
    indienststelling => "0000-00-00"
    gesloopt => "2007-02-16"
    status => "Gesloopt"
   categorie => "Train C"
->nocache = false
->scope = "Smarty root"


Mijn Smarty-code in mijn template is dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
{section name=nummers loop=$nummer_list}
<tr>
    <td>
        <a href="/spots/{$nummer_list[nummers].nummer}">{$nummer_list[nummers].nummer}</a>
    </td>
    {* Meer onrelevante informatie stond hier! etc... etc... *}
</tr>
{/section}


Hoe kan dit dit toevoegen?

Ik weet wel dat dit in PHP met zoiets kan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$result
= mysqli_query($conn, $sql);
$previousItem = '';

while($data = mysqli_fetch_assoc($result))
{

  if( $previousItem != $data['categorie'] )
  {

    echo '<h1>'.$data['categorie'] ).'</h1>';
    $previousItem = $data['categorie'];
  }


  echo '<tr>
           <td>Nummer: '
.$data['nummer'].'</td>
        </tr>'
;
}

?>

Maar hoe doe je dit in Smarty?
Kenners hier in this house?
Gewijzigd op 31/05/2017 22:13:07 door - Ariën -
 
PHP hulp

PHP hulp

04/05/2024 23:49:33
 
Thomas van den Heuvel

Thomas van den Heuvel

01/06/2017 03:15:42
Quote Anchor link
Moet het in Smarty? PHP is zelf een prima template engine :p.

Je zult ongeveer hetzelfde moeten doen als in PHP, dus iets met assign (om een waarde tijdens een loop te onthouden) en een if-statement.

Maar wat je dan doet is in Smarty nog eens dunnetjes overdoen wat je in PHP al kon doen. In dit geval lijkt het mij dat Smarty het verkeerde gereedschap is voor de klus.

Het meeste wat je in Smarty kunt doen kan ook prima in PHP zelf. Waarom zou je een alternatieve syntax voor dezelfde functionaliteit willen hebben? Los daarvan, je bent hier een hoop logica in een (pseudo) template-taal aan het proppen :/.

En als het de bedoeling is dat hier non-programmeurs aan kunnen freubelen... Maak in plaats hiervan een klasse waarmee je gecategoriseerde lijsten kunt configureren ofzo. Kan er ook niets gebroken worden.

Ben benieuwd waarom je bedacht hebt dat dit in Smarty zou moeten.
 
- Ariën  -
Beheerder

- Ariën -

01/06/2017 08:29:39
Quote Anchor link
Mijn CMS gebruikt nu eenmaal Smarty, en dat pas je niet even zomaar aan ;-).

In mijn ogen is dit een meer een stukje logica wat prima in Smarty zou kunnen. Of het netjes is, is een tweede. Maar op welke manier zou jij het dan doen? En een hoop logica, dat is wel erg overdreven gezegd, Thomas.... Het zijn maar drie regeltjes met vergelijking en toewijzing.

Ikzelf heb inmiddels gevonden dat er een {assign} variabele in Smarty bestaat. Nu maar hopen dat deze overschreven kan worden. Dan zou het moeten werken, maar dat moet ik nog even uittesten.

Keep fingers crossed....
 
Thomas van den Heuvel

Thomas van den Heuvel

01/06/2017 12:56:04
Quote Anchor link
- Ariën - op 01/06/2017 08:29:39:
Mijn CMS gebruikt nu eenmaal Smarty, en dat pas je niet even zomaar aan ;-).

Dat betekent dan toch ook dat jij de architect bent? Dit was een bewuste ontwerpbeslissing dan? Wat is de redenatie hiervoor dan?

- Ariën - op 01/06/2017 08:29:39:
Maar op welke manier zou jij het dan doen?

Deze rommel simpelweg niet gebruiken.

- Ariën - op 01/06/2017 08:29:39:
Ikzelf heb inmiddels gevonden dat er een {assign} variabele in Smarty bestaat.

Dat gaf ik hierboven ook al aan. < 5 minuten googlen.
 
- Ariën  -
Beheerder

- Ariën -

01/06/2017 12:59:24
Quote Anchor link
Het ontwerp van de architectuur van het CMS staat los van deze scope. Dus ik snap niet waarom je zo op tegen bent. Met rants zoals 'Rommel' schiet ook niemand wat op.

Gelieve je in het vervolg wat positiever op te stellen.

In ieder geval lijkt het probleem getackeld.
Gewijzigd op 01/06/2017 13:00:10 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

01/06/2017 13:13:58
Quote Anchor link
Actually, no. Bij vraagstukken op het forum kijk ik altijd of de ingeslagen weg wel een goede is. Ik geef niet enkel een oplossing zonder context. De oplossing is in zekere zin niet relevant. Het gaan om de motivatie voor een aanpak, want daaruit blijkt of iemand snapt waar 'ie mee bezig is en kan hem/haar verder sterken in de gekozen oplossing.

Als ik denk dat de aanpak onjuist is zal ik dat niet onder stoelen of banken steken. Smarty is een middel, geen doel. Blijkbaar is het voor jou toch belangrijk dat het op deze manier moet. Dit begrijp ik niet, en blijkbaar kun je dat ook niet echt motiveren.

Het ontwerp en de architectuur lijken mij juist belangrijk in dit vraagstuk. Immers, je had zelf al in PHP een oplossing klaarliggen, maar je probeert nu uit te zoeken hoe dit in Smarty zou moeten. Dit klinkt als het proberen een barricade te overkomen die je zelf hebt opgeworpen. Ik zou zeggen, neem de barricade weg dan heb je dit probleem in eerste instantie niet.

Daarbij gaf ik trouwens aan hoe het op te lossen zou moeten zijn (middels de assign constructie), misschien had ik duidelijker moeten zijn dat dit (ook) een Smarty-ding is.
Gewijzigd op 01/06/2017 13:16:30 door Thomas van den Heuvel
 
- Ariën  -
Beheerder

- Ariën -

01/06/2017 13:18:26
Quote Anchor link
Ooit en later ga ik Smarty uitfaseren, maar je zult toch echt moeten begrijpen dat dat niet eenvoudig is.
Planning, kosten, aanpassing aan de architectuur. Dat gaan niet altijd over één nacht ijs. En ik heb een vermoeden dat jij dat ook wel zou weten.

Probeer je meer op de vraag van de topicstarter te focussen i.p.v. vooral naar het geheel en de nadelen te kijken.

Hier de code voor de liefhebbers:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
{assign var="previousItem" value=""}
{section name=nummers loop=$data}
{if $previousItem != $data[nummers].Subcategory}  
    <tr>
        <td colspan="6"><b>{$data[nummers].Subcategory}</b></td>
    </tr>
{assign var="previousItem" value=$data[nummers].Subcategory}
{/if}
    <tr>
        <td>{! uitvoer van data hier *}</td>
    </tr>
Gewijzigd op 01/06/2017 17:02:45 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

01/06/2017 13:22:13
Quote Anchor link
- Ariën - op 01/06/2017 13:18:26:
Planning, kosten, aanpassing aan de architectuur. Dat gaan niet altijd over één nacht ijs. En ik heb een vermoeden dat jij dat ook wel zou weten.

Zeker, en daarom denk ik ook altijd goed na voordat ik ergens aan begin.
 
- Ariën  -
Beheerder

- Ariën -

01/06/2017 13:24:53
Quote Anchor link
Thomas van den Heuvel op 01/06/2017 13:22:13:
- Ariën - op 01/06/2017 13:18:26:
Planning, kosten, aanpassing aan de architectuur. Dat gaan niet altijd over één nacht ijs. En ik heb een vermoeden dat jij dat ook wel zou weten.

Zeker, en daarom denk ik ook altijd goed na voordat ik ergens aan begin.

True, maar er bestaat ook vaak legacy-code, wat niet 1-2-3 om te bouwen is.
Smarty gebruik ik al 10 jaar met plezier, en ombouw kost mij voorlopig teveel tijd, hoewel ik het graag anders wil. Een template-set van honderden templates ombouwen is ook niet zo gedaan.

Lang leve roadmap's die je planning op pijl houden. Anders blijf je na 5 jaar bezig met hetzelfde project.
Gewijzigd op 01/06/2017 13:27:08 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

01/06/2017 13:27:39
Quote Anchor link
En hoe langer je wacht, hoe meer pijn het zal doen.
 
- Ariën  -
Beheerder

- Ariën -

01/06/2017 13:30:52
Quote Anchor link
Zo vlot zal dat niet gaan. En ik ben al blij dat ik de architectuur van mijn CMS al flink heb aangepast zodat het weer robuuster en toekomstbestendiger wordt. Smarty wordt nog steeds ontwikkeld, dus ik zie dat niet echt als Technical Debt.

Thomas van den Heuvel op 01/06/2017 13:13:58:
Blijkbaar is het voor jou toch belangrijk dat het op deze manier moet. Dit begrijp ik niet, en blijkbaar kun je dat ook niet echt motiveren.

Misschien moet je dat toch maar eens gaan begrijpen. In mijn eerste reply gaf ik al aan dat het niet makkelijk anders kan. Waarom moet ik mij verantwoorden over mijn architectuur van mijn applicatie die jij misschien wel 'ruk' kan vinden, maar ik zelf niet?

Persoonlijk had ik het overigens prettiger gevonden als je minder op je eigen oplossing stond te hameren. Respecteer gewoon dat JOUW oplossing NIET ALTIJD even makkelijk kan worden uitgevoerd! Zie het als een berg zand die je wilt verplaatsen van de ene kant van de weg naar de andere kant. Je kan een shovel gebruiken en de boel in één keer verplaatsen. Maar dat kost een hoop werk om dat te huren en een hoop tijd om de weg af te laten zetten omdat je een vergunning moet hebben. Terwijl een kruiwagen op dit moment veel eenvoudiger is, maar wat meer tijd kost.

Een advies geven is prima. Maar geef dan ook twee wegen als je oplossing een basale aanpassing is: De beste weg en de snelste weg die een hobbelpad gaat.

Een beetje meedenken kan echt geen kwaad.

Anyway, voor nu is het opgelost!
Gewijzigd op 02/06/2017 18:24:09 door - Ariën -
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.