• Страница 1 из 1
  • 1
Модератор форума: Dimitro, LightInDarkness  
Форум » Web раздел » Web форум » [HELP] Разбить массив без цыкла (Хотя можно и с цыклом, если работать будет)
[HELP] Разбить массив без цыкла
AquestoS
Сержант
Привет всем! Осваиваю ООП, в частности, MVC-паттерн. Так вот, пишу класс представлений и хочу реализовать его таким образом:
Код
$template = new Template('wow'); // где `wow` - название шаблона (реализовано)
$template->set(array('название настройки' => 'значение')); // реализовано
$template->layout('main', array('header' => 'header_view')); // array('header' => 'header_view') подразумевает подключение `подшаблонов` в главный layout. Например, есть страничка (layout) и в ней имеется переменная $header (то бишь тот хеадер, что указан в массиве как элемент) и она подключает header_view!

Вот сам класс:
Код

<?php

/*
    |- Класс шаблонизатора                -|
    |- Иниц., методы, рендеры             -|
    |- @name Template                     -|
    |- @url http://doctrine.besaba.com    -|
    |- @author Vuishnak (S-Triangle)      -|
   */

class Template {
      /*
       * Переменная настроек
       * @success private
       */

      private $_config;

      /*
       * Переменная параметров
       * @access private
       */
      private $_vars = array();

      /*
       * Переменная рендеринга
       * @var bool
       */
      private $_render;

      /*
       * Имя шаблона
       * @var string
       */
      private $_template = '';

      /*
       * Имя лейаута
       * @var string
       */
      private $_layout = '';

      /*
       * Имя представления
       * @var string
       */
      private $_view = '';

      /*
       * Первый `автометод`
       * @param $template - первый аргумент (название шаблона)
       * @param $layout - второй аргумент (название лейаута, предпочтительно оставить по умолчанию)
       * @param $view - третий аргумент (имя представления)
       * @success public
       */

      public function __construct($template = '') {
          $this->_config = Config::Init();
          $this->_template = !empty($template) ? $template : $this->_config->get('default_template');
          $this->_layout = !empty($layout) ? $layout : $this->_config->get('default_layout');
      }

      /*
       * Метод добавления параметров в представление
       * @return array
       */

      public function set($var, $value = '') {
          if (is_array($var)) {
              $keys = array_keys($var);
              $values = array_values($var);
              $this->_vars = array_merge($this->_vars, array_combine($keys, $values));
          } else {
              $this->_vars[$var] = $value;
          }
      }

      public function __set($key, $value) {
          $this->_vars[$key] = $value;
      }

      public function layout($layout = '', $parts = array(), $params = array(), $render = TRUE) {
          if ($render === FALSE) {
              $this->_render = FALSE;
          }
          if ($this->_render === FALSE) {
              return FALSE;
          }
          $ext = $this->_config->get('view_ext');
          if (is_array($parts) && count($parts) >= 1) {
              foreach ($parts as $part => $view) {
                  $parts[$part] = $this->render($view, $params, TRUE);
              }
          }
          extract($parts, EXTR_OVERWRITE);
          $this->_layout = APPPATH . 'templates' . DIRSEP . strtolower($this->_template) . DIRSEP
                  . strtolower($this->_layout) . $ext;
          unset($ext, $render);
          include_once $this->_layout;
          $this->_render = FALSE;
      }

      public function render($view, $params = array(), $render = TRUE) {
          if ($render === FALSE) {
              $this->_render = FALSE;
          }
          if ($this->_render === FALSE) {
              return FALSE;
          }
          $ext = $this->_config->get('view_ext');
          $this->_view = APPPATH . 'templates' . DIRSEP . strtolower($this->_template) . DIRSEP
                  . strtolower($view) . $ext;
          $params = $this->_vars;
          extract($params, EXTR_OVERWRITE);
          unset($ext, $render);
          include $this->_view;
      }

}

При такой реализации, подшаблоны работают, но подгружаются на автомате, то есть даже не нужно в layout'е их вызывать. В этом и заключается проблема. Прошу помочь в ее решении, уже 2й день не могу придумать ничего...
Сообщение # 1 отредактировано AquestoS - Воскресенье, 26.05.2013, 12:21
Xamejiuoh
Центурион
1)
Код
public function __construct($template = '') {        
                 $this->_config = Config::Init();        
                 $this->_template = !empty($template) ? $template : $this->_config->get('default_template');        
                 $this->_layout = !empty($layout) ? $layout : $this->_config->get('default_layout');        
             }

