За последние 24 часа нас посетили 20729 программистов и 1164 робота. Сейчас ищут 666 программистов ...

Шаблонизатор

Тема в разделе "Решения, алгоритмы", создана пользователем Danilka, 30 апр 2008.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    внезапно обнаружил, что если переменные в шаблоне не определены, возникает Notice :D теперь понятно, почему psih делает
    в принципе, можно делать так
    PHP:
    1. <?php
    2.          public function compile(){
    3.              $err_level = error_reporting(0);
    4.              extract($this->vars);
    5.              ob_start();
    6.              include($this->path);
    7.              error_reporting($err_level);
    8.              return ob_get_clean();
    9.          }
    тогда на этапе отладки или вообще когда вклчены все ошибки, не будут мешаться ненужные нотисы.
     
  2. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Если заданы не все переменные в шаблоне, то это как раз нотис - сигнал подумать.
    Может шаблон не совсем верен? Может я переменную забыл впихнуть?
     
  3. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Volt(220)
    HTML:
    1. <input type="text" value="<?php echo get('field_value')?>" name="field" />
     
  4. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Luge
    Т.е. когда-то надо записать в инпут значение, а когда-то нет?
    Тогда надо присвоить переменной пустую строку. Все равно считается, что переменные надо инициализировать начальными значениями явно.

    PHP:
    1. <?php
    2. $inp="";
    3. if (что-то){
    4. Что-то делаем;
    5. $inp="Начальное значение";
    6. }
    7.  
    8. $tpl= new Template(t.tpl);
    9. $tpl->field_value=$inp;
    10.  
    Ну или можно сделать шаблон формы:

    PHP:
    1. <?php
    2. class AuthFormTpl extends Template{
    3.    
    4.     function __construct($cache=null, $dir=null){
    5.         parent::__construct(DOCROOT."/Templates/AuthForm.tpl", $cache, $dir);
    6.         $this->login="";
    7.         $this->pass="";
    8.     }
    9.  
    10. }
    11.  
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Volt(220)
    Проблема возникнет, если несколько контроллеров используют какой-то один шаблон. Допустим мне надо чтобы в неком таком глобальном шаблоне на конкретной странице выводился дополнительный блок. Я пишу в шблоне
    HTML:
    1. <?php echo $block?>
    теперь мне надо по твоей логике в каждом контроллере, которые используют этот шаблон когда будут выводить другие страницы, дописать
    PHP:
    1. $template -> block = null;
    либо выносить логику в шаблон чтобы проверять, та ли это страница.
     
  6. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Volt(220)
    Мы с Luge работали вместе почти полтора года, так что подход он мой знает. Плюс такого похода в том, что один и тот же шаблон у нас использовался как для добавления, так и для редактирования. Обработка ошибок сводится к выбрасыванию Exception и подстановку через простейший foreach данных из POST в хранилище шаблонизатора. А если такой переменной нет, он просто возвращает пустую строку.

    Вот вырезка из проекта с шаблонами и кодом, страница из админки: список, редактирование, добавление:
    PHP:
    1. <?php
    2. class Loads extends ModuleCore {
    3.  
    4.     // Constructor. destructor and other stuff
    5.  
    6.     /**
    7.      * Show load list
    8.      *
    9.      */
    10.     public function showloads()
    11.     {
    12.         $sql = 'SELECT *
    13.                 FROM phone_loads
    14.                 LEFT JOIN phone_load_operators ON plo_id = pld_plo_id
    15.                 LEFT JOIN currencies ON cur_id = pld_cur_id
    16.                 ORDER BY plo_id ASC, pld_load ASC';
    17.         $res = $this->db->query($sql);
    18.         if ($res && $res->num_rows) {
    19.             $rows = array();
    20.             while ($row = $res->fetch_assoc()) {
    21.                 $row = $this->utils->htmlsc($row);
    22.                 $rows[] = $row;
    23.             }
    24.             $this->parser->set('data', $rows);
    25.         }
    26.         $this->parser->append('content_center', $this->box(_("Loads"), $this->template('showloads.htm')));
    27.     }
    28.  
    29.     /**
    30.      * Edit existing load
    31.      *
    32.      */
    33.     public function editLoad()
    34.     {
    35.         Core::setLayout('layout_popup.htm');
    36.         if (!isset($this->session['auth']) || $this->session['auth']['class'] < self::UC_SYSADMIN) {
    37.             $this->parser->set('content_popup', CLOSE_AND_REFRESH);
    38.             return;
    39.         }
    40.         $pld_id = (int)Core::getArg(2);
    41.  
    42.         $this->parser->set('operators', $this->getOperators());
    43.         $this->parser->set('currencies', $this->getCurrencies());
    44.         $this->parser->set('loadtypes', $this->getLoadTypes());
    45.  
    46.         $sql = 'SELECT * FROM phone_loads WHERE pld_id = '.$pld_id;
    47.         $res = $this->db->query($sql);
    48.         if (!$res || $res->num_rows == 0) {
    49.             $this->parser->append('content_popup', CLOSE_AND_REFRESH);
    50.             return;
    51.         }
    52.         foreach ($res->fetch_assoc() as $k => $v) {
    53.             $this->parser->set($k, $this->utils->htmlsc($v));
    54.         }
    55.         if (is_post() && isset($_POST['do'])) {
    56.             try {
    57.                 $post = $this->db->escape($this->validateLoad($_POST));
    58.  
    59.                 $sql = 'UPDATE phone_loads
    60.                         SET
    61.                             pld_plo_id = '.(int)$post['pld_plo_id'].',
    62.                             pld_load = '.(int)$post['pld_load'].',
    63.                             pld_cur_id = '.(int)$post['pld_cur_id'].',
    64.                             pld_status = "'.$post['pld_status'].'",
    65.                             pld_sms = '.(int)$post['pld_sms'].',
    66.                             pld_expire = '.(int)$post['pld_expire'].',
    67.                             pld_code = "'.$post['pld_code'].'",
    68.                             pld_type = "'.$post['pld_type'].'"
    69.                         WHERE pld_id = '.$pld_id;
    70.                 $this->db->query($sql);
    71.                 $this->parser->append('content_popup', CLOSE_AND_REFRESH);
    72.                 return;
    73.             } catch (CoreException $e) {
    74.                 $this->parser->set('error', $e->getMessage());
    75.                 foreach ($_POST as $k => $v) {
    76.                     $this->parser->set($k, $this->utils->htmlsc($v));
    77.                 }
    78.             }
    79.         }
    80.         $this->parser->append('content_popup', $this->box(_("Edit load"), $this->template('showloads_edit.htm')));
    81.     }
    82.  
    83.     /**
    84.      * Add new load
    85.      *
    86.      */
    87.     public function addLoad()
    88.     {
    89.         Core::setLayout('layout_popup.htm');
    90.         if (!isset($this->session['auth']) || $this->session['auth']['class'] < self::UC_SYSADMIN) {
    91.             $this->parser->set('content_popup', CLOSE_AND_REFRESH);
    92.             return;
    93.         }
    94.         $this->parser->set('operators', $this->getOperators());
    95.         $this->parser->set('currencies', $this->getCurrencies());
    96.         $this->parser->set('loadtypes', $this->getLoadTypes());
    97.  
    98.         if (is_post() && isset($_POST['do'])) {
    99.             try {
    100.                 $post = $this->db->escape($this->validateLoad($_POST));
    101.  
    102.                 $sql = 'INSERT INTO phone_loads
    103.                         (pld_plo_id, pld_load, pld_cur_id, pld_status, pld_sms, pld_expire, pld_code, pld_type)
    104.                         VALUES('.(int)$post['pld_plo_id'].', '.(int)$post['pld_load'].', '.(int)$post['pld_cur_id'].',
    105.                                 "'.$post['pld_status'].'", '.(int)$post['pld_sms'].', '.(int)$post['pld_expire'].',
    106.                                 "'.$post['pld_code'].'", "'.$post['pld_type'].'")';
    107.                 $this->db->query($sql);
    108.                 $this->parser->append('content_popup', CLOSE_AND_REFRESH);
    109.                 return;
    110.             } catch (CoreException $e) {
    111.                 $this->parser->set('error', $e->getMessage());
    112.                 foreach ($_POST as $k => $v) {
    113.                     $this->parser->set($k, $this->utils->htmlsc($v));
    114.                 }
    115.             }
    116.         }
    117.         $this->parser->append('content_popup', $this->box(_("Add load"), $this->template('showloads_edit.htm')));
    118.     }
    119.  
    120.     /**
    121.      * Validate and filter all form fields
    122.      *
    123.      * @param array $post
    124.      * @return array
    125.      */
    126.     private function validateLoad(array $post)
    127.     {
    128.         $post = $this->utils->stripTags($post);
    129.         if (!array_key_exists($post['pld_plo_id'], $this->getOperators())) {
    130.             throw new CoreException(_("Please select operator!"));
    131.         }
    132.  
    133.         if (!array_key_exists($post['pld_cur_id'], $this->getCurrencies())) {
    134.             throw new CoreException(_("Please select currency!"));
    135.         }
    136.  
    137.         if (!in_array($post['pld_type'], $this->getLoadTypes())) {
    138.             throw new CoreException(_("Please select load type!"));
    139.         }
    140.  
    141.         if (!is_numeric($post['pld_load'])) {
    142.             throw new CoreException(_("Please enter only numbers into load field!"));
    143.         }
    144.  
    145.         if (!is_numeric($post['pld_expire'])) {
    146.             throw new CoreException(_("Please enter only numbers in expires field!"));
    147.         }
    148.  
    149.         if (!is_numeric($post['pld_sms'])) {
    150.             throw new CoreException(_("Please enter only numbers in free sms amount field!"));
    151.         }
    152.  
    153.         if (mb_strlen($post['pld_code']) > 15) {
    154.             throw new CoreException(_("Load code is 15 symbols max!"));
    155.         }
    156.  
    157.         $post['pld_status'] = (isset($post['pld_status']) && $post['pld_status'] == 'enabled') ? 'enabled' : 'disabled';
    158.  
    159.         return $post;
    160.     }
    161. }
    И шаблоны:
    showloads.htm
    PHP:
    1. <a href="/loads/show.html">Show transactions</a> |
    2. <a href="/loads/operators.html">Show operators</a> |
    3. <a href="/loads/merchants.html">Show merchants</a> |
    4. Show loads |
    5. <a href="/loads/loadprices.html">Show load prices</a>
    6. <br />
    7. <br />
    8. <?php if (get('user_class', true) === true):?>
    9. <input type="button" value="<?php echo _("Add new load")?>" onclick="return openWindow('/loads/addLoad.html', 300, 400);">
    10. <?php endif;?>
    11. <table cellspacing="0">
    12.     <tr>
    13.         <th><?php echo _("ID")?></th>
    14.         <th><?php echo _("Operator")?></th>
    15.         <th><?php echo _("Load")?></th>
    16.         <th><?php echo _("Expires in days")?></th>
    17.         <th><?php echo _("Free SMS")?></th>
    18.         <th><?php echo _("Type")?></th>
    19.         <th><?php echo _("Code")?></th>
    20.         <th><?php echo _("Status")?></th>
    21.         <th>&nbsp;</th>
    22.     </tr>
    23.     <?php if (is_set('data')):
    24.         foreach (get('data') as $v):?>
    25.             <tr>
    26.                 <td><?php echo $v['pld_id']?></td>
    27.                 <td><?php echo $v['plo_name']?></td>
    28.                 <td><?php echo $v['pld_load']?> <?php echo $v['cur_code']?></td>
    29.                 <td><?php echo $v['pld_expire']?></td>
    30.                 <td><?php echo $v['pld_sms']?></td>
    31.                 <td><?php echo $v['pld_type']?></td>
    32.                 <td><?php echo $v['pld_code']?></td>
    33.                 <td><?php echo $v['pld_status']?></td>
    34.                 <td><?php if (get('user_class', true) === true):?>
    35.                     <a href="#" onclick="return openWindow('/loads/editLoad/<?php echo $v['pld_id']?>.html', 350, 400);"><?php echo _("Edit")?></a>
    36.                     <?php endif;?>
    37.                 </td>
    38.             </tr>
    39.         <?php endforeach;
    40.     else:?>
    41.         <tr>
    42.             <td colspan="4"><?php echo _("No loads avaliable")?></td>
    43.         </tr>
    44.     <?php endif;?>
    45. </table>
    showloads_edit.htm
    PHP:
    1.  
    2. <form method="post" action="">
    3.     <table cellspacing="0">
    4.         <?php if (is_set('error')):?>
    5.         <tr>
    6.             <td><label><?php echo _("Error")?></label></td>
    7.             <td class="error"><?php echo get('error')?></td>
    8.         </tr>
    9.         <?php endif;?>
    10.         <tr>
    11.             <td><label><?php echo _("Operator")?></label></td>
    12.             <td><?php $op = get('pld_plo_id')?>
    13.                 <select name="pld_plo_id">
    14.                     <?php foreach (get('operators') as $k => $v):?>
    15.                         <option value="<?php echo $k?>"<?php echo $op == $k ? ' selected="selected"' : '' ?>><?php echo $v?></option>
    16.                     <?php endforeach;?>
    17.                 </select>
    18.             </td>
    19.         </tr>
    20.         <tr>
    21.             <td><label><?php echo _("Load")?></label></td>
    22.             <td><input type="text" name="pld_load" value="<?php echo get('pld_load')?>" maxlength="4" /></td>
    23.         </tr>
    24.         <tr>
    25.             <td><label><?php echo _("Currency")?></label></td>
    26.             <td><?php $cur = get('pld_cur_id')?>
    27.                 <select name="pld_cur_id">
    28.                     <?php foreach (get('currencies') as $k => $v):?>
    29.                         <option value="<?php echo $k?>"<?php echo $cur == $k ? ' selected="selected"' : '' ?>><?php echo $v?></option>
    30.                     <?php endforeach;?>
    31.                 </select>
    32.             </td>
    33.         </tr>
    34.         <tr>
    35.             <td><label><?php echo _("Expires")?></label></td>
    36.             <td><input type="text" name="pld_expire" value="<?php echo get('pld_expire')?>" maxlength="4" /></td>
    37.         </tr>
    38.         <tr>
    39.             <td><label><?php echo _("Free sms")?></label></td>
    40.             <td><input type="text" name="pld_sms" value="<?php echo get('pld_sms')?>" maxlength="4" /></td>
    41.         </tr>
    42.         <tr>
    43.             <td><label><?php echo _("Type")?></label></td>
    44.             <td><?php $type = get('pld_type')?>
    45.                 <select name="pld_type">
    46.                     <?php foreach (get('loadtypes') as $v):?>
    47.                         <option value="<?php echo $v?>"<?php echo $type == $v ? ' selected="selected"' : '' ?>><?php echo $v?></option>
    48.                     <?php endforeach;?>
    49.                 </select>
    50.         </tr>
    51.         <tr>
    52.             <td><label><?php echo _("Code")?></label></td>
    53.             <td><input type="text" name="pld_code" value="<?php echo get('pld_code')?>" maxlength="15" /></td>
    54.         </tr>
    55.         <tr>
    56.             <td><label><?php echo _("Status")?></label></td>
    57.             <td><input type="checkbox" name="pld_status" value="enabled" <?php echo get('pld_status') == 'enabled' ? 'checked="checked" ' : ''?>/></td>
    58.         </tr>
    59.         <tr>
    60.             <td colspan="2" style="text-align: center;">
    61.                 <input type="submit" value="<?php echo _("Save")?>" /> &nbsp;&nbsp;&nbsp;
    62.                 <input type="button" value="<?php echo _("Close")?>" onclick="window.close();" />
    63.             </td>
    64.         </tr>
    65.     </table>
    66.     <input type="hidden" name="do" value="1" />
    67. </form>
    68.  
    А вот так выглядит класс Parser
    PHP:
    1. <?php
    2. <?php
    3.  
    4. /*
    5. * Templates parser class
    6. */
    7. class Parser{
    8.  
    9.     /**
    10.      * Template name array.
    11.      *
    12.      * @var array
    13.      */
    14.     private $_template;
    15.  
    16.     /**
    17.      * Variable array
    18.      *
    19.      * @var array
    20.      */
    21.     private $_variables;
    22.  
    23.     /**
    24.      * Global variable array
    25.      *
    26.      * @var array
    27.      */
    28.     private $_global;
    29.  
    30.    /**
    31.      * Constructor
    32.      *
    33.      * @return void
    34.      */
    35.     public function __construct(Core $core)
    36.     {
    37.         $this->_template = array();
    38.         $this->_variables = array();
    39.         $this->_global = array();
    40.     }
    41.  
    42.     public function __destruct()
    43.     {
    44.     }
    45.  
    46.     /**
    47.      * Set template variable
    48.      *
    49.      * @param string $var_name Name, under witch data will be stored in internal associative array
    50.      * @param mixed $data
    51.      * @param bool $global If is set to "true", then global variable is created. This means it doesn't get deleted when fetched.
    52.      */
    53.     public function set($var_name, $data, $global = false)
    54.     {
    55.         $this->{$global ? '_global' : '_variables'}[$var_name] = $data;
    56.     }
    57.  
    58.     /**
    59.      * Load template by include and return processed string.
    60.      * If file wasn't found - give a fatal error.
    61.      *
    62.      * @param string $file
    63.      * @return string
    64.      */
    65.     public function load($file)
    66.     {
    67.         if (file_exists($file)) {
    68.             ob_start();
    69.             include($file);
    70.             return ob_get_clean();
    71.         }else {
    72.             trigger_error('File '.$file.' doesn\'t exist', E_USER_ERROR);
    73.         }
    74.     }
    75.  
    76.     /**
    77.      * Appends data to existing variable. If variable doesn't exists - creates it.
    78.      * Works only with string or int type data.
    79.      *
    80.      * @param string $var_name Name, under witch data will be stored in internal associative array
    81.      * @param string $data
    82.      * @param bool $global If is set to "true", then global variable is created. This means it doesn't get deleted when fetched.
    83.      * @return void
    84.      */
    85.     public function append($var_name, $data, $global = false){
    86.  
    87.         $arr = $global ? '_global' : '_variables';
    88.         if (isset($this->{$arr}[$var_name])){
    89.             $this->{$arr}[$var_name] .= $data;
    90.         } else {
    91.             $this->{$arr}[$var_name] = $data;
    92.         }
    93.     }
    94.  
    95.     /**
    96.      * Get stored data by key name. If data isn't global, it get's deleted after first access.
    97.      * Global variables never get deleted
    98.      *
    99.      * @param string $var_name
    100.      * @param bool $global
    101.      * @return mixed
    102.      */
    103.     public function get($var_name, $global = false)
    104.     {
    105.         if ($global && isset($this->_global[$var_name])) {
    106.             return $this->_global[$var_name];
    107.         } elseif (isset($this->_variables[$var_name])) {
    108.             $var = $this->_variables[$var_name];
    109.             unset($this->_variables[$var_name]);
    110.             return $var;
    111.         }
    112.         return null;
    113.     }
    114.  
    115.     /**
    116.      * Check if variable with such key exists
    117.      *
    118.      * @param string $var_name
    119.      * @param bool $global
    120.      * @return bool
    121.      */
    122.     public function is_set($var_name, $global = false)
    123.     {
    124.         return (!empty($this->{$global ? '_global' : '_variables'}[$var_name])) ? true : false;
    125.     }
    126.  
    127.     /**
    128.      * Clear global data vars
    129.      *
    130.      * @param mixed $var_names Deletes a var from parser globav variable poll. An array of names can be given to preform multiple deletes
    131.      */
    132.     public function deleteGlobal($var_names)
    133.     {
    134.         if (is_array($var_names)) {
    135.             foreach ($var_names as $v) {
    136.                 unset($this->_global[$v]);
    137.             }
    138.         } else {
    139.             unset($this->_global[$var_names]);
    140.         }
    141.     }
    142. }
    И соотвественно глобальные функции для упрощения доступа:
    PHP:
    1. <?php
    2. /* short parser functions */
    3. function get($name,$global=false)
    4. {
    5.     return Core::getInstance('parser',true)->get($name,$global);
    6. }
    7.  
    8. function is_set($name,$global=false)
    9. {
    10.     return Core::getInstance('parser',true)->is_set($name,$global);
    11. }
     
  7. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    нафиг-нафиг.

    В шаблоне берем и проверяем присутствие переменной.
     
  8. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Psih
    глядя на твой валидатор создается впечатление, что ошибки не все сразу выкатываются а по очереди
     
  9. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Simpliest
    Ну и представь себе код, который проверяет наличие переменной и подставляет её в шаблоне? Это же капец будет уже а не шаблон. И так приходится писать <?php echo get('...')?> вместо <?=get('...')?>, добавить сюда ещё кучу if-ов? Извращенец вы батенька, пожалейте верстальщика. Там где проверку сделать надо, там есть для этого is_set('...'). Просмотрите внимательно шаблоны.
     
  10. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    А это чтобы пользователю жизнь медом не казалась.
    Такое антиюзабилити решение.
     
  11. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Отлично себе представляю.

    Если у меня переменная может быть, а может и не быть - будет проверка.

    Если переменная должна быть всегда, то проверки не будет. Но в случае ее(переменной) отсутствия я схлопочу notice - и это правильно!
     
  12. Koc

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

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

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Simpliest
    В случае шаблона в форме если нету такой переменной, значит мы данные добавляем, а если есть - редактируем. Не превращать же шаблон в кашу из PHP и HTML. Notice тут совсем не причём.
     
  14. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Koc
    У меня просто всё проще и я не пытаюсь сделать из своей системы продвинутый фреймворк или CMF. Времени на это не дают, так что работаем с чем есть. Хотя на самом деле этого хватает и позволяет делать всё быстро.
     
  15. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Notice тут как раз причем.
    Из-за неявного приведения, которое в данном случае не нужно, ты плодишь потенциальные баги в своем коде.

    Если мне надо добавлять, то я это знаю еще "до" шаблона и в шаблон отдам пустую структуру. И никаких get('var') мне не будет нужно.
    Поскольку выводиться будет точно также.
     
  16. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Simpliest
    так на самом деле удобно. И всякие «что будет если» и потенциально возможные проблемы не возникают. Шаблонизатор должен вернуть отпарсенный шаблон, что он и делает. Остальное — это уже к cms-lite и прочим фантазёрам.
     
  17. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Очень меткое замечание. =)))
     
  18. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Аргумент.

    Хотя если такой блок один, то можно поставить одну проверку.
    Если их много для одного контроллера, то скорее всего надо выделить подшаблон или вообще создать для этого контроллера новый шаблон.
    Если много новых блоков для разных контроллеров, то опять же надо смотреть и комбинировать проверки, подшаблоны и т.д.

    Psih
    На данном этапе своего развития я бы наверное создал подкласс для такой формы (как писал выше).
    Или создал бы функцию типа echoIfIsSet.
     
  19. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    есть такой вариант, разбить страницу на контент зоны, запрос от пользователя идёт к опред контент зоне, передаёт ей параметры. контент зона, используя забитые параметры и дефолтные установки, дёргает нужные модули и плагины. те в свою очередь возвращают массивы данных. далее всё это передаётся в главный контроллер, который дёргает шаблонизатор и пихает данные по шаблонам, принадлежащим контент зоне или если таковых нет, то в дефолтные. и вывод.

    например, есть дефолтная контент зона main. включает зоны auth - авторизация; menu - меню; content - модуль из параметров от пользователя;
    юзверь заходит на главную, получает соответственно дефолтные значения модулей. вбивает например content=zlo получает в контенте модуль зла
    далее, идёт на /news/ попадает в контент зону news. а там разметка такая: auth - внизу, menu - там же; content - где-нибудь. шаблончики модулей пойдут ещё из контент зоны news, если их там нет, то дефолтные
    вбивает /news/?content[module]=news&content[act]=fullnews&content[id]=10 получает в контенте модуль news действие fullnews и id=10.
    и фишка, вбивает /news/?auth[act]=logout&content[module]=news&content[act]=fullnews&content[id]=10.

    и таким образом мы пришли к полному автоматизированию вывода шаблонов. а шаблонизатор по сути просто функция: аля взял массив -> отдал html

    отсюда получается вопрос, стоит ли эта функция обсуждения на 15 страниц?
     
  20. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    дадада, без всяких php-шных нотисов)
     
  21. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Всё это конечно хорошо, умно и типа правильно. Только вот я какраз делаю наоборот - чем проще, тем лучше. Я иногда сознательно не наворачиваю сложные вещи что бы люди после меня могли свободно разобратся что к чему. С моим кодом щас работает студент, который с PHP знаком относительно недавно. У него не возникает проблем с чтением и пониманием моего кода, с пониманием того, что я сделал и как сделал. Он за 10-15 минут разбирает даже внешне сложные вещи. Потому что сделано просто, без наворачивания кучи иерархий и классов. Только то, что надо для code reuse и абстракции определённых вещей. Вот сам засяду щас за изучение и работу с Yii, посмотрим как пойдёт.

    Нафиг мне класс для формы? У меня есть модуль, он умеет выводить список, добавлять и редактировать данные. Весь reusable функционал вынесен в хелперы.

    Если у меня идёт сравнение на true, false, 0 и тому подобные не явные вещи, то я делаю соответствующие аккуратные проверки. Они у меня в шаблонах есть, то что я привёл самые простые шаблоны не значит что я идиот и не помню про приведение типов и тому подобные вещи, специфичные для PHP. В 90% шаблонах все переменные всегда проставлены и они просто выводятся, т.е всякие списки, пейджеры и тому подобное. Могу привести более типичный пример из фронтэнда. Я ещё ни разу не натыкался на баг в шаблонах.

    Вот именно. У меня шаблонизатор умеет только три вещи - принять данные для шаблона, отпарсить шаблон и подставить данные во время парсинга. Всё, остальное всё уходит на уровень кода приложения в модули.

    З.Ы. Да, админка у меня немного отстаёт от фронтэнда, в фронтэнде там есть специальный статический класс Validator, который плюётся исключениями.
     
  22. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Psih
    да тут реализация максимум 600строк кода. а дальше только модули чиркай
    я тоже класс монстров не перевариваю если чо =)
     
  23. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Если это был расчет на то, что я пойду его смотреть... то ты ошибся - смотреть не пойду..

    Я не использую "шаблонизаторы", которые существуют ради самих себя.
    Если речь идет о представлении, то возлагать на него логику сокрытия собственных ляпов в других местах, как это сделано в примере Psih - это маразм.

    Это сродни
    Код (Text):
    1. define(true, false); // счастливой отладки .....
    Я не знаю кому так удобно

    Корень всего обсуждения в том, что люди не понимают что такое представление и чем оно должно заниматься.

    А теперь можно немного внимания?

    То, что у тебя не пришли данные в шаблон - это баг не шаблона. Но ты о нем узнаешь далеко не сразу, благодаря фееричности самого шаблона.
     
  24. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    то, что данные не пришли — это проблема обработчика данных, как, собственно, и решение как с непришедшими данными поступить.
    Псих не говорил? Там не мвц и говирить о классических представлениях говорить не уместно.
     
  25. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Это прикольно. Но я именно об этом и говорю. Проблема обработчика, но данные не пришли в шаблон.
    И в логах об этом пусто.... благодаря мега-шаблону и его логике.
    Чего у нас там с отладкой?