Moin Leutz,
Ich habe ein kleines Tutorial über eine abgespeckte und erweiterte Template-Klasse vom phpBB geschrieben.
Wer das Tutorial gerne mal sehen will:
www.proggen.net/thread.php?threadid=1185
Da wurde auch unteranderem angesprochen, das eval() nur in Schleifen wirklich effektiv sein und bei meiner Anwendung eher eine Performanc-Last.
Ich habe nun einige Tage darüber gerätselt wie ich das eval() in der Methode Parse() umgehen kann, sprich eine alternative zu eval().
Ich benötige ja eval() dazu, weil ich Blöcke in den Templates nutzen will, damit diese später mehrach Ausgegeben werden kann. Sprich:
Blockanfang
Blockende
Alles was dazwischen steht ist als ein Block anzusehen und der HTML-Code dazwischen soll dann bei bedarf auch mehrfach hintereinander ausgegeben werden. Damit sollen mehrere Templates mit nur einer oder ein paar HTML-Code-Zeilen vermieden werden.
So nun tut die Parse() Methode dieses HTML-Kommentar durch eine FOR-Schleife ersetzen, die dann durch eval() ausgeführt wird.
Ich würde gerne ne alternative zu eval() wissen, da ich nach langer Überlegung keine gefunden habe.
Mfg
MrMind
Ich habe ein kleines Tutorial über eine abgespeckte und erweiterte Template-Klasse vom phpBB geschrieben.
Wer das Tutorial gerne mal sehen will:
www.proggen.net/thread.php?threadid=1185
Da wurde auch unteranderem angesprochen, das eval() nur in Schleifen wirklich effektiv sein und bei meiner Anwendung eher eine Performanc-Last.
Ich habe nun einige Tage darüber gerätselt wie ich das eval() in der Methode Parse() umgehen kann, sprich eine alternative zu eval().
Ich benötige ja eval() dazu, weil ich Blöcke in den Templates nutzen will, damit diese später mehrach Ausgegeben werden kann. Sprich:
Blockanfang
Code:
<!-- BEGIN blockname -->
Code:
<!-- END blockname -->
So nun tut die Parse() Methode dieses HTML-Kommentar durch eine FOR-Schleife ersetzen, die dann durch eval() ausgeführt wird.
PHP-Code:
function parse($handle)
{
if( !$this->filename[$handle] )
{
echo "template->parse(): $handle ist nicht vorhanden.";
return false;
}
if( $this->db_use )
{
$sql = "SELECT " . $this->db_code_segment . " FROM " . $this->db_table . " WHERE " . $this->db_search_field . "='" . $this->filename[$handle] . "'";
if( !$result = mysql_query($sql) )
{
echo "template->parse(): Konnte Codesegment nicht laden.";
return false;
}
$str = mysql_fetch_array($result);
$str = $str[0];
}
else
{
$str = implode("",@file($this->filename[$handle]));
}
if( empty($str) )
{
echo "template->parse(): " . $this->filename[$handle] . " ist leer";
return false;
}
$str = str_replace('\'', '\\\'', $str);
$str = str_replace('\\', '\\\\', $str);
$matchcount = preg_match_all('#\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}#is',$str,$matchs);
for($i=0; $i < $matchcount; $i++)
{
$blockname = $matchs[1][$i];
$blockindex = $matchs[3][$i];
$blockname = substr($blockname,0,strlen($blockname) - 1);
$str_to_eval = $this->getBlockRef($blockname,true);
$str_to_eval .= '[\'' . $blockindex . '\']';
$str_to_eval = '\' . ( (isset(' . $str_to_eval . ') ) ? ' . $str_to_eval . ' : \'\') . \'';
$str = str_replace($matchs[0][$i], $str_to_eval, $str);
}
$str = preg_replace('#\{([a-z0-9\-_]*?)\}#is', '\' . ( ( isset($this->blocks[\'.\'][0][\'\1\']) ) ? $this->blocks[\'.\'][0][\'\1\'] : \'\' ) . \'', $str);
$str_zeilen = explode("\n", $str);
$str_zeilen_count = count($str_zeilen);
$block_counter = 0;
$block_name_array = array();
$block_name_array[0] = '.';
for( $i=0; $i < $str_zeilen_count; $i++)
{
$str_zeilen[$i] = chop($str_zeilen[$i]);
if( preg_match('#<!-- ' . $this->block_begin . ' (.*?) -->#si', $str_zeilen[$i], $treffer) )
{
$bn = $treffer[1];
$block_counter++;
$block_name_array[$block_counter] = $bn;
if( $block_counter < 2 )
{
$str_zeilen[$i] = '$' . $bn . '_count = ( isset($this->blocks[\'' . $bn . '.\']) ) ? count($this->blocks[\'' . $bn . '.\']) : 0;';
$str_zeilen[$i] .= "\n" . 'for( $' . $bn . '_i = 0; $' . $bn . '_i < $' . $bn . '_count; $' . $bn . '_i++)';
$str_zeilen[$i] .= "\n" . '{';
}
else
{
$blocks_namespace = substr(implode('.',$block_name_array),2);
$blocks_ref = $this->getBlockRef($blocks_namespace,false);
$str_zeilen[$i] = '$' . $bn . '_count = ( isset(' . $blocks_ref . ') ) ? count(' . $blocks_ref . ') : 0;';
$str_zeilen[$i] .= "\n" . 'for( $' . $bn . '_i = 0; $' . $bn . '_i < $' . $bn . '_count; $' . $bn . '_i++)';
$str_zeilen[$i] .= "\n" . '{';
}
}
else if( preg_match('#<!-- ' . $this->block_end . ' (.*?) -->#si', $str_zeilen[$i], $treffer) )
{
unset($block_name_array[$block_counter]);
$block_counter--;
$str_zeilen[$i] = '}';
}
else
{
$str_zeilen[$i] = 'echo \'' . $str_zeilen[$i] . '\' . "\\n";';
}
}
$str = implode("\n",$str_zeilen);
eval($str);
return true;
}
Mfg
MrMind
Kommentar