$this->_layout = !empty($layout) ? $layout : $this->_config->get('default_layout'); - $layout там откуда?
т.е должно быть так (по докам видно)
Код
public function __construct($template = '', $layout = "", $view = "") {
             if(!isset($this->_config)){    
                 //try{
                     $this->_config = Config::Init();
                // } catch (Exception $e){
                //     echo 'Выброшено исключение: ',  $e->getMessage(), "\n";
                // }
             }
             $this->_template = !empty($template) ? $template : $this->_config->get('default_template');    
             $this->_layout = !empty($layout) ? $layout : $this->_config->get('default_layout');    
             $this->_view = !empty($view) ? $view : $this->_config->get('default_view');    
         }

2)зачем разбирать масcив а потом собирать?
Код
public function set($var, $value = '') {        
                 if (is_array($var)) {        
                     $keys = array_keys($var);        
                     $values = array_values($var);        
                     $this->_vars = array_merge($this->_vars, array_combine($keys, $values));        
                 } else {        
                     $this->_vars[$var] = $value;        
                 }        
             }

может лучше так?
Код
public function set($var, $value = "") {        
                 if (is_array($var)) {        
                     $this->_vars = array_merge($this->_vars, $var);        
                 } else {        
                     $this->_vars[$var] = $value;        
                 }        
             }

и зачем тебе ещё магический вариант __set оставь один какой-то который тебе удобней.
В магическом случае вместо $template->set(array('название настройки' => 'значение')); будет $template->name_settings = 'значение';//где name_settings ключ(название настройки)
3)
Код

        if ($render === FALSE) {        
                     $this->_render = FALSE;        
                 }        
                 if ($this->_render === FALSE) {        
                     return FALSE;        
                 }

O_o
4)Чтоб дальше что-то писать нужно видеть остальную часть приложения куда передаётся как выводится и т.д
Возможно это тебе чем-то поможет - http://pastebin.com/

А вообще если это ты писал сам([хотя видно что выдернуто откуда-то)...то ты не понимаешь что пишешь...куча атрибутов которые даже не используются,никаких проверок....короче гумнокод...
Сообщение # 2 отредактировано Xamejiuoh - Воскресенье, 26.05.2013, 22:55
AquestoS
Сержант
Xamejiuoh, спасибо. _set для удобства. 3) проверка, дабы не вызвать лейаут несколько раз. На счет set'а - да, так лучше, спасибо! И все же, в конце-концов, я не совсем это имел ввиду. Подшаблоны все ровно подгружаются автоматом sad
Сообщение # 3 написано 27.05.2013 в 20:32
Xamejiuoh
Центурион
Цитата (AquestoS)
3) проверка, дабы не вызвать лейаут несколько раз

тогда может
Код
if ($render === FALSE) {
$this->_render = FALSE;
return FALSE;
}
if ($this->_render === FALSE) {
return FALSE;
}

Сильно картину не изменит,но зачем делать лишнюю проверку
Сообщение # 4 отредактировано Xamejiuoh - Понедельник, 27.05.2013, 21:44
CraZyRock
Центурион
Панки живут вечно!
Сообщение # 5 написано 28.05.2013 в 15:00
Xamejiuoh
Центурион
CraZyRock, Причем тут фреймворк(у тебя неправильное понимание что такое фреймворк)?? он разбирается с ООП и MVC ...а смысл есть...то что в этом не видишь его ты, мы не виноваты...
Сообщение # 6 отредактировано Xamejiuoh - Вторник, 28.05.2013, 16:33
AquestoS
Сержант
Xamejiuoh, да, заметил. Спасибо. Попробовал твой вариант, вообще не передаются данные sad (ни данные, ни подшаблоны)
CraZyRock, каждому свое.

Добавлено (28.05.2013, 17:49)
---------------------------------------------
По шаманил, все получилось. Теперь код выглядит так: Template Class

Добавлено (28.05.2013, 17:58)
---------------------------------------------
Использовал не ob_get_clean(), а ob_get_flush(). Когда прочитал об этих функциях, то стало ясно, что первая не дает вывода из буфера.
Сообщение # 7 отредактировано AquestoS - Вторник, 28.05.2013, 18:16
Xamejiuoh
Центурион
AquestoS, я тебе давал вариант на "абу" я же не знаю как твоё приложение дальше ведёт себя, главное что ты мысль уловил в каком направлении копать и сделал. up
Тебе надо больше проверок сделать и познакомся с исключениями.
Например проверять существует ли файл по генерируему пути ,такому как APPPATH . 'templates' . DIRSEP . strtolower($this->_template) . DIRSEP . strtolower($this->_layout) . $ext
если нет выдавать исключение, если есть то только тогда уже инклюдить файл
Сообщение # 8 отредактировано Xamejiuoh - Вторник, 28.05.2013, 18:59
AquestoS
Сержант
Ага. Я понял, буду совершенствоваться! Спасибо!
Сообщение # 9 написано 28.05.2013 в 22:46
Форум » Web раздел » Web форум » [HELP] Разбить массив без цыкла (Хотя можно и с цыклом, если работать будет)
  • Страница 1 из 1
  • 1
Поиск: