Проблем със tpl engine

slideR

Registered
Правя си template engine за една система. Той работи със tpl файлове, на блоковете запънах. Какво правя до момента
В tpl блоковете са така
<font color="red">{povtorenie.val}<br />{povtorenie.val1}<br /></font>
Така ги сетвам
function set_block_vars($block, $vars = array())
{
$this->tpl_data[$block][] = $vars;
}
Така ръгам стойностите от масива $vars във масива $this->tpl_data
Всичко наред, но във компилаторът нещо немога да се справя. Стигъм до тук
if(preg_match_all("#(.+?)#ism", $code, $matches))
{
for($i=0;$i<count($matches[0]);$i++)
{
echo $this->tpl_data[$matches[1][$i]];
}
}
И край :?. И от там немога да разбера какво да правя. Моля ви за помощ. :oops:
 
Да тук стигнах, но ми вади само първият резултат :?
if(preg_match_all("#(.+?)#ism", $code, $matches))
{
for($i=0;$i<count($matches[0]);$i++)
{
foreach($this->tpl_data[$matches[1][$i]] as $key => $val)
{
foreach($val as $k => $v)
{
$code = preg_replace("#(.+?)#ism", "$1", $code);
$code = str_replace("{{$matches[1][$i]}.{$k}}", $v, $code);
}
}
}
}
 
Не знам какъв ти е кода, но от това, което мисля, че искаш да направиш, защо не сложиш точка преди =?

Код:
$code .= preg_replace("#(.+?)#ism", "$1", $code); 
$code .= str_replace("{{$matches[1][$i]}.{$k}}", $v, $code);
 
Ето ти кода, това, което каза нестава
header("Content-type: text/html; charset=UTF-8");
$path = './';
class Template
{
var $tpl_name = '';
var $tpl_dir = '';
var $tpl_code = '';
var $tpl_data = array();

function load_tpl($dir, $file)
{
$this->tpl_name = $file;
$this->tpl_dir = $dir;
$this->tpl_code = file_get_contents("templates/{$this->tpl_dir}/{$this->tpl_name}.tpl");
}
function set_var($var, $val)
{
$this->tpl_code = preg_replace("#{{$var}}#", "{$val}", $this->tpl_code);
}
function set_vars($vars = array())
{
foreach($vars as $key => $val)
{
$this->tpl_code = preg_replace("#{{$key}}#", "{$val}", $this->tpl_code);
}
}
function set_block_vars($block, $vars = array())
{
$this->tpl_data[$block][] = $vars;
}
function compile($code)
{
// includes
if(preg_match_all("#{include file=\"(.+?)\"}#", $code, $m))
{
for($i=0;$i<count($m[0]);$i++)
{
$code = preg_replace("#{include file=\"{$m[1][$i]}\"}#", file_get_contents($m[1][$i]), $code);
}
}
// blocks
if(preg_match_all("#(.+?)#ism", $code, $matches))
{
$n = '0';
for($i=0;$i<count($matches[0]);$i++)
{
foreach($this->tpl_data[$matches[1][$i]] as $key => $val)
{
foreach($val as $k => $v)
{
$code = preg_replace("#(.+?)#ism", "$1", $code);
$code = str_replace("{{$matches[1][$i]}.{$k}}", $v, $code);
}
}
}
}
return $code;
}
function display()
{
echo $this->compile($this->tpl_code);
}
function parse()
{
$this->tpl_name = '';
$this->tpl_dir = '';
$this->tpl_code = '';
}
}
$template = new Template;
$template->load_tpl("general", "header");
$template->set_vars(array(
"TITLE" => "An_sys v2 - template engine",
"NAME" => "Patrule"
));
mysql_connect('localhost', 'root', '****');
mysql_select_db('an_sys2');
mysql_query("SET NAMES UTF8");
$sql = mysql_query("SELECT * FROM an_sets");
while($row = mysql_fetch_assoc($sql))
{
$template->set_block_vars("povtorenie", array(
"val" => $row['set_id'],
"val1" => $row['set_desc']
));
}
$template->display();
$template->parse();
 
А след
$code = str_replace("{{$matches[1][$i]}.{$k}}", $v, $code);
ако сложиш
echo $code;
изкарва ли ти го?
 
Не, написах така кода изкарва всичко, но най от-горе на страницата и просто нямям идея какда вмъкна променливата там където е самия блок
<?php
header("Content-type: text/html; charset=UTF-8");
$path = './';
class Template
{
var $tpl_name = '';
var $tpl_dir = '';
var $tpl_code = '';
var $tpl_data = array();

function load_tpl($dir, $file)
{
$this->tpl_name = $file;
$this->tpl_dir = $dir;
$this->tpl_code = file_get_contents("templates/{$this->tpl_dir}/{$this->tpl_name}.tpl");
}
function set_var($var, $val)
{
$this->tpl_code = preg_replace("#{{$var}}#", "{$val}", $this->tpl_code);
}
function set_vars($vars = array())
{
foreach($vars as $key => $val)
{
$this->tpl_code = preg_replace("#{{$key}}#", "{$val}", $this->tpl_code);
}
}
function set_block_vars($block, $vars = array())
{
$this->tpl_data[$block][] = $vars;
}
function compile($code)
{
// includes
if(preg_match_all("#{include file=\"(.+?)\"}#", $code, $m))
{
for($i=0;$i<count($m[0]);$i++)
{
$code = preg_replace("#{include file=\"{$m[1][$i]}\"}#", file_get_contents($m[1][$i]), $code);
}
}
// blocks
if(preg_match_all("#(.+?)#ism", $code, $matches))
{
$n = '0';
for($i=0;$i<count($matches[0]);$i++)
{
foreach($this->tpl_data[$matches[1][$i]] as $key => $val)
{
$block_code = $matches[2][$i];
foreach($val as $k => $v)
{
$block_code = preg_replace("#(.+?)#ism", "$1", $block_code);
$block_code = str_replace("{{$matches[1][$i]}.{$k}}", $v, $block_code);
}
echo $block_code;
}
}
}
return $code;
}
function display()
{
echo $this->compile($this->tpl_code);
}
function parse()
{
$this->tpl_name = '';
$this->tpl_dir = '';
$this->tpl_code = '';
}
}
$template = new Template;
$template->load_tpl("general", "header");
$template->set_vars(array(
"TITLE" => "An_sys v2 - template engine",
"NAME" => "Patrule"
));
mysql_connect('localhost', 'root', 'b0r1S40');
mysql_select_db('an_sys2');
mysql_query("SET NAMES UTF8");
$sql = mysql_query("SELECT * FROM an_sets");
while($row = mysql_fetch_assoc($sql))
{
$template->set_block_vars("povtorenie", array(
"val" => $row['set_id'],
"val1" => $row['set_desc']
));
}
$template->display();
$template->parse();
?>
 
Не съм гледал много кода, нямам време в момента, но гледам, че имаш първо
Код:
if(preg_match_all("#(.+?)#ism", $code, $matches))
а след това
Код:
$block_code = $matches[2][$i];

И не разбирам от къде ще вземе $matches[2]
 

Back
Горе