Вызов функции из переменной

1. Андрей (31.07.2011 / 17:50)
Должен наверно быть готовый варинт, но не могу найти.
<?php
private function modules($html){
		preg_match_all('<!--module:( .*)-->',$html,$found);
		$count=count($found);
		for($i=0; $i<$count; $i++){
			include_once('modules/'.$found[$i][2].'.php');
			$html=str_replace('<!--module:'.$found[$i][2].'-->',module_".$found[$i][2]."(),$html);
		}
	}
?>
Собственно нужно что то полегче (в плане нагрузки) и рабочее.

2. KOZZ (31.07.2011 / 17:53)
как я понял эта функция считывает из файла шаблона названия подключаемых файлов, так?
тогда я не понимаю, к чему эти костыли.
если это все в html файле, то можно в самом файле просто прописать так:
<html><body>
<?require('file.php');?>
</body></html>


3. Андрей (31.07.2011 / 18:08)
2. eGo, в шаблоне не должно быть php кода и он там не обрабатывается.

4. Санёк (31.07.2011 / 18:17)
ну если парсишь шаблон, то единственное, чем тут можно облегчить, это вместо for(.. использовать foreach ($found as $module) чуть быстрее удет, но не столь существенно т.к.ты не по 100 модулей зараз будешь подключать..наверное.

5. ramzes (31.07.2011 / 18:25)
eGo (31 Июля 2011 / 17:53)
как я понял эта функция считывает из файла шаблона названия подключаемых файлов, так?
тогда я не понимаю, к чему эти костыли.
если это все в html файле, то можно в самом файле просто прописать так:
<html><body>
<?require('file.php');?>
</body></html>
вот это как раз эталон костыля.
если пых в шаблоне значит шаблоны стремно организованы

6. KOZZ (31.07.2011 / 18:29)
5. ramzes, а как же smarty например, которому многие так поклоняются?
посмотри как там тот же самый цикл foreach организован.
фактически рыло на мыло заменяют.

7. ramzes (31.07.2011 / 18:29)
preg_replace('|<!--modulesad .*)-->|'s, 'include_once(\'modules/\1.php\"); \r\n module_\1()", $html);
типа того, но я не очень понял какую строку надо на выходе получить

8. ramzes (31.07.2011 / 18:33)
6. eGo, я не юзаю смарти, мне без разницы, верстальщику не стоит пхп подпихивать
        <div id="WCControl"></div>

          <div  id="Wnews" class="widget" style="width:220px; z-index:22;position:fixed;">

                      <div  class="WC" style="cursor:move" onmousedown="move_me('news');">
      <a href="#" onclick="WC('news');">Новости</a>
                       </div>
<plugin>webNews->printNews:falsse</plugin>
<div id="news" style="display:no ne;">
      <div class="post">
<%webNews.news_title%>
      </div>
      <div id="newspost">
<marquee scrollamount="1" direction="up"  height="50">
<%webNews.news_message%>
</marquee>
      </div>
 </div>
 
                </div>


<foreach>list->blog</foreach>
      <div class="post"  onmouseover="subIn('<%blog.id%>')" onMouseOut="subOut('<%blog.id%>')">
        <div style="padding:3px 10px;">
<a href="/blogpost/<%blog.blog_url%>/" ><span class="pub"><%blog.blog_name%></span></a>
    <span class="right"><%blog.cat_link%></span>
        </div>
 <%blog.blog_message%>
          <div style="text-align:right"><%lang.tags%>: <%blog.blog_tags%></div>
<div class="subtitle">
<a href="/user/<%blog.login%>/"><b><%blog.name%></b></a>,
<span class="right"><%blog.blog_time%></span><br />
<a href="/comments/<%blog.id%>/"><%lang.comments%></a> <b><%blog.total_comm%></b>
<img src="/image/Classic/comments.png" alt="comment" />
<span style="display:no ne;" class="right" id="subInfo_<%blog.id%>">
<%lang.rating%>: <b><%blog.blog_rating%></b>      <%lang.read%>: <b><%blog.blog_read%></b> <img src="/image/Classic/ok.png" alt="info" />
</span>
</div>
</div>
</endforeach>
<%pageNavi%>
обхожусь же без пыха как то =)

9. Алексей (31.07.2011 / 20:00)
#8 <foreach>list->blog</foreach> {...} </endforeach>
серавно требует для верстальщика знаний синтаксиса твоего шаблонизатора, можно же так
{mainblock}
...
     {second}
        {second.text}
     {/second}
...
{/mainblock}
<?php
foreach($value as $key => $text)
    {
      $template -> assign('mainblock.second.text', $text);
      $template -> parse('mainblock.second');
    }
$template -> parse('mainblock');
$template -> out('mainblock');
?>
при таком подходе верстальщику не придется знать технические аспекты твоего шаблонизатора (конструкции for foreach if while etc) а просто манипулирует блоками/

10. ramzes (31.07.2011 / 20:09)
9. МегабиТ, можно как угодноsmile главная суть в том что не надо пых в шаблон пихать
я раньше <list></list> использовал smile

11. Алексей (31.07.2011 / 20:13)
ramzes (31 Июля 2011 / 20:09)
9. МегабиТ, можно как угодноsmile главная суть в том что не надо пых в шаблон пихать
я раньше <list></list> использовал smile
при таком подходе верстальщику не придется знать технические аспекты твоего шаблонизатора (конструкции for foreach if while etc) а просто манипулирует блоками.

12. ramzes (31.07.2011 / 20:17)
11. МегабиТ, ему того и надо же=)
хотя на самом деле я не знаю вменяемых верстальщиков не знакомых с условиями типа иф(), и циклами()

