Доброго времени суток! С сентября 2007 года занимаюсь игровым архивом. Начинал с модуля mediacatalog для Slaed 2.0 Lite. потом его полностью переписал, сейчас на 2.5 или 2.4 сижу. Даж не помню. Скажу одно: надоело. Сдалал полную интеграцию с форумом vBulletin. Все красивенько так (я про таблицу с пользователями). переписал комментарии. Добавил Аякс. Но как уже говорил - надоело сидень на Нюке. Вот как сейчас выглядит: Собственно говоря в чем вопрос: нужен шаблонизатор, на котором с легкостью можно было все это сделать (то, чт осейчас). Он должен быть максимально быстр в работе и не сильно сложен. Smarty, Ruby on Rails, etc отпадают, так как сложны для меня. Вот несколько вариантов: PHP как шаблонизатор - честно говоря не понравился. Опять логика переплетается с шалонами. Похож на шаблонизатор булки) Простейший шаблонизатор на PHP ч1. Шаблонизатор для PHP: часть вторая - это уже значительно поинтересней. Думаю на нем и остановиться. С другой стороны комрад из соседней темы предлагает свое решение. Что же выбрать? Это дело будет использоваться для сайтов локальных архивов. Так же собираюсь делать аналог СДО Прометей. Ну и может еще какую-то мелочевку. Помогите выбрать.
Koc Зависит от задач, которые должен выполнять именно этот шаблонизатор. Если просто парсинг и вывод html'a - бери от 440 Герц или пиши свой.
Koc А кто сказал, что такое нельзя сделать на своем? Это ведь обычный html. Нужно просто написать логину на РНР.
Шаблонизатор, на котором нужно поднять весь сайт. Летающие обезьянки атакуют США. По-моему, ему не шаблонизатор нужен, а движок.
Koc, зависит от ситуации. Про preg_* читай в мануале. OMG, это когда это регулярка стала быстрее простой замены?
lexa, нет, мне именно нужен шаблонизатор. Класс для работы с БД есть. Комменты/авторизация есть. Дело за малым - обрабатывать html.
1. если надо просто паспарсить HTML. то пишется за 30 минут или бери мой и поправь под нужды. <tltle>{TITLE}</title> 2. если есть спец. задачи, то нужно знать круг этих задач, а потом уже искать решения. я сейчс немного усовершенствовал тот шаблонизатор. Он теперь позволяет хранить в файле несколько шаблонов. <!-- BEGIN HTML1--> <html> <body>{BODY}</body> </html> <!-- END HTML1 --> <!-- BEGIN HTML2 --> <html> <title>{TITLE}</title> <body>{BODY}</body> </html> <!-- END HTML2 --> и юзать по имени тот который надо. в общем фич навертеть не проблема, но оно надо? мне первого хватало за глаза даже на больших проектах. Сашка Календарев туда вставил {IF VAL}хахаха{/IF} то ж делается за 15 минут. я вообще не понимаю "проблему шаблонизаторов". Все думают, что готовые решения решат груз их задач? Так зависит не от шаблонизатора а от архитектуры проекта и тип шаблонизатора, вернее его логика работы, вытекает из той самой архитектуры приложения, а не от фич самого шаблонизатора. Если приложение спроектировано через жопу то что ни ставь - будут одни трудности, а при грамотном проектировании что ни поставь - все будет хоршо.
если надо могу написать на эту тему еще одну ставтью с более продвинутыи шаблонизатором, но ИМХО, это ж кому надо?
Elkaz, я не совсем довн. Понял, что регулярка медленнее =) 440Hz это нужно подрастающему поколению), пЕши =).
+Sten+ а вот тут я б не согласился. Зачем нужен шаблонизатор? Для того, чтобы отделить всю логику от html. Тут же мы опять получаем гремучую смесь логики и кода. Концепция MVC не соблюдается. С другой стороны вот одна из моих нынешних функций. Винегрет из кода и разметки. Простите за большой размер. Был бы тег more, как на ру-борде - спрятал бы под него. PHP: <?php function game($pid) { global $prefix, $db, $folder, $pagetitle; $result = $db->sql_query("SELECT * FROM ".$prefix."_gamebox WHERE pid='".$pid."'"); $row = $db->sql_fetchrow($result); $pagetitle = CoolName(array($row['name'], $row['name_rus']), 1)." // "; $folder = $row['folder']; if (!$folder) { //include("header.php"); echo"такой игры нет"; //include("footer.php"); exit; } include("header.php"); #cache jQueryConnect("jquery.js"); jQueryConnect("jquery.form.js"); jQueryConnect("jquery.dimensions.js"); jQueryConnect("ui.mouse.js"); jQueryConnect("ui.slider.js"); jQueryConnect("jquery.blockUI.js"); global $recache, $file; $file = "cache/game-".$pid.".html"; if (cacheCheck($file, 21600) && !$recache) { echo file_get_contents($file); updCounter ($pid); } else { ob_start(cacheWrite); #cache $companys = explode(",", $row['developer'].",".$row['publisher'].",".$row['localizer'].",".$row['publisher_rus']); $companys = array_unique($companys); $companys = clear_array_empty($companys); $companys = implode(",",$companys); $resultCompany = $db->sql_query("SELECT id, title, site FROM ".$prefix."_gamebox_company WHERE id IN (".$companys.")"); while (list($id, $title, $site) = $db->sql_fetchrow($resultCompany)) { $cTitle[$id] = $title; $cSite[$id] = $site; } echo" <table width=\"100%\"> <tr> <td vAlign=top><center>".CoolName(array($row['name'], $row['name_rus']))."</center></td> </tr> </table> <table width=\"100%\"> <tr>"; $cover = "images/gamebox/".$folder."/cover.jpg"; if (!file_exists($cover)) $cover = "images/gamebox/noCover.png"; echo"<td vAlign=top width=\"220\"><img src=\"".$cover."\" width=\"220\" title=\"".CoolName(array($row['name'], $row['name_rus']), 1)."\" /></td> <td vAlign=top> <table cellSpacing=0 cellPadding=2 width=\"100%\" border=0 VALIGN=\"TOP\"> <tr> <th width=\"100%\" colspan=\"2\"><center>Информация об игре</center></th> </tr>"; if ($row['name']) echo" <tr> <td width=\"50%\"><b>Название:</b></td> <td width=\"50%\">".$row['name']."</td> </tr>"; if ($row['name_alt']) echo" <tr> <td width=\"50%\"><b>Альтернативное название:</b></td> <td width=\"50%\">".$row['name_alt']."</td> </tr>"; if ($row['name_rus']) echo" <tr> <td width=\"50%\"><b>Название в России:</b></td> <td width=\"50%\">".$row['name_rus']."</td> </tr>"; $developer = explode(",", $row['developer']); if ($developer[0]) { echo" <tr> <td width=\"50%\"><b>Разработчик:</b></td> <td width=\"50%\"><a href=\"".$cSite[$developer[0]]."\">".$cTitle[$developer[0]]."</a>"; if ($developer[1]) echo" и <a href=\"".$cSite[$developer[1]]."\">".$cTitle[$developer[1]]."</a>"; echo"</td></tr>"; } if ($row['publisher']) echo" <tr> <td width=\"50%\"><b>Издатель:</b></td> <td width=\"50%\"><a href=\"".$cSite[$row['publisher']]."\">".$cTitle[$row['publisher']]."</a></td> </tr>"; if ($row['localizer']) echo" <tr> <td width=\"50%\"><b>Локализатор в СНГ:</b></td> <td width=\"50%\"><a href=\"".$cSite[$row['localizer']]."\">".$cTitle[$row['localizer']]."</a></td> </tr>"; if ($row['publisher_rus']) echo" <tr> <td width=\"50%\"><b>Издатель в СНГ:</b></td> <td width=\"50%\"><a href=\"".$cSite[$row['publisher_rus']]."\">".$cTitle[$row['publisher_rus']]."</a></td> </tr>"; if ($row['year']) echo" <tr> <td width=\"50%\"><b>Дата выхода:</b></td> <td width=\"50%\">".$row['year']."</td> </tr>"; if ($row['year_rus']) echo" <tr> <td width=\"50%\"><b>Дата выхода в СНГ:</b></td> <td width=\"50%\">".$row['year_rus']."</td> </tr>"; if ($row['site'] || $row['site_rus']) { echo" <tr> <td width=\"50%\"><b>Официальный сайт:</b></td> <td width=\"50%\">"; if ($row['site']) { echo"<a href=\"".$row['site']."\">Открыть</a>"; if ($row['site_rus']) echo" (<a href=\"".$row['site_rus']."\">Открыть русский сайт</a>)"; } else echo"<a href=\"".$row['site_rus']."\">Открыть русский сайт</a>"; echo"</td> </tr>"; } echo" <tr> <td width=\"50%\"><b>Жанры:</b></td> <td width=\"50%\">";CoolGenre($row['cid'], 1);echo"</td> </tr>"; if ($row['multiplayer']) echo" <tr> <td width=\"50%\"><b>Multiplayer:</b></td> <td width=\"50%\">".$row['multiplayer']."</td> </tr>"; if ($row['ver']) echo" <tr> <td width=\"50%\"><b>Версия игры</b></td> <td width=\"50%\">".$row['ver']."</td> </tr>"; echo" <tr> <td width=\"50%\"><b>Русский текст:</b> "; if ($row['lng_t']) echo"да"; else echo"нет"; echo"</td> <td width=\"50%\"><b>Русская озвучка:</b> "; if ($row['lng_s']) echo"да"; else echo"нет"; echo"</td> </tr>"; if ($row['esrb']) echo" <tr> <td width=\"50%\"><b><font color=\"red\">ESRB</font></b></td> <td width=\"50%\"><b>".$row['esrb']."</b></td> </tr>"; echo" </table> </tr> </table> <table width=\"100%\">"; if ($row['alike_games_names'] && $row['alike_games_folders']) { $alike_games_names = explode("|", $row['alike_games_names']); $alike_games_folders = explode("|", $row['alike_games_folders']); echo" <tr> <td vAlign=top width=\"20\"> </td> <td vAlign=top><b>Похожие игры:</b> "; for($i=0;$i<sizeof($alike_games_names);$i++) { echo"<a target=_blank href=\"http://ag.ru/games/".$alike_games_folders[$i]."\">".$alike_games_names[$i]."</a>"; if ($i+1<sizeof($alike_games_names)) echo", "; } echo"</td> </tr>"; } if ($row['description']) echo" <tr><td vAlign=top colspan=\"2\"><b>Описание:</b></td></tr> <tr><td vAlign=top width=\"20\"> </td><td vAlign=top>".$row['description']."</td></tr>"; if ($row['features_of_game']) { $features_of_game = explode("_", $row['features_of_game']); echo" <tr><td vAlign=top colspan=\"2\"><b>Особенности игры:</b></td></tr> <tr><td vAlign=top width=\"20\"> </td><td vAlign=top><ul>"; for($i=0;$i<sizeof($features_of_game);$i++) echo"<li>".$features_of_game[$i]."</li>"; echo"</ul></td></tr>"; } if ($row['system_requirements']) echo" <tr><td vAlign=top colspan=\"2\"><b>Минимальные системные требования:</b></td></tr> <tr><td vAlign=top width=\"20\"> </td><td vAlign=top>".$row['system_requirements']."</td></tr>"; echo"</table>"; require_once("score.php"); scoreShow($pid); echo" <table width=\"100%\"> <tr><th><center>Файлы для загрузки</center></th></tr> <tr><td>"; if ($row['active']) echo getLink($pid, $row['counter']); else echo "<center><b>Файлы временно недоступны.</b></center>"; echo"</td></tr> </table>"; list($magnetLink, $countMagnetLink) = getMagnetLink($pid); if ($countMagnetLink>0) echo"<table width=\"100%\"><tr><th><center><font color=red>Альтернативные ссылки на файлы*</font></center></th></tr><tr><td>".$magnetLink."</td></tr></table>"; #cache ob_end_flush(); } #cache require_once("comments.php"); comments("Gamebox", $pid); createComment("Gamebox", $pid); include("footer.php"); } ?> Вопрос: как на таком шаблонизаторе реализовать все эти PHP: <?php if ($row['description']) echo" <tr><td vAlign=top colspan=\"2\"><b>Описание:</b></td></tr> <tr><td vAlign=top width=\"20\"> </td><td vAlign=top>".$row['description']."</td></tr>"; ?>
Нужно понимать разницу между бизнес-логикой и логикой отображения. Если вывести первую из шаблонов, то будет всё аккуратно. Если вывести вторую - получится реально нелогичный HTML. А в приведённом коде, имхо, не очень оптимальный алгоритм. Можно было запихнуть все чётко повторяющиеся участки(какие-то свойства, похоже) в массив и уже шаблонизатором по этому массиву проходиться, а не по каждому свойству в отдельности.
Koc http://file.lv/download/framework.rar Подсмотри как тут построена шаблонизация. Проще и удобнее не бывает.
Гм, идея, старая как мир, ещё и, имхо, не очень качественно реализована. В частности не самые оптимальные имени методов, в частности is_set сбивает с толку, ведь в PHP функция называется isset... Также, вместо get('variable_name') я бы предпочёл написать $variable_name и не городить огород с "короткими именами функций для вызова". Дальше лазить не стал...
Clone В этой версии (старой) просто нету глобальной функции is_set. А это уж извините - isset стандартая функция PHP, поэтому называть isset метод глупо, т.к. используется короткая версия и она не может называтся isset, поэтому is_set. $variable_name - очень большая вероятность того, что у вас имена где-то да пересекутся. К тому-же вам придётся где-то все эти переменные инициализировать и делать им global. Вы бы хоть в модуль сперва посмотрели, а потом ругали-бы. Очень хочу посмотреть КАК будет выглядеть система где переменные для шаблона являются глобальными и в проэкте будет пара мегабайт кода...
Psih, ты не совсем понял меня. index.php: PHP: <?php $template = new Template('index.tpl'); $template->assign('var', array(1, 2, 3); $template->show(); Template.php: PHP: <?php class Template() { private $tpl_name = ''; private $vars; public function __construct($tpl_name) { if (file_exists('templates/'.$tpl_name)) $this->tpl_name = 'templates/'.$tpl_name; else throw new TemplateNotExists('Error'); $this->vars = array(); } public function assign($name, $value) { $this->vars[$name] = $value; } public function show() { foreach ($this->vars as $key => $value) $$key = $value; include $this->tpl_name; } } В шаблоне: PHP: <div style=""><?php if (isset($var2)) { ?>bla-bla<?php } else { ?>some text<?php } ?></div>
Народ, поделитесь сооброжениями, как создать блоки вида: Код (Text): {repeat:var2} {var2}linc2<br> {/repeat}