Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > реализация класса шаблонизатора


Автор: pirrat 3.11.2007, 18:08
вообщем пишу свой класс,основной задачей которого будет парсинг переменных в шаблон,т.е. одним словом класс-шаблонизатор,
класс уже почти написан,но встала одна проблема- нужно написать метод класса который будет выполнять следующие задачи и идеи:

а идея такова: очень часто,практически в любом коде ,встречается такой код:

Код

$item= $db->query("SELECT * FROM table");
while($result=$db->fetchrow($item)) {
//тут обрабатываем и  парсим переменные в шаблон
}

думаю строки вам знакомы..
хотелось этот код оптимизировать ,и я практически справился с этой задачей,вот код:

создаем обьект класса и вызываем метод класса parselist в аргументах которого пишем запрос и название шаблона для вывода:

Код

$mtest = new index;
$query ="SELECT * FROM table";
$mtest->parselist($query,"test");


данный код выполняет следующее: обрабатывает запрос , и выводит шаблон test.tpl ,в котором прописаны переменные ,имена которых являются названиями полей таблицы..
все работает как надо,но проблема в том что не получается обработать эти самые переменные,их можно обработать в самом метогде,но из вне не получается,вот так это должно выглядить:

Код

$mtest = new index;
$query ="SELECT * FROM table";
$mtest->varsql['date']=format_time($mtest->varsql['date']); //обрабатываем значения из поля date функцией
$mtest->parselist($query,"test");


вот сам класс,привожу не полностью,а только те методы которые здесь участвуют..

Код

class index {
var $url;
var $template;
var $modulename;
var $tplfile;
var $varsql;
//функция установки файла шаблона
function tfile($tpl_name)
{
$tpl = $tpl_name;
if(empty($tpl) || !file_exists($tpl)){ print "<b>файла ".$tpl." не существут</b>"; }
else { $this->template = file_get_contents($tpl); }
}
//функция установки файла шаблона// 

//функция установки переменных шаблона
function temp($keys,$val='') {
 if ($val=='') {
foreach ($keys as $key=>$val)  {
$this->template = str_replace("{".$key."}", $val, $this->template);
    }
} else {
$this->template = str_replace("{".$keys."}", $val, $this->template);    
    }
}
//функция установки переменных шаблона// 

//функция парсинга списков//
 function parselist($query,$temp) 
 {
 global $db,$pagecont,$m;  
$qu=$db->query($query);     
 while($ff=$db->fetchassoc($qu))
 { 
     $this->varsql=$ff;
 $this->tfile("temp/".$m."/".$temp.".tpl");   
  $this->temp($this->varsql);
  $pagecont[$temp] .=$this->template;
  }
  $this->countfetch = count ($this->fetch);


  }
//функция парсинга списков//

  }




как я уже писал,этот код работает так как надо,за исключением того что нельзя обработать данные из бд,так как они парсятся сразу в шаблон, и что то не как не могу придумать как эти данные обработать из вне класса, т.е. нужно обработать член класса $varsql!!!

очень буду благодарен,если подскажете ,как это реализовать...

ЗЫ: я плохо знком с ООП,мб поэтому и не могу реализовать задачу...

Автор: HotHead 4.11.2007, 12:02
Не очень понял, что значит 3-ий кусок кода. Или там 3 и 4 строчки перепутаны местами?

А так сделайте $varsql массивом и push-те в него результаты запросов. На выходе получите массив. Правда не знаю что вы с ним будете делать. Я бы рекомендовал ввести в parselist  ещё как минимум название поля (по умолчанию = '') и если оно есть, то забивать данные в массив $varsql с ключами равными значению этого поля. Так хотя бы некоторая логика появится.

Или объясните куда должна обращатся строка $mtest->varsql['date']=format_time($mtest->varsql['date']); если в результате запроса вернётся несколько строчек.

Автор: pirrat 4.11.2007, 13:06
$valsql и так я вляется массивом,с ключами равными названиям полей таблицы,и значениями равными значениями этих полей,т.е. если сделать в цикле 
print_r($this->varsql); то получим следующие:
Код

Array ( [id] => 1 [title] => новость [text] => текст)

и таких несколько массивов в зависимости от того сколько раз прошел цикл...
можно его сделать многомерным массивом-ниже описал как..

да возможно в третьем куске кода я не верно написал,но смысл надеюсь понятен,что я хотел обработать значения из поля date функцией...

по логике нужно делать так : делить эту функцию(parselist) на 2 или 3 функции,в первой мы получаем на выходе многомерный массив с индексными ключами и значениями другой массив в котором уже и будут ключи-имена полей,значения-значения этих полей... т.е. вот так:
Код

Array ([0] => Array ( [id] => 1 [title] => новость [text] => текст) [1] => Array ( [id] => 2 [title] => новость2 [text] => текст2))


,в второй функции циклом заменяем в массиве значения на нужные мне,и в 3 функции уже новый массив опять же циклом выводим в шаблоны..

но при таком раскладе,мне кажется игра не стоит свеч и проще будет применить стандартный процедурный подход...

Автор: HotHead 4.11.2007, 14:21
Кто вам мешает сделать массив массивов с ассоциативными ключами? Собственно fetchassoc и должен делать массив с ассоциативными ключами. Потом делаете array_push в varsql. А методе в дальнейшем используете $ff.
Код

 $this->varsql = Array();
 while($ff=$db->fetchassoc($qu))
 { 
    $this->varsql = array_push($this->varsql, $ff);
    $this->tfile("temp/".$m."/".$temp.".tpl");   
    $this->temp($ff);
    $pagecont[$temp] .= $this->template;
 }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)