Вызов функции из переменной
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('|<!--module
.*)-->|'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.
МегабиТ, можно как угодно
главная суть в том что не надо пых в шаблон пихать
я раньше <list></list> использовал
11.
Алексей (31.07.2011 / 20:13)
ramzes (31 Июля 2011 / 20:09)
9. МегабиТ, можно как угодно главная суть в том что не надо пых в шаблон пихать
я раньше <list></list> использовал
при таком подходе верстальщику не придется знать технические аспекты твоего шаблонизатора (конструкции 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)
будущее за апокалипсисом
рам не прекращает меня удивлять
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, что ты имеешь ввиду под понятием "нативный шаблон"?
это каша из хтмл и пыха (то что генерирует обыкновенный шаблонизатор)
когда то и мне нравилось
20.
KOZZ (01.08.2011 / 13:42)
19.
ramzes, ну я щас активно погуглил по этим шаблонизаторам, понравился блочный xtemplate, начал переписывать даже свой готовящийся проект
21.
ramzes (01.08.2011 / 13:44)
20.
eGo, ))) это был самый первый шаблонизатор который я попробовал
хорошая штука, и тут многим его советовал
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, обычно это колесо рано или поздно превращается в свой собственный шаблонизатор)) в колесо но уже свое, привычное))
\\ я не помню уже что там и как, может есть подходящий функционал, лугаро вроде тоже его юзает
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 т.е одни и те же яйца только под другим углом
30.
KOZZ (02.08.2011 / 09:44)
29.
.::lugaro::., такого же мнения
поколупал всякие 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.
Джикинайс, да да, уже нашел
там же массивы можно юзать.
поподробнее почитал комменты в самом классе и понял
33.
ramzes (02.08.2011 / 13:28)
29.
.::lugaro::., я пример давал, где же там свой язык?)
я не делаю того что ты назвал "Ты делаешь те же выражения что и в php", я делаю так как посоветовали знакомые верстальщики
34.
Nu3oN (02.08.2011 / 16:48)
ramzes (2 Августа 2011 / 13:28)
29. .::lugaro::., я пример давал, где же там свой язык?)
я не делаю того что ты назвал "Ты делаешь те же выражения что и в php", я делаю так как посоветовали знакомые верстальщики
эмм я использую такой же механизм, и не жалуюсь, и оперативно, и полный контроль и самое главное ничего лишнего :-)
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 видел подобный пример, надеюсь кэшируют
там кстати еще дополнительный класс для кэширования, надо будет изучить
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 видел подобный пример, надеюсь кэшируют
там кстати еще дополнительный класс для кэширования, надо будет изучить
В любом случае обработка произойдет, работа над кешем тоже какое то время занимает =) у меня все гораздо проще думаю так же и у рамзеса если он логику не менял =)
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