Behöver hjälp med mitt blivande template system

Avdelningen för webbrelaterad programmering och grafisk design.
Post Reply
Adam4444
Posts: 79
Joined: 2006-06-15 11:37:59

Behöver hjälp med mitt blivande template system

Post by Adam4444 »

Jag håller på och utvecklar ett template system pga av att jag tycker Smarty är alldeles för stort. Med stort så menar jag att det har så många inställningar och funktioner så att man blir yr.

Så här ser det ut nu:

Code: Select all

<?php
class SimpleTemplateSystem {
// Sökvägen till mappen där template filerna ligger
public $mTemplateDir = "templates";

// Array som lagrar alla template variablar
private $mpVars = array();

// Metod som sätter template variabel
public function SetVar($name, $value) {
$this->mpVars[$name] = $value;
}

// Metod som visar en template fil
public function Display($templateFile) {
extract($this->mpVars);
include("{$this->mTemplateDir}/$templateFile" );
}
}
?>
Det fungerar bra men i självaste template filen så måste man skriva <?=$variabel?> för att få ut ett värde ifrån en template variabel. Nu vill jag göra det på ett smidigare sätt; exakt som Smarty gör det dvs det räcker med att skriva {$variabel}.

Hur ska jag lösa det? Jag har provat med file_get_contents() i kombination med preg_replace() men det gick inge vidare...
User avatar
derfian
Posts: 472
Joined: 2004-02-13 0:18:46
Location: Dorotea / Linköping
Contact:

Re: Behöver hjälp med mitt blivande template system

Post by derfian »

Adam4444 wrote:Hur ska jag lösa det? Jag har provat med file_get_contents() i kombination med preg_replace() men det gick inge vidare...
Du måste ge mer info om vi ska hjälpa dig.
Adam4444
Posts: 79
Joined: 2006-06-15 11:37:59

Post by Adam4444 »

Just nu ser det ut såhär:

Code: Select all

<?php
class SimpleTemplateSystem {
    // Sökvägen till mappen där template filerna ligger
	public $mTemplateDir = "templates";
	
	// Template filens öppnings märken motsvarande PHPs
	private $mpOpeningTags = array("{", "}");
	
	// Template filens kommenatar tecken motsvarande PHPs /* och */
	private $mpCommentTags = array("*", "*");
	
	// Array som lagrar alla template variablar
	public $mpVars = array();
	
	// Metod som sätter template variabel
	public function SetVar($name, $value) {
	    $this->mpVars[$name] = $value;
	}
	
	// Metod som parsar och visar en template fil
	public function Display($templateFile) {
		ob_start();
		extract($this->mpVars);
		include("{$this->mTemplateDir}/$templateFile");
		$template_file = ob_get_contents();
		// Ersätt template filens öppnings tecken med PHP öpppnings tecken
		$template_file = preg_replace("/{$this->mpOpeningTags[0]}/", "<?php ", $template_file);
		$template_file = preg_replace("/{$this->mpOpeningTags[1]}/", " ?>", $template_file);
		
		// Ersätt template filens kommentars tecken (*) med PHP kommentar tecken /* */
		$template_file = preg_replace("/{$this->mpCommentTags[0]}/", "/*", $template_file);
		$template_file = preg_replace("/{$this->mpCommentTags[1]}/", "*/", $template_file);
		ob_end_clean();
		return $template_file;
	}
}
?>
Om jag sedan testar klassen med följande:

Code: Select all

<?php
require_once "simple_template_system.php";
$page = new SimpleTemplateSystem();
$page->SetVar("blha", "Hej!");
echo $page->Display("blha.tpl");
?>
Och template filen blha.tpl:

Code: Select all

{echo $blha;}
Då är det tänkt att "{" ska ersättas med "<?php " och "}" med " ?>.
Men sedan när jag går til sidan så skrivs inte variabeln $blha ut.

Ganska svårt att felsöka också...