13. Петр (01.08.2011 / 08:25)
1. Барыга Обама, используйте preg_replace_callback - function cbk($match){include $match[1].'.php'; и т.д.} preg_replace_callback($regexp, 'cbk, $html); Кстати, неужели module.".$var."() работает? Я всегда писал так: eval('return module'.$var.'()'); И еще странно, что foreach быстрее for - я всегда считал обратное, даже тесты где-то были.

14. Петр (01.08.2011 / 08:37)
Также можно использовать "анонимные" функции (create_function)

15. Lugaro (01.08.2011 / 08:39)
8. ramzes, Бред, будущее за нативными шаблонами.
Зачем выдумывать какой-то новый синтаксис и грузить скрипт лишней обработкой этого синтаксиса? И поверь, ему проще выучить основы php чем изучать десятки велосипедов.

16. ramzes (01.08.2011 / 08:44)
15. .::lugaro::., ни где ни чего не грузит, ни кому не проще выучить язык чем не учить его.
на счет будущего я спорить не буду, будущее за апокалипсисом =)

17. KOZZ (01.08.2011 / 08:51)
будущее за апокалипсисом
D D D
рам не прекращает меня удивлять klass
P.S: lugaro, что ты имеешь ввиду под понятием "нативный шаблон"?

18. Lugaro (01.08.2011 / 09:56)
16. ramzes, Ну да, ну да, пусть лучше учит всякие там {foreach} и {if}

eGo (1 Августа 2011 / 07:51)
P.S: lugaro, что ты имеешь ввиду под понятием "нативный шаблон"?
Гугл в помощь

19. ramzes (01.08.2011 / 13:38)
.::lugaro::. (1 Августа 2011 / 09:56)
16. ramzes, Ну да, ну да, пусть лучше учит всякие там {foreach} и {if}
зачем?
все что ему надо знать это что <for>/<list><cyrcle> в общем как не назови, повторяющийся блок
иф тоже крайне редко используется, если продумано все нормально, но даже пусть и придется с ним иметь дело, иф понятен просто как английский язык, и для него не надо знать пых.

Добавлено через 01:50 сек.
eGo (1 Августа 2011 / 08:51)
P.S: lugaro, что ты имеешь ввиду под понятием "нативный шаблон"?
это каша из хтмл и пыха (то что генерирует обыкновенный шаблонизатор)
когда то и мне нравилосьsmile

20. KOZZ (01.08.2011 / 13:42)
19. ramzes, ну я щас активно погуглил по этим шаблонизаторам, понравился блочный xtemplate, начал переписывать даже свой готовящийся проект smile

21. ramzes (01.08.2011 / 13:44)
20. eGo, ))) это был самый первый шаблонизатор который я попробовал
хорошая штука, и тут многим его советовалsmile

22. KOZZ (01.08.2011 / 13:53)
21. ramzes, ну у меня почему - то тоже на него сразу глаз упал.
вот только проблема единственная:
есть переменные , которые используются во всех шаблонах, по всему скрипту.
и приходится в каждом файле прописывать что - то вроде такого:
<?
$xtpl = new xtemplate('templates/index.xtpl');
$xtpl->assign('a_icon', $set['a_icon']);
$xtpl->assign('b_icon', $set['b_icon']);
$xtpl->assign('host', $_SERVER['http_host']);
$xtpl->assign('ads_head', $set['ads_head']);
$xtpl->assign('ads_foot', $set['ads_foot']);
$xtpl->parse('main_page');
$xtpl->out('main_page');
?>
Можно как - то избежать этого, ибо это ГК жуткий?
ясно ведь что что - то я упустил, читая мануалы

