|
|
Модератор форума: Dimitro, LightInDarkness |
Форум Web раздел Web форум [HELP] Разбить массив без цыкла (Хотя можно и с цыклом, если работать будет) |
[HELP] Разбить массив без цыкла |
Привет всем! Осваиваю ООП, в частности, 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)
Код 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/ А вообще если это ты писал сам([хотя видно что выдернуто откуда-то)...то ты не понимаешь что пишешь...куча атрибутов которые даже не используются,никаких проверок....короче гумнокод... |
Xamejiuoh, спасибо. _set для удобства. 3) проверка, дабы не вызвать лейаут несколько раз. На счет set'а - да, так лучше, спасибо! И все же, в конце-концов, я не совсем это имел ввиду. Подшаблоны все ровно подгружаются автоматом
Сообщение # 3 написано 27.05.2013 в 20:32
|
Xamejiuoh, да, заметил. Спасибо. Попробовал твой вариант, вообще не передаются данные (ни данные, ни подшаблоны)
CraZyRock, каждому свое. Добавлено (28.05.2013, 17:49) --------------------------------------------- По шаманил, все получилось. Теперь код выглядит так: Template Class Добавлено (28.05.2013, 17:58) --------------------------------------------- Использовал не ob_get_clean(), а ob_get_flush(). Когда прочитал об этих функциях, то стало ясно, что первая не дает вывода из буфера. |
AquestoS, я тебе давал вариант на "абу" я же не знаю как твоё приложение дальше ведёт себя, главное что ты мысль уловил в каком направлении копать и сделал.
Тебе надо больше проверок сделать и познакомся с исключениями. Например проверять существует ли файл по генерируему пути ,такому как APPPATH . 'templates' . DIRSEP . strtolower($this->_template) . DIRSEP . strtolower($this->_layout) . $ext если нет выдавать исключение, если есть то только тогда уже инклюдить файл |
Ага. Я понял, буду совершенствоваться! Спасибо!
Сообщение # 9 написано 28.05.2013 в 22:46
|
| |||
| |||