easy PHP templates  

Posted in

Creating templates for *SQL query output
or other data with many rows and fixed number of columns.

(Русское описание ниже(: )


$arrayForTable = array(
array ('COL1'=>1, 'COL2'=>2),
array ('COL1'=>3, 'COL2'=>4)
);
echo buildFormattedCycledArray($arrayForTable, 'small_table.tmp');
function buildFormattedCycledArray($inArray, $template) {
$template = '_templates/'.$template;
if(!file_exists($template) or sizeof($inArray)==0) {
return null;
}
$data = file_get_contents($template);
$keywords = array();
$columns = array();
preg_match_all("/([\d\D\n\r]*)#begin#([\d\D\n\r]*)#end#([\d\D\n\r]*)/i", $data, $keywords);
preg_match_all("/\{(\w+)\}/i", $keywords[2][0], $columns);
$cell_row_templ = $keywords[2][0];
$ret_data = '';
$page_data = '';
$ret_data .= $keywords[1][0];
$arr_counter = 0;
foreach($inArray as $key => $item) {
$page_data = $cell_row_templ;
$counter = 0;
foreach ($columns[0] as $col) {
$page_data = str_replace($col, $inArray[$arr_counter][$columns[1][$counter]],$page_data);
$counter ++;
}
$ret_data .= $page_data;
$arr_counter ++;
}
$ret_data .= $keywords[3][0];
return $ret_data;
}


And template like this:

<table cellpadding="0" cellspacing="1">
#begin#
<tr>
<td>{COL1}</td>
<td>{COL2}</td>
</tr>
#end#
</table>


Идея очень проста: Регулярное выражение вырезает то, что находится между
#begin# и #end# и повторяет для каждой строчки. Если есть запись вида {COL1} и в строчке есть элемент с ключем COL1 - происходит замена. Все это сваливается в одну большую переменную и отдается. Дальше её мыжно вывести наружу.

Подобным способом можно "ошаблонизировать" весь код. Но реально это не нужно,
ибо большая потеря производительности. В большинстве случаев я не считаю позором
поставить include('logic.php') в начале файла и по ходу в HTML вставлять <?=$datastr;?>. Оно не сильно хуже или неудобней чем какой-нить {DATASTR};

Я знаю, что есть всякие мегабиблиотеки для шаблонов.. Но что-то они меня отпугнули
своей навороченностью. Не много я их и просмотрел, т.к. самому написать нужный кусок будет быстрее чем найти подходящую либу.

0 responzez

Post a Comment

metanews


Add to Google