23. ramzes (01.08.2011 / 13:57)
22. eGo, я дописывал метод и в конструкторе его инициализировал (точно не помню, давно было, что то типа конфига шаблона делал)

24. KOZZ (01.08.2011 / 13:58)
23. ramzes, жесть, придется заново колесо изобретать

25. ramzes (01.08.2011 / 14:03)
24. eGo, обычно это колесо рано или поздно превращается в свой собственный шаблонизатор)) в колесо но уже свое, привычное))
\\ я не помню уже что там и как, может есть подходящий функционал, лугаро вроде тоже его юзаетsmile

26. KOZZ (01.08.2011 / 14:07)
хм, а если сделать по - другому немного.
переписать конструктор так, чтобы в конфигурационном файле, где например настройки хранятся, уже создавался объект, сразу после создания которого прописываем этот самый список нужных переменных, а в каждом файле индивидуально можно было настроить подключаемый шаблон (создав метод set_xtpl_file()).
то есть вот так:
<?
// файл с настройками core.php
$xtpl = new xtemplate();
$xtpl->assign('today_is', date('d.m'));
$xtpl->assign('a_icon', $set['a_icon']);
$xtpl->assign('b_icon', $set['b_icon']);
$xtpl->assign('host', HOST);

// например, контроллер главной страницы index.php
require 'core.php';
$xtpl->set_xtpl_file('main_page.xtpl');
....
?>

Добавлено через 02:20 сек.
Хотя, наверное шаблонизатор откажется хавать assign'ы пока я не задал файл с шаблоном самим

27. ramzes (01.08.2011 / 14:22)
26. eGo, а он сначала требует определить шаблон? понятно почему я отказался))

28. KOZZ (01.08.2011 / 14:24)
27. ramzes, ну подключение в нем таким макаром идет:
<?
$xtpl = new xtemplate('templates/index.xtpl');
?>

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

29. Lugaro (01.08.2011 / 23:38)
19. ramzes, тебя не кто не заставляет использовать в шаблоне супер логику, а так можно сказать ты изобретаешь свой язык, только вот в чем смысл? Ты делаешь те же выражения что и в php т.е одни и те же яйца только под другим угломD

30. KOZZ (02.08.2011 / 09:44)
29. .::lugaro::., такого же мнения smile
поколупал всякие smarty и понял что это тупо замена рыла на мыло

31. Nu3oN (02.08.2011 / 10:57)
eGo Отвертка в ухе (1 Августа 2011 / 13:53)
21. ramzes, ну у меня почему - то тоже на него сразу глаз упал.
вот только проблема единственная:
есть переменные , которые используются во всех шаблонах, по всему скрипту.
и приходится в каждом файле прописывать что - то вроде такого:
<?
$xtpl = new xtemplate('templates/index.xtpl');
$xtpl->assign('a_icon', $set['a_icon']);
$xtpl->assign('b_icon', $set['b_icon']);
$xtpl->assign('host', $_SERVER['http_host']);
$xtpl->assign('ads_head', $set['ads_head']);
$xtpl->assign('ads_foot', $set['ads_foot']);
$xtpl->parse('main_page');
$xtpl->out('main_page');
?>
Можно как - то избежать этого, ибо это ГК жуткий?
ясно ведь что что - то я упустил, читая мануалы
не знаю как в данном шаблонезаторе, а вообще можно еще все через массив пускать :-) а вообще других способов для реализации данной задачи я больше не вижу :-)

32. KOZZ (02.08.2011 / 11:30)
31. Джикинайс, да да, уже нашел smile
там же массивы можно юзать.
поподробнее почитал комменты в самом классе и понял

33. ramzes (02.08.2011 / 13:28)
29. .::lugaro::., я пример давал, где же там свой язык?)
я не делаю того что ты назвал "Ты делаешь те же выражения что и в php", я делаю так как посоветовали знакомые верстальщикиsmile

