За последние 24 часа нас посетили 18189 программистов и 1700 роботов. Сейчас ищут 1745 программистов ...

Шаблонизатор. Опять. Нужен совет.

Тема в разделе "PHP для новичков", создана пользователем Koc, 21 мар 2008.

Статус темы:
Закрыта.
  1. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Доброго времени суток!

    С сентября 2007 года занимаюсь игровым архивом. Начинал с модуля mediacatalog для Slaed 2.0 Lite. потом его полностью переписал, сейчас на 2.5 или 2.4 сижу. Даж не помню. Скажу одно: надоело. Сдалал полную интеграцию с форумом vBulletin. Все красивенько так (я про таблицу с пользователями). переписал комментарии. Добавил Аякс. Но как уже говорил - надоело сидень на Нюке.

    Вот как сейчас выглядит:
    [​IMG] [​IMG]

    Собственно говоря в чем вопрос: нужен шаблонизатор, на котором с легкостью можно было все это сделать (то, чт осейчас). Он должен быть максимально быстр в работе и не сильно сложен. Smarty, Ruby on Rails, etc отпадают, так как сложны для меня.

    Вот несколько вариантов:
    PHP как шаблонизатор - честно говоря не понравился. Опять логика переплетается с шалонами. Похож на шаблонизатор булки)

    Простейший шаблонизатор на PHP ч1.
    Шаблонизатор для PHP: часть вторая - это уже значительно поинтересней. Думаю на нем и остановиться.

    С другой стороны комрад из соседней темы предлагает свое решение.

    Что же выбрать? Это дело будет использоваться для сайтов локальных архивов. Так же собираюсь делать аналог СДО Прометей. Ну и может еще какую-то мелочевку. Помогите выбрать.
     
  2. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Koc
    Зависит от задач, которые должен выполнять именно этот шаблонизатор. Если просто парсинг и вывод html'a - бери от 440 Герц или пиши свой.
     
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    свой отпадает, сразу.
    первая задача: перенести на него то, что есть сейчас. Пример на картинках.
     
  4. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Koc
    А кто сказал, что такое нельзя сделать на своем? Это ведь обычный html. Нужно просто написать логину на РНР.
     
  5. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а что лучше в этом вопросе: str_replace или preh_math ?
     
  6. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    preh_math -- это, надо полагать, preg_replace(). Тогда preg_replace() -- лучше.
     
  7. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Шаблонизатор, на котором нужно поднять весь сайт. Летающие обезьянки атакуют США. По-моему, ему не шаблонизатор нужен, а движок.
     
  8. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Koc, зависит от ситуации. Про preg_* читай в мануале.

    OMG, это когда это регулярка стала быстрее простой замены?
     
  9. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    lexa, нет, мне именно нужен шаблонизатор. Класс для работы с БД есть. Комменты/авторизация есть. Дело за малым - обрабатывать html.
     
  10. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Koc
    lexa имеет ввиду, что использование регулярки будет дольше, чем str_replace.
     
  11. TROODON

    TROODON Активный пользователь

    С нами с:
    4 ноя 2007
    Сообщения:
    112
    Симпатии:
    0
  12. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    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 минут.

    я вообще не понимаю "проблему шаблонизаторов".
    Все думают, что готовые решения решат груз их задач? Так зависит не от шаблонизатора а от архитектуры проекта и тип шаблонизатора, вернее его логика работы, вытекает из той самой архитектуры приложения, а не от фич самого шаблонизатора.

    Если приложение спроектировано через жопу то что ни ставь - будут одни трудности, а при грамотном проектировании что ни поставь - все будет хоршо.
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    если надо могу написать на эту тему еще одну ставтью с более продвинутыи шаблонизатором, но ИМХО, это ж кому надо?
     
  14. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Elkaz, я не совсем довн. Понял, что регулярка медленнее =)

    440Hz
    это нужно подрастающему поколению), пЕши =).
     
  15. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Да, с логикой (if-else хотябы) было бы очень занятно поковырять.
     
  16. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    +Sten+
    а вот тут я б не согласился. Зачем нужен шаблонизатор? Для того, чтобы отделить всю логику от html. Тут же мы опять получаем гремучую смесь логики и кода. Концепция MVC не соблюдается.

    С другой стороны вот одна из моих нынешних функций. Винегрет из кода и разметки. Простите за большой размер. Был бы тег more, как на ру-борде - спрятал бы под него.
    PHP:
    1. <?php
    2. function game($pid) {
    3. global $prefix, $db, $folder, $pagetitle;
    4. $result = $db->sql_query("SELECT * FROM ".$prefix."_gamebox WHERE pid='".$pid."'");
    5. $row = $db->sql_fetchrow($result);
    6. $pagetitle = CoolName(array($row['name'], $row['name_rus']), 1)." // ";
    7. $folder = $row['folder'];
    8. if (!$folder) {
    9.     //include("header.php");
    10.     echo"такой игры нет";
    11.     //include("footer.php");
    12.     exit;
    13. }
    14. include("header.php");
    15. #cache
    16.    jQueryConnect("jquery.js");
    17.     jQueryConnect("jquery.form.js");
    18.     jQueryConnect("jquery.dimensions.js");
    19.     jQueryConnect("ui.mouse.js");
    20.     jQueryConnect("ui.slider.js");
    21.     jQueryConnect("jquery.blockUI.js");
    22. global $recache, $file;
    23. $file = "cache/game-".$pid.".html";
    24. if (cacheCheck($file, 21600) && !$recache) {
    25.     echo file_get_contents($file);
    26.     updCounter ($pid);
    27. } else {
    28.     ob_start(cacheWrite);
    29. #cache
    30.    $companys = explode(",", $row['developer'].",".$row['publisher'].",".$row['localizer'].",".$row['publisher_rus']);
    31.     $companys = array_unique($companys);
    32.     $companys = clear_array_empty($companys);
    33.     $companys = implode(",",$companys);
    34.     $resultCompany = $db->sql_query("SELECT id, title, site FROM ".$prefix."_gamebox_company WHERE id IN (".$companys.")");
    35.     while (list($id, $title, $site) = $db->sql_fetchrow($resultCompany)) {
    36.         $cTitle[$id] = $title;
    37.         $cSite[$id] = $site;
    38.     }
    39.  
    40. echo"
    41. <table width=\"100%\">
    42.  <tr>
    43.    <td vAlign=top><center>".CoolName(array($row['name'], $row['name_rus']))."</center></td>
    44.  </tr>
    45. </table>
    46.  
    47. <table width=\"100%\">
    48.  <tr>";
    49.  
    50.     $cover = "images/gamebox/".$folder."/cover.jpg";
    51.     if (!file_exists($cover))
    52.         $cover = "images/gamebox/noCover.png";
    53.    
    54.     echo"<td vAlign=top width=\"220\"><img src=\"".$cover."\" width=\"220\" title=\"".CoolName(array($row['name'], $row['name_rus']), 1)."\" /></td>
    55.    <td vAlign=top>
    56.      <table cellSpacing=0 cellPadding=2 width=\"100%\" border=0 VALIGN=\"TOP\">
    57.        <tr>
    58.          <th width=\"100%\" colspan=\"2\"><center>Информация об игре</center></th>
    59.     </tr>";
    60.         if ($row['name']) echo"
    61.     <tr>
    62.          <td width=\"50%\"><b>Название:</b></td>
    63.          <td width=\"50%\">".$row['name']."</td>
    64.     </tr>";
    65.        
    66.     if ($row['name_alt']) echo"
    67.     <tr>
    68.          <td width=\"50%\"><b>Альтернативное название:</b></td>
    69.          <td width=\"50%\">".$row['name_alt']."</td>
    70.     </tr>";
    71.  
    72.     if ($row['name_rus']) echo"
    73.     <tr>
    74.          <td width=\"50%\"><b>Название в России:</b></td>
    75.          <td width=\"50%\">".$row['name_rus']."</td>
    76.     </tr>";
    77.     $developer = explode(",", $row['developer']);
    78.     if ($developer[0]) {
    79.         echo"
    80.         <tr>
    81.           <td width=\"50%\"><b>Разработчик:</b></td>
    82.           <td width=\"50%\"><a href=\"".$cSite[$developer[0]]."\">".$cTitle[$developer[0]]."</a>";
    83.         if ($developer[1]) echo" и <a href=\"".$cSite[$developer[1]]."\">".$cTitle[$developer[1]]."</a>";
    84.         echo"</td></tr>";
    85.     }
    86.        
    87.     if ($row['publisher']) echo"
    88.        <tr>
    89.          <td width=\"50%\"><b>Издатель:</b></td>
    90.          <td width=\"50%\"><a href=\"".$cSite[$row['publisher']]."\">".$cTitle[$row['publisher']]."</a></td>
    91.     </tr>";
    92.  
    93.     if ($row['localizer']) echo"
    94.        <tr>
    95.          <td width=\"50%\"><b>Локализатор в СНГ:</b></td>
    96.          <td width=\"50%\"><a href=\"".$cSite[$row['localizer']]."\">".$cTitle[$row['localizer']]."</a></td>
    97.     </tr>";
    98.  
    99.     if ($row['publisher_rus']) echo"
    100.        <tr>
    101.          <td width=\"50%\"><b>Издатель в СНГ:</b></td>
    102.          <td width=\"50%\"><a href=\"".$cSite[$row['publisher_rus']]."\">".$cTitle[$row['publisher_rus']]."</a></td>
    103.     </tr>";
    104.    
    105.     if ($row['year']) echo"
    106.        <tr>
    107.          <td width=\"50%\"><b>Дата выхода:</b></td>
    108.          <td width=\"50%\">".$row['year']."</td>
    109.     </tr>";
    110.    
    111.     if ($row['year_rus']) echo"
    112.        <tr>
    113.          <td width=\"50%\"><b>Дата выхода в СНГ:</b></td>
    114.          <td width=\"50%\">".$row['year_rus']."</td>
    115.     </tr>";
    116.  
    117.     if ($row['site'] || $row['site_rus']) {
    118.     echo"
    119.        <tr>
    120.          <td width=\"50%\"><b>Официальный сайт:</b></td>
    121.          <td width=\"50%\">";
    122.       if ($row['site']) {
    123.           echo"<a href=\"".$row['site']."\">Открыть</a>";
    124.           if ($row['site_rus'])
    125.               echo" (<a href=\"".$row['site_rus']."\">Открыть русский сайт</a>)";
    126.           }
    127.       else echo"<a href=\"".$row['site_rus']."\">Открыть русский сайт</a>";
    128.       echo"</td>
    129.     </tr>";
    130.     }
    131.    
    132.         echo"
    133.     <tr>
    134.          <td width=\"50%\"><b>Жанры:</b></td>
    135.          <td width=\"50%\">";CoolGenre($row['cid'], 1);echo"</td>
    136.     </tr>";
    137.    
    138.     if ($row['multiplayer']) echo"
    139.        <tr>
    140.          <td width=\"50%\"><b>Multiplayer:</b></td>
    141.          <td width=\"50%\">".$row['multiplayer']."</td>
    142.     </tr>";
    143.    
    144.         if ($row['ver']) echo"
    145.     <tr>
    146.          <td width=\"50%\"><b>Версия игры</b></td>
    147.          <td width=\"50%\">".$row['ver']."</td>
    148.     </tr>";
    149.    
    150.     echo"
    151.        <tr>
    152.          <td width=\"50%\"><b>Русский текст:</b> ";
    153.       if ($row['lng_t']) echo"да"; else echo"нет";
    154.       echo"</td>
    155.          <td width=\"50%\"><b>Русская озвучка:</b> ";
    156.       if ($row['lng_s']) echo"да"; else echo"нет";
    157.       echo"</td>
    158.     </tr>";
    159.  
    160.     if ($row['esrb'])
    161.     echo"
    162.     <tr>
    163.          <td width=\"50%\"><b><font color=\"red\">ESRB</font></b></td>
    164.          <td width=\"50%\"><b>".$row['esrb']."</b></td>
    165.     </tr>";
    166.            
    167.     echo"
    168.        </table>
    169.   </tr>
    170. </table>
    171.  
    172. <table width=\"100%\">";
    173.     if ($row['alike_games_names'] && $row['alike_games_folders']) {
    174.         $alike_games_names = explode("|", $row['alike_games_names']);
    175.         $alike_games_folders = explode("|", $row['alike_games_folders']);
    176.         echo"
    177.    <tr>
    178.         <td vAlign=top width=\"20\">&nbsp;</td>
    179.         <td vAlign=top><b>Похожие игры:</b> ";
    180.         for($i=0;$i<sizeof($alike_games_names);$i++) {
    181.             echo"<a target=_blank href=\"http://ag.ru/games/".$alike_games_folders[$i]."\">".$alike_games_names[$i]."</a>";
    182.             if ($i+1<sizeof($alike_games_names)) echo", ";
    183.         }
    184.         echo"</td>
    185.    </tr>";
    186.     }
    187.  
    188.     if ($row['description'])
    189.         echo"
    190.     <tr><td vAlign=top colspan=\"2\"><b>Описание:</b></td></tr>
    191.     <tr><td vAlign=top width=\"20\">&nbsp;</td><td vAlign=top>".$row['description']."</td></tr>";
    192.  
    193.     if ($row['features_of_game']) {
    194.     $features_of_game = explode("_", $row['features_of_game']);
    195.         echo"
    196.     <tr><td vAlign=top colspan=\"2\"><b>Особенности игры:</b></td></tr>
    197.     <tr><td vAlign=top width=\"20\">&nbsp;</td><td vAlign=top><ul>";
    198.     for($i=0;$i<sizeof($features_of_game);$i++)
    199.         echo"<li>".$features_of_game[$i]."</li>";
    200.     echo"</ul></td></tr>";
    201.     }
    202.     if ($row['system_requirements'])
    203.         echo"
    204.     <tr><td vAlign=top colspan=\"2\"><b>Минимальные системные требования:</b></td></tr>
    205.     <tr><td vAlign=top width=\"20\">&nbsp;</td><td vAlign=top>".$row['system_requirements']."</td></tr>";
    206.  
    207. echo"</table>";
    208.     require_once("score.php");
    209.     scoreShow($pid);
    210. echo"
    211. <table width=\"100%\">
    212.  <tr><th><center>Файлы для загрузки</center></th></tr>
    213.  <tr><td>";
    214.     if ($row['active']) echo getLink($pid, $row['counter']);
    215.     else echo "<center><b>Файлы временно недоступны.</b></center>";
    216.   echo"</td></tr>
    217. </table>";
    218.  
    219. list($magnetLink, $countMagnetLink) = getMagnetLink($pid);
    220. if ($countMagnetLink>0)
    221.     echo"<table width=\"100%\"><tr><th><center><font color=red>Альтернативные ссылки на файлы*</font></center></th></tr><tr><td>".$magnetLink."</td></tr></table>";
    222.  
    223. #cache
    224.    ob_end_flush();
    225. }
    226. #cache
    227.    require_once("comments.php");
    228.     comments("Gamebox", $pid);
    229.     createComment("Gamebox", $pid);    
    230.  
    231. include("footer.php");
    232. }
    233. ?>
    Вопрос: как на таком шаблонизаторе реализовать все эти
    PHP:
    1. <?php
    2.     if ($row['description'])
    3.         echo"
    4.     <tr><td vAlign=top colspan=\"2\"><b>Описание:</b></td></tr>
    5.     <tr><td vAlign=top width=\"20\">&nbsp;</td><td vAlign=top>".$row['description']."</td></tr>";
    6. ?>
     
  17. Clone

    Clone Guest

    Нужно понимать разницу между бизнес-логикой и логикой отображения. Если вывести первую из шаблонов, то будет всё аккуратно. Если вывести вторую - получится реально нелогичный HTML. А в приведённом коде, имхо, не очень оптимальный алгоритм. Можно было запихнуть все чётко повторяющиеся участки(какие-то свойства, похоже) в массив и уже шаблонизатором по этому массиву проходиться, а не по каждому свойству в отдельности.
     
  18. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
  19. Clone

    Clone Guest

    Гм, идея, старая как мир, ещё и, имхо, не очень качественно реализована. В частности не самые оптимальные имени методов, в частности is_set сбивает с толку, ведь в PHP функция называется isset... Также, вместо get('variable_name') я бы предпочёл написать $variable_name и не городить огород с "короткими именами функций для вызова". Дальше лазить не стал...
     
  20. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Psih
    спасибо, гляну на досуге
     
  21. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Clone
    В этой версии (старой) просто нету глобальной функции is_set. А это уж извините - isset стандартая функция PHP, поэтому называть isset метод глупо, т.к. используется короткая версия и она не может называтся isset, поэтому is_set.

    $variable_name - очень большая вероятность того, что у вас имена где-то да пересекутся. К тому-же вам придётся где-то все эти переменные инициализировать и делать им global. Вы бы хоть в модуль сперва посмотрели, а потом ругали-бы. Очень хочу посмотреть КАК будет выглядеть система где переменные для шаблона являются глобальными и в проэкте будет пара мегабайт кода...
     
  22. Clone

    Clone Guest

    Psih, ты не совсем понял меня.
    index.php:
    PHP:
    1. <?php
    2. $template = new Template('index.tpl');
    3. $template->assign('var', array(1, 2, 3);
    4. $template->show();
    Template.php:
    PHP:
    1. <?php
    2. class Template()
    3. {
    4. private $tpl_name = '';
    5. private $vars;
    6. public function __construct($tpl_name)
    7. {
    8.   if (file_exists('templates/'.$tpl_name))
    9.     $this->tpl_name = 'templates/'.$tpl_name;
    10.   else
    11.     throw new TemplateNotExists('Error');
    12.   $this->vars = array();
    13. }
    14. public function assign($name, $value)
    15. {
    16.   $this->vars[$name] = $value;
    17. }
    18. public function show()
    19. {
    20.   foreach ($this->vars as $key => $value)
    21.     $$key = $value;
    22.   include $this->tpl_name;
    23. }
    24. }
    В шаблоне:
    PHP:
    1. <div style=""><?php if (isset($var2)) { ?>bla-bla<?php } else { ?>some text<?php } ?></div>
     
  23. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    Народ, поделитесь сооброжениями, как создать блоки вида:
    Код (Text):
    1.  
    2. {repeat:var2}
    3. {var2}linc2<br>
    4. {/repeat}
     
  24. Clone

    Clone Guest

    Для такого я бы предпочёл использовать XSLT. Он бы не дал вставить <br>.
     
  25. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    Ну то копия функции foreach, только для шаблониза, мне для блога новостей надо...
     
Статус темы:
Закрыта.