Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: как красиво обойтись без шаблонизатора?
Форумы портала PHP.SU » » CMS и фреймворки » как красиво обойтись без шаблонизатора?

Страниц (2): [1] 2 »
 

1. DlTA - 26 Августа, 2011 - 02:39:17 - перейти к сообщению
суть проблемы в том что не могу понять как осуществить следующее
будут файлы с "шаблонами" по типу:
CODE (html):
скопировать код в буфер обмена
  1. <htmlTag>...<?=$myClass->myFunction();?></htmlTag>

тоесть это дело "$myClass->myFunction();" заменится на некий html код который вернет функция
и уже полученный текст будет вставлен гдето в конечном html-е
по логике надо юзать функцию eval но либо я чет не понимаю либо она так не должна работать
например код
PHP:
скопировать код в буфер обмена
  1. $str = file_get_contents("./templates/index.templ");
  2. echo $str;
  3. eval ("\$str = \"$str\";");
  4. echo $str;

где index.templ=

не работает!!
на странице выводится
CODE (html):
скопировать код в буфер обмена
  1. <div><?=5+8;?></div>

а по теории должно
CODE (html):
скопировать код в буфер обмена
  1. <div>13</div>
2. DeepVarvar - 26 Августа, 2011 - 02:41:08 - перейти к сообщению
Да щаасс... eval будет выполнять только то что между скобками: <?(.*)?>
3. DlTA - 26 Августа, 2011 - 02:54:45 - перейти к сообщению
кажись нашел ответ))
Ch_chov списибо[dot]
(Добавление)
хотя проблема частично осталась
переменные объявленные вне распарсиваемого шаблона не видны в шаблоне(
(Добавление)
единственное что пришло на ум, что будет не сильно грузить систему и сносно для дизайнера:
index.templ:
CODE (html):
скопировать код в буфер обмена
  1. <div> <?=$val[0];?> </div>

PHP:
скопировать код в буфер обмена
  1. $str = file_get_contents("./templates/index.templ");
  2. function parseTemp($templ,$val)
  3. {
  4.   ob_start();
  5.   $templ = ' ?>'.$templ.'<?PHP ';
  6.  eval ($templ);
  7.  $file_cont = ob_get_contents();
  8.  ob_clean();
  9.  return $file_cont;
  10. }
  11. $val[0] = 10;
  12. echo parseTemp($str,$val);
4. DeepVarvar - 26 Августа, 2011 - 06:49:03 - перейти к сообщению
DlTA пишет:
?>'.$templ.'<?PHP
Да, но иногда еще бывает и короткая запись.
Стоит предусмотреть и этот вариант.
5. DlTA - 26 Августа, 2011 - 09:53:07 - перейти к сообщению
DeepVarvar пишет:
Стоит предусмотреть и этот вариант.

А какая разница в каком варианте оформить? насколько я знаю смесь 2-х вариантов не ведет к каким либо отрицательным последствиям
6. EuGen - 26 Августа, 2011 - 09:54:17 - перейти к сообщению
Для чего eval, если можно просто include? (см. урок #19)
7. DlTA - 26 Августа, 2011 - 12:09:04 - перейти к сообщению
EuGen пишет:
Для чего eval, если можно просто include? (см. урок #19)

PHP:
скопировать код в буфер обмена
  1.  protected function _fetch_segment($template, $rgParams = array())
  2.     {
  3.         extract($rgParams);
  4.         ob_start();
  5.         include VIEWS_PATH.$template.'.phtml';
  6.         return ob_get_clean();
  7.     }

тоже вариант
хотя по сути тоже самое

ОООООО. вспомнил почему он мне не понравился
вот статья в которой проведены стат. выкладки, и к примеру возьмем рабочую ситуацию когда нужно вывесит множество однотипных блоков, например страничку с товарами
по предложенному методу для вывода каждого блока нужно каждый раз инклудить, по моему же методу файл читается один раз а дальше нужное количество раз распарсивается средствами php, тоесть тот же инклуд но без чтения файла
8. EuGen - 26 Августа, 2011 - 12:16:29 - перейти к сообщению
А можно просто записать это все структурировано в 1 файл и сделать include ровно 1 раз.
Здесь скорее дело вкуса, разницы нет. Разве что eval делать плохо тем, что быстродейтствие у него страдает.
9. DlTA - 26 Августа, 2011 - 12:29:56 - перейти к сообщению
EuGen пишет:
А можно просто записать это все структурировано в 1 файл и сделать include ровно 1 раз.

насколько я понял подразумевается что то титипа:
template:
PHP:
скопировать код в буфер обмена
  1. for($i=0;$i++;$i<$count)
  2. {
  3.   echo "<div>$val</div>";
  4. }
  5.  

но в данном случае будет не очень красиво с точки зрения шаблона
10. EuGen - 26 Августа, 2011 - 12:31:31 - перейти к сообщению
Зачем же так, можно
PHP:
скопировать код в буфер обмена
  1.  
  2. <?for($i=0;$i++;$i<$count):?>
  3.   <div><?=$val?></div>
  4. <?endfor;?>
  5.  
11. DeepVarvar - 26 Августа, 2011 - 12:34:16 - перейти к сообщению
Хы... А я вообще от шаблонизатора как такового отошел...
Нет, все так же в контексте объекта шаблонизатора идет:

$this->assign("title","Заголовок страницы");

Но никаких лишних инклюд или чтений и парсинга файла нету...

Шаблон просто инклюдится в методе draw шаблонизатора.
Как бы возвращаемся к "началу познания", в шаблоне уже так:

<title><?=$title?></title>

А если "ассигновали" шаблонизатору массив, то прямо в шаблоне же и цикл перебора.
12. EuGen - 26 Августа, 2011 - 12:38:14 - перейти к сообщению
Вот и я к тому же (в том же уроке №19 писал), что придумывание псевдоязыков - ни к чему.
Можно то же самое реализовать и на PHP, ничего нового шаблонизатор не дает.
13. DlTA - 26 Августа, 2011 - 12:51:22 - перейти к сообщению
EuGen пишет:
можно
PHP:
скопировать код в буфер обмена
 
<?for($i=0;$i++;$i<$count):?>
  <div><?=$val?></div>
<?endfor;?>
 

)) осталось только привыкнуть к такой форме записи
14. EuGen - 26 Августа, 2011 - 12:53:36 - перейти к сообщению
http://php.su/learnphp/cs/?alt
15. DeepVarvar - 26 Августа, 2011 - 16:59:25 - перейти к сообщению
DlTA пишет:
осталось только привыкнуть к такой форме записи

ну напишите в такой форме:
PHP:
скопировать код в буфер обмена
  1. <?PHP for ($i=0;$i++;$i<$count) { ?>
  2.   <div><?PHP echo $val; ?></div>
  3. <?PHP } ?>

 

Powered by ExBB FM 1.0 RC1