34. Nu3oN (02.08.2011 / 16:48)
ramzes (2 Августа 2011 / 13:28)
29. .::lugaro::., я пример давал, где же там свой язык?)
я не делаю того что ты назвал "Ты делаешь те же выражения что и в php", я делаю так как посоветовали знакомые верстальщикиsmile
эмм я использую такой же механизм, и не жалуюсь, и оперативно, и полный контроль и самое главное ничего лишнего :-)

35. ramzes (02.08.2011 / 19:09)
и гибкости куда больше, хочешь пых вставляй, хочешь не вставляй, хочешь синтаксис смени. нет зависимостей

36. KOZZ (02.08.2011 / 21:16)
33. ramzes,
я не делаю того что ты назвал "Ты делаешь те же выражения что и в php"
а как еще назвать эти foreach, if в шаблоне?
банальное рыло на мыло, не более

37. Studentsov (02.08.2011 / 21:36)
XTemplate вещь хорошая, у меня на нём старая цмс была. Но медленная, а кеширование какое-то странное там

38. ramzes (02.08.2011 / 22:20)
36. eGo Отвертка в ухе, ты можешь придумать динамический листинг без циклов?
Я весь во внимании.

Добавлено через 05:39 сек.
<!-- Разместите этот тег в теге head или непосредственно перед закрывающим тегом body -->
<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
{lang: 'ru'}
</script>
<!-- Разместите этот тег в том месте, где должна отображаться кнопка +1 -->
<g:plusone size="small" callback="http://www.wapblog.in/"></g:plusone>
смотрим на последнюю строчку и думаем, а почему это гугл предпочел ЭТО а не чистый код.

39. Nu3oN (03.08.2011 / 09:20)
38. ramzes, видел и таких умельцев :-) например dcms где фигачат так
<?php
while ($var = $var->fetch()) {
$template -> var = $var;
$template -> display('template');
}
?>


40. KOZZ (03.08.2011 / 09:26)
39. Джикинайс, хм, а почему бы и нет?

Добавлено через 00:47 сек.
какая разница - что там цикл с фетчем и выводом, что тут.

41. KOZZ (03.08.2011 / 09:44)
я не думаю что там будет какая - то критическая разница в скорости.

42. Nu3oN (03.08.2011 / 10:53)
eGo Отвертка в ухе (3 Августа 2011 / 09:26)
39. Джикинайс, хм, а почему бы и нет?

Добавлено через 00:47 сек.
какая разница - что там цикл с фетчем и выводом, что тут.
там вот именно будет только работа с циклом, а в примере что я привел выше будет еще и обработка шаблона, а шаблоны везде обрабатываются по разному, и хорошо если при первом проходе цикла все занесется в кеш)))

43. KOZZ (03.08.2011 / 10:58)
42. Джикинайс, ну в документации к xtemplate видел подобный пример, надеюсь кэшируют
там кстати еще дополнительный класс для кэширования, надо будет изучить smile

44. ramzes (03.08.2011 / 11:24)
Джикинайс (3 Августа 2011 / 09:20)
38. ramzes, видел и таких умельцев :-) например dcms где фигачат так
<?php
while ($var = $var->fetch()) {
$template -> var = $var;
$template -> display('template');
}
?>
но комментс.. дцмс как был так и остается, пособием по ***коду

Добавлено через 01:39 сек.
eGo Отвертка в ухе (3 Августа 2011 / 09:26)
39. Джикинайс, хм, а почему бы и нет?

Добавлено через 00:47 сек.
какая разница - что там цикл с фетчем и выводом, что тут.
одно дело цикл как цикл вывода инфы, другое дело шаблонизатор в цикле ради все того же вывода инфы

45. KOZZ (03.08.2011 / 11:41)
44. ramzes, ну да, в этом ты прав.
но имхо, если в шаблонизаторе настроить кэширование, то такой подход в разы лучше чем эдакие псевдоязыки в шаблоне.

46. Nu3oN (03.08.2011 / 11:49)
eGo Отвертка в ухе (3 Августа 2011 / 10:58)
42. Джикинайс, ну в документации к xtemplate видел подобный пример, надеюсь кэшируют
там кстати еще дополнительный класс для кэширования, надо будет изучить smile
В любом случае обработка произойдет, работа над кешем тоже какое то время занимает =) у меня все гораздо проще думаю так же и у рамзеса если он логику не менял =)

47. KOZZ (03.08.2011 / 11:53)
46. Джикинайс, ну это не так критично я думаю уже.
повторюсь, лучше чем изобретение псеводязыка

