За последние 24 часа нас посетили 54380 программистов и 1777 роботов. Сейчас ищут 1033 программиста ...

Проблемы с вьюхой в MVC

Тема в разделе "PHP для новичков", создана пользователем pircul, 19 янв 2014.

  1. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    Здравствуйте. Практикуюсь, пишу свою MVC и у меня появилась проблема в передаче переменных из контроллера во вьюху.
    Есть такой код:
    Код (Text):
    1.  
    2. class TestController{
    3.  
    4. public $property = 'Это выводится во вьюхе нормально';
    5.  
    6. public function testAction(){
    7.     $var = 'Это значение мне нужно передать во вьюху';
    8.     $this->render('test.php'); 
    9.        }
    10. }
    Как Вы догадались это обычный action некого контроллера, в котором рендерится вьюха. Проблема в том, что если в о вьюхе написать echo $var; то это не сработает и интерпретатор выдаст ошибку уровня Notice(Undefined variable). А вот если к примеру вместо $var писать $this->property, тоесть обратиться из вьюхи к свойству текущего контроллера, тогда это сработает.

    Пример вьюхи
    Код (Text):
    1.  
    2. <h1>Вьюха для Test Controller</h1>
    3. echo $var;//undefined variable
    4. echo $this->property;//Все в порядке, значение выводится во вьюху
    Собственно вопрос, почему так происходит? Ведь переменные по сути это хранилище для каких либо значений, фактически я обращаюсь к определенным значениям из одинаковой области видимости, но переменная определенная в методе почему то не отрабатывает во вьюхе, а свойство класса в отличии от этой переменной считается определенным.

    Хотелось бы как то исправить этот момент, не хочу создавать лишние свойства в контроллере, передавая им значения из методов, которые потом придется вызывать через $this во вьюхе.

    ЗЫ: Переменная определена(ничего не путаю). Спасибо
     
  2. zelenin

    zelenin Активный пользователь

    С нами с:
    5 дек 2012
    Сообщения:
    35
    Симпатии:
    0
    чего свое пишете? MVC?

    в yii например работает так:
    Код (Text):
    1.  
    2. $params = [ 'var' => 'Это значение мне нужно передать во вьюху' ];
    3. $this->render('test.php', $params);
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Так интересно, $var - локальная переменная, с чего она будет куда-то в другую функцию передаваться? Надо передать. Либо так, как zelinin показал, либо вот так можно:
    Код (PHP):
    1. class Template {
    2.     protected $data;
    3.  
    4.     public function assign($name, $value) {
    5.         $this->data[$name] = $value;
    6.     }
    7.  
    8.     public function render($filename) {
    9.         if ($this->data)
    10.             extract($this->data);
    11.         ob_start();
    12.         require_once(TEMPLATE_DIR . "/$filename");
    13.         $content = ob_get_contents();
    14.         ob_end_clean();
    15.         return $content;
    16.     }
    17. }
    Затем использование:
    Код (PHP):
    1. $templ = new Template;
    2.  
    3. $templ->assign("var", "Это значение передаём по вьюху");
    4. $templ->assign("test", "Ещё одно значение передаём куда надо");
    5.  
    6. echo $templ->render("test.php");
    Примерно такой подход в Open Cart используется.
     
  4. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    Спасибо большое Вам обоим! У каждого стащил по чутьчуть :) Все получилось