Здравствуйте, ув. форумчане! Прошу помощи у более сведущих коллег.
Проблема вот в чем, - решил изобрести свой "велосипед", класс, который подинклюживает нужный HTML шаблон, и подставляет в переменные, прописанные там, нужные значения.
PHP:
скопировать код в буфер обмена
<?PHP
class View
{
private static $file;
private $ArrayValues = array();
private function __construct()
{
}
public function complete()
{
$count = 0;
while(list($key, $val) = @each($this->ArrayValues[$count])) {
$$key = $val;
$count++;
}
include_once($_SERVER['DOCUMENT_ROOT'].'/view/'.self::$file.'.php');
}
public static function factory($file)
{
self::$file = $file;
if(!file_exists($_SERVER['DOCUMENT_ROOT'].'/view/'.$file.'.php')) die('Файл вида, под названием: <b><i>'.$file.'.php</i></b> не найден!'); return new View();
}
public function bind($key, & $value)
{
$this->data[$key] = & $value;
$this->ArrayComposer($this->data);
return $this;
}
private function ArrayComposer($data)
{
$this->ArrayValues[] = $data;
}
public function __toString()
{
return $this->complete();
}
}
Пример работы данного класса такой:
PHP:
скопировать код в буфер обмена
$title = 'Мой сайт';
$description = 'Описание сайта';
$any = ''; // Допустим результат выборки из БД или еще что-нибудь
$a = View::factory('index')
->bind('title',$title)
->bind('desc',$description)
->bind('any',$any);
echo $a;
В данном случае всё хорошо, и все отлично работает.
Но.. если захочу, что-бы в переменную $any, вошел результат работы другого экземпляра класса View, т.е подинклюдить шаблон в шаблон:
PHP:
скопировать код в буфер обмена
$title = 'Мой сайт';
$description = 'Описание сайта';
$any = View::factory('other');
$a = View::factory('index')
->bind('title',$title)
->bind('desc',$description)
->bind('any',$any);
Тут возникает проблема. Не смотря, что в переменной $any есть уже весь нужный "материал", будь то HTML, да что угодно... Эту переменную не видит тот класс, в который её собираются засунуть.
(!!!) Чертовщина какая-то.
Подтверждение тому, что всё нужное в ней есть:
file_put_contents('file.txt',$any);
$any = file_get_contents('file.txt');
В данном случае все работает, если эту $any предварительно всунуть в текстовый документ, потом вытянуть от туда и сохранить под тем же именем.
Возможно для опытных программистов, ошибка очевида, я же просидел битых часов 6. Ну не пойму что за загогулина. Ребят, помогите выяснить, пожалуйста..
Да, есть гораздо проще решения, когда в качестве аргументов, передается массив и генерируются нужные переменные с нужными подинклюженными файлами (и инклюд в инклюд тоже работает). Но тут я столкнуся с тем, что непонятно мне, поэтому прошу откликнуться тем, кто может разрешить данную проблему.
caballero пишет:а в чем проблема биндить непосредственно с массива?
Собственно проблемы то и нет, с массива это проще, но ситуация такая, что хотел на скорую руку создать класс - 'просмотрщик', к-й выглядел бы подобным образом. А тут вырисовалась (ИМХО) интересная ситуация - когда один класс "отрыгивает" соседний, не желая с ним вступать ни в какие переговоры.