48. ramzes (03.08.2011 / 11:54)
45. eGo Отвертка в ухе, что значит "настроить кеширование"?
нет ни каких псевдо языков. мы же не про смарти говорим
а такие субметки как {if} {else} {foreach =} не требуют изученмя, просто переведите их с английского =) (for each)

Добавлено через 08:50 сек.
46. Джикинайс, не менял =) я за год лучшего варианта так и не предумал

49. Nu3oN (03.08.2011 / 12:11)
48. ramzes, ну я чуть чуть поравил, изменил синтаксис, сделал как на TWIG'е, добавил буферизацию для кеша статических шаблонов и сделал подробный контроль над шаблонизатором для отладки)))

50. ramzes (03.08.2011 / 12:14)
49. Джикинайс, а зачем буфферизацию?

51. Nu3oN (03.08.2011 / 12:30)
ramzes (3 Августа 2011 / 12:14)
49. Джикинайс, а зачем буфферизацию?
<?php
ob_start();
Template :: parse($tpl);
$a = ob_get_clean();

Template :: saveCache($a);
?>
И потом подгружение кеша вместо обработки и вывода шаблона =)
В общем типичный кеш))))

52. ramzes (03.08.2011 / 12:40)
хм...
ob_start();
$this->_unpackData(); // разворачивание массива с данными
$this->_parseTPL(); // проверка кеша, создание нового при необходимости, подключение
ob_end_flush();
в чем разница? или я чего то не уловил? (на ошибки не смотри, я щас на работе сижу, на память не воспроизведу точно)

53. Nu3oN (03.08.2011 / 13:00)
<?php
interface inTemplate
{
	/**
	* assign
	*
	* Установка переменных, доступных в шаблоне.
	*
	* @param string $var   Имя переменной.
	* @param mixed  $key   Значение переменной.
	**/
    static function assign($var, $key);
 
	/**
	* _searchVar
	*
	* Поиск переменных в конструкциях.
	*
	* @param  string $str	Код шаблона.
	* @return string
	**/
	static function _searchVar($str); 

	/**
	* _parseVar
	*
	* Обработка переменных в шаблоне.
	*
	* @param  string $str	Код шаблона.
	* @return string
	**/
	static function _parseVar($str);


	/**
	* _parseTpl
	*
	* Обработка шаблона.
	*
	* @param  string $tpl		Путь к шаблону.
	* @param  string $fileComp	Путь к компилятору.
	* @return string
	**/
	static function _parseTpl($tpl, $fileComp);

	/**
	* _saveComp
	*
	* Сохранение скомпилированого шаблона.
	*
	* @param  string $str		Код шаблона.
	* @param  string $fileComp	Путь к компилятору.
	* @return bool
	**/
	static function _newComp($str, $fileComp);

	/**
	* _saveCache
	*
	* Сохранение кеша.
	*
	* @param  string $str		Строка для сохранения.
	* @param  string $fileCache	Путь к файлу кеша.
	* @return bool
	**/
	static function _saveCache($str, $fileCache);

	/**
	* _isComp
	*
	* Проверка существования скомпилированого шаблона.
	*
	* @param  string $tpl		Путь к шаблону.
	* @param  string $fileComp	Путь к компилятору.
	* @return bool
	**/
	static function _isComp($tpl, $fileComp);
 
	/**
	* display
	*
	* Вывод шаблона.
	*
	* @param  string $tpl		Путь к шаблону.
	**/
	static function display($tpl);
}


54. Nu3oN (03.08.2011 / 13:14)
ramzes (3 Августа 2011 / 12:40)
хм...
ob_start();
$this->_unpackData(); // разворачивание массива с данными
$this->_parseTPL(); // проверка кеша, создание нового при необходимости, подключение
ob_end_flush();
в чем разница? или я чего то не уловил? (на ошибки не смотри, я щас на работе сижу, на память не воспроизведу точно)
в твоем примере все сразу выводится, а мне необходимо сохранять это все в файл =)

55. ramzes (03.08.2011 / 14:10)
54. Джикинайс, зачем? это же двойная работа, шаблон компилишь в файл, потом еще раз его компилишь в файл?
или мы совсем о разном? %) я сегодня не выспался совсем

56. Nu3oN (03.08.2011 / 15:00)
ramzes (3 Августа 2011 / 14:10)
54. Джикинайс, зачем? это же двойная работа, шаблон компилишь в файл, потом еще раз его компилишь в файл?
или мы совсем о разном? %) я сегодня не выспался совсем
мы о разном =)

URL: https://visavi.net/topics/23706