Nu3oN » 2010.10.09 23:27

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

короче вот отрывок небольшой

Код:

1
span style="color: #0000BB"><?phpclass Template { /** Переменные шаблона */ private $_variable = array(); /** Массивы шаблона */ private $_array = array(); /** Папка с шаблонами по умолчанию */ public $dir_temp = './_template/'; /** * Установка переменных в шаблоне */ public function assign($var, $key) { if (is_array($key)) { $this -> _array[$var] = $key; } else { $this -> _variable[$var] = $key; } } /** * Обработка переменных в шаблоне */ private function _varPreg($getTpl) { preg_match_all('#\{\$(.+)\}#uUs', $getTpl, $aVars, PREG_SET_ORDER); $iCount = count($aVars); if ($iCount) { for ($i=0; $i<$iCount; $i++) { $sEval = explode('.', $aVars[$i]['1']); $iCount_r = count($sEval); if ($iCount_r > 1) { if (isset($this->_array[$sEval[0]]) and array_key_exists($sEval['1'], $this -> _array[$sEval[0]])) { $isVar = $this -> _array[$sEval[0]]; $getTpl = str_replace('{$'.$sEval['0'].'.'.$sEval['1'].'}', $isVar[$sEval['1']], $getTpl); } else { $getTpl = str_replace('{$'.$sEval['0'].'.'.$sEval['1'].'}', null, $getTpl); } } else { if (isset($this -> _variable[$sEval['0']])) { $getTpl = str_replace('{$'.$sEval['0'].'}', $this -> _variable[$sEval['0']], $getTpl); } else { $getTpl = str_replace('{$'.$sEval['0'].'}', null, $getTpl); } } } } return $getTpl; } /** * Вывод шаблона */ public function displey($tpl) { if (!is_file($this -> dir_temp.$tpl)) { return false; } else { $getTpl = file_get_contents($this -> dir_temp.$tpl); $getTpl = $this -> _varPreg($getTpl); echo $getTpl; } }}?>

нужна чисто оценка и что можно сделать иначе и т.д и т.п и почему лучше сделать так или иначе... =)

Nu3oN » 2010.10.09 23:39

Стараюсь больше косить к smarty (одинаковые названия свойств, методов и т.д)... в случае если мне это дело надоест, что бы установить смарти без проблем!=D
Добавлено спустя   2 минуты  31 секунду:
и что думаете на счет кеширование в gz-файле?
есть ли выгода в таком мини сжатия кеша?

Gemorroj » 2010.10.10 10:33

Nu3oN, насчет кэширования в GZ, ИМХО пустое это. Проигрыш в скорости будет много больше чем выигрыш в размере занимаемого диска.
И снова, оформи код по PEAR и комментарии с описанием методов расширь хотя бы входящими/исходящими данными.
Добавлено спустя   8 минут  2 секунды:
$sEval['0']
$sEval['1']
где-то тут на форуме есть тесты производительности, там вобщем показано, что $sEval[0] будет быстрее чем $sEval['0']. Т.е. числовые индексы быстрее ассоциативных, да и памяти число таки меньше жрет.
public function displey - не displey, а display.

Код:

1
2
3
$getTpl = file_get_contents($this -> dir_temp.$tpl);
$getTpl = $this -> _varPreg($getTpl);
echo $getTpl;

мелочи, но шаблонизатор таки должен быть реально быстрым.

Код:

1
echo $this -> _varPreg(file_get_contents($this -> dir_temp . $tpl));
Nu3oN » 2010.10.10 10:50

я как то читал что $array['0'] быстрей чем $array[0]

Nu3oN » 2010.10.10 11:10

Действительно $array[0] быстрей чем $array['0']

Код:

1
span style="color: #0000BB"><?php$arr = array('1'=>'1234567890');$iStart_1 = microtime(true);for ($i=0; $i<100000; $i++) $set = $arr['1'];$iEnd_1 = round(microtime(true) - $iStart_1, 4);$iStart_2 = microtime(true);for ($i=0; $i<100000; $i++) $set = $arr[1];$iEnd_2 =round(microtime(true) - $iStart_2, 4);echo '$arr[\'1\']: '.$iEnd_1.'<br> $arr[1]: '.$iEnd_2;?>

В итоге получилось следущее:
$arr['1']: 0.0786, 0.0735, 0.0728, 0.0767
$arr[1]:  0.0396, 0.0444, 0.043, 0.0406

Nu3oN » 2010.10.10 12:44

вот еще один лесапед!

Код:

