Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Класс "представления", для вывода HTML с переменными.
Форумы портала PHP.SU » » Если скрипт не работает » Класс "представления", для вывода HTML с переменными.

Страниц (1): [1]
 

1. dimas81 - 01 Марта, 2012 - 14:10:10 - перейти к сообщению
Здравствуйте, ув. форумчане! Прошу помощи у более сведущих коллег.
Проблема вот в чем, - решил изобрести свой "велосипед", класс, который подинклюживает нужный HTML шаблон, и подставляет в переменные, прописанные там, нужные значения.
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. class View
  5. {
  6.     private static            $file;
  7.     private $data         = array();
  8.     private $ArrayValues  = array();
  9.  
  10.     private function __construct()
  11.     {
  12.        register_shutdown_function(array(& $this, 'complete'));
  13.     }
  14.     public function complete()
  15.     {
  16.         $count = 0;
  17.         while(list($key, $val) = @each($this->ArrayValues[$count]))
  18.         {
  19.             $$key = $val;
  20.             $count++;
  21.         }
  22.                   ob_start();
  23.                    include_once($_SERVER['DOCUMENT_ROOT'].'/view/'.self::$file.'.php');
  24.          return ob_get_clean();
  25.     }
  26.     public static function factory($file)
  27.     {
  28.             self::$file = $file;
  29.         if(!file_exists($_SERVER['DOCUMENT_ROOT'].'/view/'.$file.'.php'))
  30.                 die('Файл вида, под названием: <b><i>'.$file.'.php</i></b> не найден!');
  31.         return new View();
  32.     }
  33.     public function bind($key, & $value)
  34.     {
  35.                   $this->data[$key] =  & $value;
  36.                   $this->ArrayComposer($this->data);
  37.                   unset($this->data);
  38.                   return $this;
  39.     }
  40.     private function ArrayComposer($data)
  41.     {
  42.         $this->ArrayValues[] = $data;
  43.     }
  44.     public function __toString()
  45.     {
  46.        return $this->complete();
  47.     }
  48.  
  49. }
  50.  


Пример работы данного класса такой:
PHP:
скопировать код в буфер обмена
  1.  
  2. $title = 'Мой сайт';
  3. $description = 'Описание сайта';
  4. $any = ''; // Допустим результат выборки из БД или еще что-нибудь
  5. $a = View::factory('index')
  6. ->bind('title',$title)
  7. ->bind('desc',$description)
  8. ->bind('any',$any);
  9.  
  10. echo $a;
  11.  
  12.  

В данном случае всё хорошо, и все отлично работает.
Но.. если захочу, что-бы в переменную $any, вошел результат работы другого экземпляра класса View, т.е подинклюдить шаблон в шаблон:
PHP:
скопировать код в буфер обмена
  1.  
  2. $title = 'Мой сайт';
  3. $description = 'Описание сайта';
  4. $any = View::factory('other');
  5. $a = View::factory('index')
  6. ->bind('title',$title)
  7. ->bind('desc',$description)
  8. ->bind('any',$any);
  9.  

Тут возникает проблема. Не смотря, что в переменной $any есть уже весь нужный "материал", будь то HTML, да что угодно... Эту переменную не видит тот класс, в который её собираются засунуть.
(!!!) Чертовщина какая-то.
Подтверждение тому, что всё нужное в ней есть:
file_put_contents('file.txt',$any);
$any = file_get_contents('file.txt');

В данном случае все работает, если эту $any предварительно всунуть в текстовый документ, потом вытянуть от туда и сохранить под тем же именем.
Возможно для опытных программистов, ошибка очевида, я же просидел битых часов 6. Ну не пойму что за загогулина. Ребят, помогите выяснить, пожалуйста..
Да, есть гораздо проще решения, когда в качестве аргументов, передается массив и генерируются нужные переменные с нужными подинклюженными файлами (и инклюд в инклюд тоже работает). Но тут я столкнуся с тем, что непонятно мне, поэтому прошу откликнуться тем, кто может разрешить данную проблему.
2. DelphinPRO - 01 Марта, 2012 - 15:13:54 - перейти к сообщению
вот это
PHP:
скопировать код в буфер обмена
  1. $count = 0;
  2. while(list($key, $val) = @each($this->ArrayValues[$count]))
  3.         {
  4.             $$key = $val;
  5.             $count++;
  6.         }


можно заменить на
PHP:
скопировать код в буфер обмена
3. dimas81 - 01 Марта, 2012 - 15:38:38 - перейти к сообщению
DelphinPRO пишет:
вот это
PHP:
скопировать код в буфер обмена
  1. $count = 0;
  2. while(list($key, $val) = @each($this->ArrayValues[$count]))
  3.         {
  4.             $$key = $val;
  5.             $count++;
  6.         }


можно заменить на

Да, спасибо, эта функция у меня вообще стерлась из памяти - возьму её на заметку. Код теперь на 5 строк короче Радость , но проблема, всё также стоит остро..
4. caballero - 01 Марта, 2012 - 15:59:31 - перейти к сообщению
а в чем проблема биндить непосредственно с массива?
5. dimas81 - 01 Марта, 2012 - 16:16:43 - перейти к сообщению
caballero пишет:
а в чем проблема биндить непосредственно с массива?

Собственно проблемы то и нет, с массива это проще, но ситуация такая, что хотел на скорую руку создать класс - 'просмотрщик', к-й выглядел бы подобным образом. А тут вырисовалась (ИМХО) интересная ситуация - когда один класс "отрыгивает" соседний, не желая с ним вступать ни в какие переговоры.
6. dimas81 - 01 Марта, 2012 - 20:30:25 - перейти к сообщению
Спасибо за внимание, тему можно закрыть. Все Very sexy! Класс работает замечательно.
Нужно было сделать всего лишь так:
PHP:
скопировать код в буфер обмена
  1. public function bind($key, & $value)
  2. {
  3.         $this->data[$key] =  & $value;
  4.         $this->ArrayComposer($this->data);
  5.         unset($this->data);
  6.         return (string)$this;
  7. }

 

Powered by ExBB FM 1.0 RC1