Eval или есть иной способ? (реализация сниппетов на подобии ModX)

Maler

Новичок
Eval или есть иной способ? (реализация сниппетов на подобии ModX)

Давно работаю со своей CMF, много всякого написал, все меня устраивает. Но тут возникло желание упростить некоторые моменты в выводе информации в теле страницы. К примеру - последние новости, связанные страницы.. да что угодно.

Мне очень понравился принцип работы сниппетов в ModX (Etomite). Решил я это реализовать следующим образом..
1. Создал таблицу со сниппетами (id,code. К примеру id:hellow, code: $out_snip = "hellow");
2. В тексте страницы пишу {__SNIP_hellow__};
3. Читаю сниппеты из таблицы в ассоциативный массив $snip (hellow=>code);
3. В Парсере делаю eval;

А теперь вопрос..
Все работает, но мне не нравится привязка к переменной "$out_snip", как по другому это можно реализовать.
Да и вообще, если кто-то сталкивался с такими вопросами, поделитесь опытом.

Весть код (упрощено)
PHP:
$scode ='$out_snip = "Hellow";';
$snip = array(
  "hellow" => $scode,
);

function BuildTemplate($tpl) {
GLOBAL $snip;
    foreach($snip as $k => $v) {
	eval($v);
	$outv = $out_snip; // переменная из сниппета
      $result = str_replace("{__SNIP_".$k."__}", $outv, $tpl);
    }
    return $result;
  }

/// пример работы
$str_tpl = "Тут {__SNIP_hellow__}!";
echo BuildTemplate($str_tpl);
 

zerkms

TDD infected
Команда форума
Да и вообще, если кто-то сталкивался с такими вопросами, поделитесь опытом.
опыт подсказывает, что можно программировать без eval и global
 

Maler

Новичок
Ну, так и я о том. Подробнее можно?

Подскажите принцип реализации модулей хранимых в бд.

-~{}~ 22.10.07 05:39:

функции не работают, eval говорит что мол уже были объявлены.
 

Maler

Новичок
cDLEON ок, если в этом нет смысла, то подскажите принцип...
 

cDLEON

Онанист РНРСlub
Maler
Хранить модули в файловой системе?

-~{}~ 22.10.07 10:04:

PHP:
ob_start();
include(dirname(__FILE__)."/xModules/".$modName.".php");
$content=ob_get_contents();
ob_end_clean();
//Или так
//Грузим все "модули" путём скана всей диры.
$func="xModules_".$modName;
$content=$func();
 

Maler

Новичок
cDLEON
спасибо за совет, буду учить..

Долго мучил, но видать есть во мне въедливость :) Пока сделал так..

Читаю в массив функции
PHP:
$snipSql = "SELECT * FROM `snippets`;";
$snipResult = mysql_query($snipSql);
$snip = Array();
while($snipRow = mysql_fetch_array($snipResult)){
	$snip_str_code = "function $snipRow[id](){\n$snipRow[code]\n}";
	eval($snip_str_code);
	$snip[$snipRow[id]] = $snipRow[id];
}
А в парсере
PHP:
    foreach($snip as $k => $v) {
      $result = str_replace("{__SNIP_".$k."__}", $v, $result);
    }
п.с.
если ткнете носом, буду рад

===================================

Пробовал так - получилось
PHP:
$str = 'function ns(){
$out_snip = "Последние новости тут";
return $out_snip;
}';
eval($str);

$nnn = call_user_func("ns");
print $nnn;
 

Michael_X

Новичок
имхо полная бредятина с хранением функций для построения чего-то в БД...

почему не использовать тот же "шаблонизатор" smarty?
smarty.php.net
 

Maler

Новичок
Michael_X
Почему бредятина? "Ткните" носом.

Смарти очень хорошая штука, мне нравится.. Но как всегда хочется чем-то усложнить себе жизнь.

upd ================
Какая разница где хранятся данные, суть не в этом..они могут быть грубо забиты в массив, или перебором из папки загонять в массив имена файлов, а потом инклудиться....
Суть вопроса в "гибкости метода". Пока мой метод до ужаса прямой он заменяет {__ШИЛО__} на "МЫЛО".

П.С.
Если есть основа, небольшое ядро (смарти ненадо :)), поделитесь примерчиком.. буду безмерно рад :)

-~{}~ 23.10.07 22:40:

Спасибо за ответы.. решил вопрос так..
© ModX
PHP:
        ob_start();
        $mes= eval($snippet);
        $msg= ob_get_contents();
        ob_end_clean();
-~{}~ 23.10.07 22:43:

{__ШИЛО__} на "МЫЛО"
это и требовалось.. :)
 
Сверху