шаблоны вывода

dogsdieday

Guest
шаблоны вывода

добрый день

хотел бы проконсультироавться на счёт системы шаблонов ...
у меня есть файл , который обрабатывает все входящие запросы и определяет модуль , в который запрос будет направлен (модуль - это набор скриптов , обрабатывающих данные одной логической структуры , вытаскивающих их из базы и тп)
эти модули расположены например в разных файлах , инклюдящихся по необходимости в 'первый файл'.
так вот когда модуль отработал - я имею заполненные переменные (например $head = 'название статьи' , $author = 'её автор' , $text = 'сам текст') , далее модуль возвращает управление первому файлу , где ниже по тексту подключается система шаблонов (она завязана на названиях модулей - то есть изходя из ранее выбранного модуля выбирается подкласс шаблонов , который знает как печатать данные того или иного модуля ) , а дальше в html текст вставляю шаблонные методы печати (вывод title , ... , и всего остального - $text , $head , $author) ; есть главный html шаблон(выводит title , менюшку и тп) и есть Html шаблоны для каждого модуля (они инклюдятся в главный)

просто хочется услышать критику такой структуры (и как сделать её более гибкой что ли) , мне если честно она интуитивно не очень нравится - но чем именно понять сложно (это ведь интуиция :) ) , что здесь 'не так'?
 

Кром

Новичок
Вполне нормальная структрура. По сути дела, один из двух стандартных методов систем шаблонов.

Елси тебе он интуитивно не нравиться, сделай наоборот. Вызывай шаблон и пусть он подключает к себе ядро.
Принцип можешь почитать здесь:
http://dklab.ru/chicken/nablas/16.html
 

dogsdieday

Guest
Originally posted by Кром
Вполне нормальная структрура. По сути дела, один из двух стандартных методов систем шаблонов.
одного авторитетного мнения вполне достаточно что бы заткнуть мою интуицию :)
thx
 

kel

Guest
Я предлогаю свой вариант шаблонизатора.
Он реализован в виде класса.
Сканирует все определённые в скрипте функции.
Индефикаторы функций которые непосредственно должны выводить инфомацию по найденому в html-шаблоне ключу заносятся в свойство $SetFuncArr.
Также имеется возможность вывода информации используя массив переменных $SetVarArr
Например у нав в переменной $title хранится заголовок нашей страници.
В $SetVarArr вводим ключь эллемента массива который в последствии будет использоваться в качестве ключа для шаблона и значение ключа т.е. к примеру $title.

PHP:
<?php
class CTemplater{
  var $SetFile;
  var $SetFuncArr=array();
  var $SetVarArr=array();
  var $SpBegin="<!--";
  var $SpEnd="-->";
  function ShowTemp(){
    $arr = get_defined_functions();
    $len=count($arr["user"]);
    for($i=0;$i<$len;$i++){
      if(!in_array(strtoupper($arr["user"][$i]),$this->SetFuncArr)){
        unset($arr["user"][$i]);
        }
      }
    $fd = @fopen ($this->SetFile,"r")or
die("File not fount");
    while (!feof ($fd)) {
      $buffer = fgets($fd);
      reset($arr["user"]);
      reset($this->SetVarArr);
      $lenV=count($this->SetVarArr);
      $lenF=count($arr["user"]);
      for($i=0;$i<$lenF;$i++){
        $ind=strtoupper(current($arr["user"]));
        $n=preg_match_all("<!-- *".$ind." *-->",$buffer,$res);
        if($n>0){
          for ($i=0; $i<$n; $i++) {
            $buffer=eregi_replace($this->SpBegin." *".current($arr["user"])."
*".$this->SpEnd,
            call_user_func(current($arr["user"])),$buffer);
            }
          }
        next($arr["user"]);
        }
      for($i=0;$i<$lenV;$i++){
        $buffer=ereg_replace($this->SpBegin." *".key($this->SetVarArr)."
*".$this->SpEnd,
        current($this->SetVarArr),$buffer);
        next($this->SetVarArr);
        }
      echo $buffer;
      }
    fclose ($fd);
    }
  }
?>
 

Gas

может по одной?
kel
Речь совсем не о шаблонизаторе. Создай новую тему и вылаживай для обозрения своё детище.
 

kel

Guest
Автор оригинала: Gas
kel
Речь совсем не о шаблонизаторе. Создай новую тему и вылаживай для обозрения своё детище.
Ну извени если чем обидел..
 

php6

