Gå til innhold

Loop i template system?


Anbefalte innlegg

Hei, bruker nå følgende funksjon i template systemet mitt.

<?php
function template($file) {
if($file) {
 echo preg_replace('/\{(.*?):(.*?)\}/e',
                       'ReplaceVar(\'${1}\', \'${2}\')', 
                       file_get_contents('templates/'. admin('template') .'/'. $file .'.tpl'));
}
}
?>

 

Men vil loope noe som ligger i en fil. Hvordan kan jeg enklest klare det? Det som skal loopes ligger mellom /* Loop */ og /* /Loop */. (Helst uten eller en annen metode hvis det ikke er store problemet..)

Lenke til kommentar
Videoannonse
Annonse

hmm, en ide som kanskje kunne funket er noe lignende dette:

FIL:

html
mer html

/loop
 Det du vil "loope"
/loop ferdig

resten av html

 

php

$fil = file("filen.htm");

$GetFile = "";
$GetLoop = array();
$LoopIndex = 0;

foreach ($fil as $linje => $innhold) {

$check = str_replace("
", "", $innhold); // fjerner "ny linje" tegnet som kommer med på hver linje.  

if ($check == "/loop") {
   $catchLoop = 1;
 }

 if ($check == "/loop ferdig") {
   $catchLoop = 0;
 }
 $GetFile .= $innhold

 if ($catchLoop == 1) {
   $GetLoop[$LoopIndex] = $innhold;
   $LoopIndex++;
 }
}


$i = 1; // hopper over første linje i det som skal kopieres (fordi dette er /loop)

while ($i < sizeof($GetLoop)-1) { // hopper over siste linje (-1)
 $theLoop .= $GetLoop[$i];
 $i++;
}

//Så har du innholdet som du kan loope så mye du vil med.

 

 

Kanskje ikke en så altfor enkel og forklarende kode jeg har skrevet, men får håpe den hjalp.

Endret av robgar
Lenke til kommentar

Forstod ikke helt den.

 

Det som skal "loopes" skal "loopes" x ganger ut ifra en variabel som tidligere er satt. Filen ser noe slik ut:

<table width="687" border="0" cellspacing="0" cellpadding="0">
 <!-- loop -->
 <tr>
   <td>{DATA:forum_name}</td>
 </tr>
 <!-- /loop -->
</table>

(Endret start og avsluttningstaggen, det endret jeg også i koden du viste).

 

Alt mellom { og } skal også byttes ut ved hjelp av funksjonen over.

 

Har funnet en enkel løsning, men det er helt sikkert ikke den beste metoden. Så om noen da kunne hjulpet meg med å optimalisere den?

 

$fil = file_get_contents("forum.tpl");

$loop = explode("<!-- loop -->", $fil);

$loop_del = explode("<!-- /loop -->", $loop[1]);

echo $loop[0];

$i = 0;

while($i < 10) {
echo $loop_del[0];
$i++;
}

echo $loop_del[1];

Lenke til kommentar

<table width="687" border="0" cellspacing="0" cellpadding="0">
<!-- loop -->
<tr>
  <td>{DATA:forum_name}</td>
</tr>
<!-- /loop -->
</table>

 

 

$fil = file("filen.htm");

$GetFile = "";
$GetLoop = array();
$LoopIndex = 0;

foreach ($fil as $linje => $innhold) {

$check = str_replace("
", "", $innhold); // fjerner "ny linje" tegnet som kommer med på hver linje.  

if ($check == "<!-- loop -->") {
  $catchLoop = 1;
  $GetFile .= "{loopaSkalByttesUtHer}";
}
elseif ($check == "<!-- /loop -->") {
  $catchLoop = 0;
}
else {
  $GetFile .= $innhold
 }

if ($catchLoop == 1) {
  $GetLoop[$LoopIndex] = $innhold;
  $LoopIndex++;
}
}


$i = 1; // hopper over første linje i det som skal kopieres (fordi dette er /loop)

while ($i < sizeof($GetLoop)-1) { // hopper over siste linje (-1)
$theLoop .= $GetLoop[$i];
$i++;
}

// Så kommer funksjonen din som bytter ut hvert forum :

// Fiktiv løkke.... Hvet ikke funksjonen din;)

$i = 0;
$antall = 10;

while ($i < $antall) {
 $byttesUT = "data fra sql";
 $FINISHED_LOOP .= str_replace("{DATA:forum_name}", $byttesUT, $theLoop);
 $i++;
}

// Nå har 2 viktige stringer, template stringen, uten loop delen, og selve loopdelen (med alt som skal "loopes". Disse setter vi nå sammen og printer.

$output = str_replace("{loopaSkalByttesUtHer}", $FINISHED_LOOP, $GetFile);
print $output;

 

Mener denne her skal funke nå...

Det den gjør er

1. hente inn template filen i en string ($GetFile)

2. Sjekke at tegnet for loop kommer

3. Og når det kommer, setter den det som skal loopest i egen array ($GetLoop)*

4. Legger til {loopaSkalByttesUtHer} på $GetFile for å bytte ut den ferdige listen i slutten av scriptet.

5. Når loop slutt tegnet kommer, henter den inn resten av temp. filen i $GetFile.

 

6. Gjør arrayet($GetLoop) om til en string ($theLoop), men hopper over første og siste linje, da disse linjene er tegnet i templaten.

 

7. så må du legge inn alle forumnavnene, og derreter:

8. Erstater den {loopaSkalByttesUtHer} med hele listen, i template stringen, og du har en output noe alla denne:

 


<table width="687" border="0" cellspacing="0" cellpadding="0">
<tr>
  <td>Generell diskusjon</td>
</tr>

<tr>
 <td> Off topic </td>
</tr>
</table>

 

Håper jeg nå klarte å gjøre koden forståelig..

Endret av robgar
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...