Перехватить вызов несуществующей переменной

shp

Новичок
А что тут показывать? Все просто:

PHP:
class Tpl {
  
  public function __get($varName) {
    static $cache;
    
    // Можно было просто объявить св-во объекта,
    // а не кэшировать данные в статической переменной
    
    if (!isset($cache[$varName]))  $cache[$varName] = ... ; // получаем значение переменной
    return $cache[$varName];
  }

}
Вывод данных в шаблоне:
PHP:
<?php echo $tpl->varName ?>
Само собой, шаблону должен быть доступен объект $tpl (экземпляр класса Tpl).
 

shp

Новичок
Некая функция-обертка. Можно для каждой переменной объявить свою ф-ию, либо по ф-ии для каждого шаблона (их в с-ме сравнительно немного), а внутри возвращать нужную переменную через обычный switch(). Пример второго варианта (на примере Друпала):
PHP:
function template_node_variables($var_name) {
  global $elem;
  
  if (!isset($node)) {
    $node = $elem['#node'];
    if ($node->build_mode == NODE_BUILD_PREVIEW)  unset($node->content['links']);
  }

  switch ($var_name) {
    case 'teaser':     return $elem['#teaser'];
    case 'date':       return format_date($node->created);
    case 'node_url':   return url('node/' . $node->nid);
    case 'title':      return check_plain($node->title);
    case 'terms':      return !empty($node->content['links']['terms']) ? drupal_render($node->content['links']['terms']) : '';
    
    ...... // и т.д. Переменных в каждом шаблоне тоже не очень много
  }

}
P.S. Само собой, все делалось по-быстрому, только для изучения нового подхода. В реальности именно из этой ф-ии, возможно, загружались бы какие-то данные. Но поскольку здесь переделывался только один шаблон, данные уже реально существовали в с-ме.
 

Alexandre

PHPПенсионер
Если не лень, все же прокомментируйте, чем именно не нравится Просто интересно мнение.
очень спорная и дискуссионная тема
мне не нравится идея - что шаблон начинает командовать - какие контроллеры должны быть подклдчены, получается, что шаблон диктует логику приложения. Схема получается сложной и навороченной, непонятной и вообще - раз такие пироги то как следствие трудно отлаживаемой. Просто я на практике сталкивался с подобной ЦМС, может быть в связи с тем, как там было все это реализованно - и по этому у меня возникло такое впечатление. У кого-то может получались более красивые реализации - но пока из того что встречал - я не в восторге.

-~{}~ 01.05.09 17:14:

if (!isset($cache[$varName])) $cache[$varName] = ... ; // получаем значение переменной
а не громоздкая ли будет эта схема???
 

С.

Продвинутый новичок
shp, а как ты будешь отрисовывать таблицу с данными из базы данных? Сколько обращений к базе?
 

shp

Новичок
Автор оригинала: Alexandre
Просто я на практике сталкивался с подобной ЦМС
А что за ЦМС, интересно?

Автор оригинала: Alexandre а не громоздкая ли будет эта схема???
Ну вообще-то эта конструкция вызывается только один раз (в классе-обертке), а не в шаблонах при выводе каждой переменной.

Автор оригинала: С.
shp, а как ты будешь отрисовывать таблицу с данными из базы данных? Сколько обращений к базе?
Намекаешь на то, что нужно сначала получить все данные одним запросом (т.е. возврат к классической схеме) :) ?

P.S. На самом деле, я понял, что эта альтернативная схема не всегда удобна. И выигрыш в производительности тоже не всегда заметен :)
 

AmdY

Пью пиво
Команда форума
для дополучения данных лучше воспользоваться методом, а не атрибутом, так будет нагляднее, т.к. понятно, что данные тянутся
$this->getUsersList()
и соответственно ловим в __call
 
Сверху