1
span style="color: #0000BB"><?php private function _cyclePreg($getTpl) { /** * Ищем цикл */ preg_match_all('#\{foreach (\$(.*))\}(.*?)\{\/foreach\}#uUs', $getTpl, $aCycle, PREG_SET_ORDER); $cycle = null; /** * Считаем колличество эллементов в массиве, * если их больше нуля, то продолжаем работу с циклом */ $iCountC = isset($this -> _array[$aCycle[0][2]]) ? count($aCycle) : false; if ($iCountC) { $arrCycle = $this -> _array[$aCycle[0][2]]; /** * Считаем колличество эллементов в массиве с которым работаем */ $iCount = count($arrCycle); for ($i=0; $i<$iCount; $i++) { $sFor[$i] = $aCycle['0']['3']; /** * Ищем массивы в цикле */ preg_match_all('#\{\$(.+)\}#uUs', $aCycle[0][3], $aVars, PREG_SET_ORDER); $iCount_v = count($aVars); /** * Если массивы есть, то обрабатываем их */ if ($iCount_v) { for ($n=0; $n<$iCount_v; $n++) { /** * Получаем переменную и ключ * Пример: из {$arr.key} в $arr['key'] */ $sEval = explode('.', $aVars[$n][1]); $iCount_r = count($sEval); if ($iCount_r > 1) { if (isset($arrCycle[$i][$sEval[1]]) and array_key_exists($sEval[1], $arrCycle[$i])) { /** * Если такая переменная заявленна, * и в массиве есть значение с таким ключом то заменяем на действительную */ $sFor[$i] = str_replace('{$'.$aCycle[0][2].'.'.$sEval[1].'}', $arrCycle[$i][$sEval[1]], $sFor[$i]); } else { /** * Если такая переменная не заявленна, то просто затераем ее */ $sFor[$i] = str_replace('{$'.$aCycle[0][2].'.'.$sEval[1].'}', null, $sFor[$i]); } } } } $cycle .= $sFor[$i]; } } /** * И заменяем текст на реальный цикл */ return preg_replace('#\{foreach (\$(.*))\}(.*?)\{\/foreach\}#uUs', $cycle, $getTpl); }?>

Это осуществление циклов...
Пока писал, запутался конкретно...

Gemorroj » 2010.10.10 13:00

это на тебя морган такое плохое влияние оказывает чтоли?)))

Nu3oN » 2010.10.10 13:09

Гыыыы... если серьезно, то решение написать свой шаблонизатор у меня возникло из за того, что я знаю что если мне что-то нужно, я знаю где это поправить и понимать что к чему!
В своем шаблонизаторе я организовал вывод всех массивов, переменных, методов, время генерации какого либо метода, вывод ошибок (как пример: если в шаблоне обьявлена переменная {$var} но в скрипте небыла заявленна, то мне выдает название переменной и строку) следя за такими ошибками можно управлять генерацией скрипта...
В общем у меня полный контроль над шаблонизатором

Morgan » 2010.10.10 22:31

Gemorroj написал:

это на тебя морган такое плохое влияние оказывает чтоли?)))

а я все вижу)))

Nu3oN » 2010.10.11 07:34

Morgan написал:

Gemorroj написал:

это на тебя морган такое плохое влияние оказывает чтоли?)))

а я все вижу)))

Тебе так только кажется =D
Добавлено спустя   1 минуту  56 секунд:
теперь осталось написать функции и конструкцию if else

Gemorroj » 2010.10.11 10:23

выкладывай код на публичный репозитарий, личензируй GPL какойнить и вперед, развивай, поддерживай.

Nu3oN » 2010.10.11 13:33

не люблю выкладывать скрипты в пабл... Не люблю дальнейшие высеры и обсерания автора и его работы

Morgan » 2010.10.11 15:28

12, ты же выкладываешь не просто так.
высеры появляются только тогда, когда человеку больше нечего сказать

Nu3oN » 2010.10.11 18:09

вот думаю как правильней организовать иф елсе...
Что бы не тупо иф елсе, а еще по необходимости например штук 10 этих елсеифоф и т.д...

Nu3oN » 2010.10.16 00:21

Короче вот что в итоге у меня выходит: Пример тута

Gemorroj » 2010.10.16 08:25

кэширование оттранслированного кода планируется?

Nu3oN » 2010.10.16 12:20

Gemorroj написал:

кэширование оттранслированного кода планируется?

ну да...

Gemorroj » 2010.10.16 12:48

Ну вперед, ИМХО, это должно быть обязательно. Для WAP, отсутствие кэша, может, и не так заметно, но для WEB страничек, нагруженных HTML'ом, это важно.

ByVlad » 2010.10.30 21:32

Циклы в цикле это издевательство, со смарти слезать не хочу. Как-то читал что кодеры делятся на несколько типов. Высшим оказался тот, который пишет свой шаблонизатор. Я написал себе давно мини шаблонизатор, но заюзав смарти выкинул мой тэмплейтер к черту. Твиг думал заюзать, но считаю что он тупой, просто неудобный. Говорят смарти медленный, ну-ну, 0.0081 вместе с использованием бд и обширным ядром. Считаю что написание своего шаблонизатора - бред (ну3он, морган-извиняйте уж).

Morgan » 2010.10.31 01:00

достаточно холиварная тема. Если уж лесапеды не используешь, тогда почему пишешь не с использованием kohana, cakephp,  etc ?

Nu3oN » 2010.11.05 00:46

насчет "циклы в цикле", предложи лучший вариант, я гляну =)
Дай свой шаблонизатор глянуть ;)