include через метод

niko42

Новичок
Здравствуйте.

Класс представления данных:
PHP:
class View {

    static $instance;

    static function instance(){
        if(!isset($instance)){
            return new View();
        }
        return self::$instance;
    }

    function generate($content_view = null, $template_view = null)
    {
        if($template_view == null)
            $template_view = "template_view.php";

        include 'application/view/'.$template_view;
    }

    static function set($view){

        $dirs = array('application/view/', 'application/tpl/');

        foreach($dirs as $dir){
            if(file_exists($dir.$view)){
                include $dir.$view;
            }
        }

    }

    static function start(){
        ob_start();
    }
    static function end(){
        echo ob_get_clean();
    }

}
Есть основной шаблон template
PHP:
<html>
<head></head>
<body>
    <? View::set($content_view); ?>
</body>
</html>
Подключаем доп. шаблон
PHP:
$product = new Product();
$product = $s->getProduct();

View::start();
View::set("test.php");
View::set("test2.php");
View::end();
Теперь хочу обратиться к перменной $product в test.php и вывести на экран информацию
PHP:
<h1>
echo $product
</h1>
Уточните, пожалуйста, почему test.php не видет переменную $product
 

niko42

Новичок
P.S. изобретаю велосипед!!! Тренерусь над архитектурой построяния+
Более подробное описание проблемы можно посмотреть тут: http://www.cyberforum.ru/php-oop/thread443913.html не реклама
 
Последнее редактирование:

riff

Новичок
Ты вызываешь функцию View::set, она подключает файл. Подключаемый файл видит переменные объявленные в View::set. В View:set у тебя нет переменной $product.

Что можно было бы предложить для твоего велосипеда, это:
PHP:
static function set($view, $params){
    //...
    include ...
}

//...
View::set('test.php', array('product'=>$product));
HTML:
<h1><?=$params['product'] ?></h1>
 
Последнее редактирование:

niko42

Новичок
Ты вызываешь функцию View::set, она подключает файл. Подключаемый файл видит переменные объявленные в View::set. В View:set у тебя нет переменной $product.
да это мы знаем, для пояснения вот:

PHP:
function load($file){
        include 'application/view/'.$file.'.php';
    }
в файле test1.php содержится
PHP:
$product = new Product();
$product = $s->getProduct();
а в файле test2.php содержится красота вывода
Код:
<h1>
    <?=$product;?>
</h1>
есть некий компановщик, который складывает все test файлы
PHP:
load(test1);
load(test2);
Не понятно, как можно сделать так, что бы перменные были видны
 

AmdY

Пью пиво
Команда форума
Чтобы переменные были видны, их нужно передать в метод, затем распаковать
PHP:
function load($file, array $vars){
      extract($vars);
        include 'application/view/'.$file.'.php';
    }
 

niko42

Новичок
Чтобы переменные были видны, их нужно передать в метод, затем распаковать
PHP:
function load($file, array $vars){
      extract($vars);
        include 'application/view/'.$file.'.php';
    }
Спасибо! Можно применить данный способ, но как-то привязанно это всё...

Хочется больше абстракции
 

fixxxer

К.О.
Партнер клуба
Спасибо! Можно применить данный способ, но как-то привязанно это всё...

Хочется больше абстракции
1. Выбросить статики

2. В контроллере как-то так:

PHP:
$product = new Product(); // это должно быть в контроллере, в шаблоне этому нечего делать совершенно
$view = new View("/path/to/templates");
$view->assign('product', $product);
$view->render('template.tpl');
3. view
PHP:
class View {
    protected $tpl_path;
    protected $vars;

    public function __construct($tpl_path) {
        $this->tpl_path = $tpl_path;
    }

    public function assign($var, $value) {
        $this->vars[$var] = $value;
    }

    public function render($template_file) {
        extract($this->vars);
        include $this->tpl_path . '/' . $template_file;
    }

}
4. в шаблоне теперь просто пишешь $this->render вместо include
 
  • Like
Реакции: AmdY

fixxxer

К.О.
Партнер клуба
а как наиграешься - выброси это все нафиг и возьми twig
 
Сверху