Guest
Ну и что такого особенного?
1) Один файл не есть хорошо. Чем луче
PHP:
if($a=='news') include('news.php');
else if($a=='catalog') include('catalog.php');
else include('start.php');
отдельных модулей 'news.php' и 'catalog.php' которые и получат эти же переменые?

2) Далее "подкласс шаблонов знает как печатать данные того или иного модуля". Опять же, эти данные можно обработать именно в модуле, сразу после их получения и просто отдать шаблону. Зачем так всё сложно разграничивать и усложнять?
PHP:
module.php:
============
$rezult = 1+2;
$name = mysql_query('Select......');
$name = применяем к $name oпределённый метод.

Всё. Дальше можно просто инклюдить шаблон:
PHP:
<html>
<b><?=$rezult?></b> name: <?=$name?>
</html>
-~{}~ 18.02.05 13:14:


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

PHP:
class OUTPUT extends DB
{
	//Функция для главного метода
	function getOut($in){
	$funcarray = array("hsc", "fstyle", "nl22br", "ereg_smiles", /* и др. методы класса */);
	$c = func_num_args();
		if($c===1){
		$arg_list = $funcarray;
		array_unshift($arg_list, $in);
		$c = count($arg_list);
		}
		else $arg_list = func_get_args();
		$in = $arg_list[0];
		
	for($i=1; $i<$c; $i++)
		$in = $this->gotoArray($in, $arg_list[$i]);
	return $in;
	}
	
	function gotoArray($in, $fun){
		if(!is_array($in))
			$in = $this->$fun($in);
		else {
			foreach($in as $k=>$v)
				$in[$k] = $this->gotoArray($v, $fun);
		}
	return $in;
	}
	
	
	
	//	Функция форматирования BB-тегов
	function fstyle($in){
	//...
	return $in;
	}
	
	//htmlspecialchars
	function hsc($in){
		return htmlspecialchars($in,ENT_QUOTES);
	}
	
	//nl22br
	function nl22br($in){
		return nl2br($in);
	}
	
	//замена смайлов
	function ereg_smiles($in){
	//...
	return $in;
	}
	
	//и др. функции
}
Пример использования:
PHP:
$var = $myDB->getOut($var,"fstyle"); - применяет только метод fstyle к переменной var
$var = $myDB->getOut($var,"hsc","fstyle","nl22br"); - применяет к переменной var методы hsc, fstyle и nl22br
$var = $myDB->getOut($var); - применяет к переменной var все основные методы перечисленные в массиве funcarray
 

Gas

может по одной?
kel
да не обидил ты ничем, просто речь идёт совсем о другом.

php6
1) ты о чём?
2)
Зачем так всё сложно разграничивать и усложнять?
то что предлагаешь ты это просто довесок к предложенный системе, но никак не какая-то альтернатива.
 

dogsdieday

Guest
Ну и что такого особенного?
если это к моиму посту ... особенного ничего нет , если это 'стандарт' (как уже было сказано) ... меня надо сказать это очень радует

Один файл не есть хорошо
слышал не один раз - приведи аргументы плз
делал я так из за чпу (через mod_rewrite) - к тому же в этом файле у меня происходит чистка запросов (недавно узнал о сущестровании mod_secure :) - надо будет туда это дело перенести)

Опять же, эти данные можно обработать именно в модуле, сразу после их получения и просто отдать шаблону
это да - у меня тут тоже есть сомнения ... но я аргументирую свою позицию тем что однотипный код (в данном влучае код вывода данных) будет собран в 1 месте

Зачем так всё сложно разграничивать и усложнять?
всё разграничить - моя основная идея
 

php6

Guest
Originally posted by Gas
[2) то что предлагаешь ты это просто довесок к предложенный системе, но никак не какая-то альтернатива. [/B]
альтернатива - это не извращаться с кучей модулей и их подшаблонами, а генерировать и обрабатывать данные в родительском модуле.
 

Gas

может по одной?
php6
В твоём понимании модуль == один скрипт? Если так, то нет вопросов. Если же нет, то вот пример.
Модуль новостей с категориями оных.
У этого модуля уже много разных шаблонов представлений, в которые нужно передавать специфические данные.
dogsdieday предложил свой вариант как это организовать. Ты же говоришь что предложил альтернативу, но я её не вижу.
 

php6

Guest
Originally posted by Gas
php6
В твоём понимании модуль == один скрипт?

да. модуль - это самодостаточно рабочая программа, та, что доделывает до конца какую-то определённую задачу.
 

Gas

может по одной?
php6
тоже вариант, а то привык уже ко всяким сложностям.
 
Сверху