Hopaas det var tillräckligt med info för att ni ska kunna hjälpa mig ;)
User avatar
derfian
Posts: 472
Joined: 2004-02-13 0:18:46
Location: Dorotea / Linköping
Contact:

Post by derfian »

Felet ligger gissningsvis i regexparna, jag håller på att hackar på en php4-modifierad version av ditt templatesystem, postar när det funkar.
User avatar
derfian
Posts: 472
Joined: 2004-02-13 0:18:46
Location: Dorotea / Linköping
Contact:

Post by derfian »

Adam4444
Posts: 79
Joined: 2006-06-15 11:37:59

Post by Adam4444 »

Okej tack så mycket för hjälpen! Det där med kommenatarerna vet jag inte riktigt, jag tycker nog bättre om * och * som Smarty har. Fast det kan jag ju ändra själv.

Ännu en gång tack!
Adam4444
Posts: 79
Joined: 2006-06-15 11:37:59

Post by Adam4444 »

Någon som vet hur jag ska göra så att det blir möjligt att utföra vanliga PHP satser i mina template filer (alltså imellan { och }) - nu skriver den ju ut allt imellan { och }, så om jag tex kör en if sats så skrivs det ju bara ut 1 eller ingenting... Några idéer?

Btw jag insåg nu hur dumt och svårt det var med * och * som kommentar symboler. :-[
User avatar
derfian
Posts: 472
Joined: 2004-02-13 0:18:46
Location: Dorotea / Linköping
Contact:

Post by derfian »

Uppdaterade tidigare postad länk med kodexekvering.
Adam4444
Posts: 79
Joined: 2006-06-15 11:37:59

Post by Adam4444 »

derfian wrote:Uppdaterade tidigare postad länk med kodexekvering.
Tack så mycket. Du är en klippa! Nu får jag nog ta och lära mig regex så jag slipper fråga varje gång jag ska göra någon ändring i mitt template system.
Adam4444
Posts: 79
Joined: 2006-06-15 11:37:59

Post by Adam4444 »

Okej så här blev det till slut för er som är intresserade av att använda er av det:

Code: Select all

<?php
/*************************************/
/*     SIMPLE TEMPLATE SYSTEM              */
/*     CREATED BY Adam Lundvall SWE        */
/*     Version: 0.3                                             */
/*     License: GPL                                            */
/*     Thanks to: defian from www.64bits.se */
/*************************************/
class SimpleTemplateSystem {
    public $mTemplateDir = "templates";
    private $mOpeningTags = array("\{", "\}");
    private $mCommentTags = array("\*", "\/\*");
   
    // Array som lagrar alla template variablar
    private $mVars;
   
    // Metod som sätter template variabel
    public function SetVar($name, $value) {
        $this->mVars[$name] = $value;
    }
   
    // Metod som parsar och visar en template fil
    function Display($templateFile) {
	    extract($this->mVars);
        // Läs in template
        $template_file = file_get_contents($this->mTemplateDir."/".$templateFile);

        // Variablar: {$variabel}
        $varmatch = "/".$this->mOpeningTags[0]."\\$([A-z]+)".$this->mOpeningTags[1]."/";
        $template_file = preg_replace($varmatch,'<?php echo \1; ?>',$template_file);

        // Exekvera php-kod: {@Kod@}
        $varmatch = "/".$this->mOpeningTags[0]."@(.*)@".$this->mOpeningTags[1]."/";
        $template_file = preg_replace($varmatch,'<?php \1 ?>',$template_file);

        // Kommentarer: {*}Kommentar{/*}
        $template_file = preg_replace("/\{".$this->mCommentTags[0]."\}/", "<?php /*", $template_file);
        $template_file = preg_replace("/\{".$this->mCommentTags[1]."\}/", "*/ ?>", $template_file);

        // "Kör" templatets generarade kod.
        return eval("?>".$template_file);
    }
}
?>
Post Reply