За последние 24 часа нас посетили 54412 программистов и 1768 роботов. Сейчас ищут 1102 программиста ...

Вывод через Smarty (ООП)

Тема в разделе "Прочие вопросы по PHP", создана пользователем middle123, 29 июн 2015.

  1. middle123

    middle123 Новичок

    С нами с:
    29 июн 2015
    Сообщения:
    8
    Симпатии:
    0
    Индексный файл:
    Код (PHP):
    1. require_once ROOT.'/core/db.class.php';
    2. require_once ROOT.'/lib/Smarty.class.php';
    3.     $mysqli = db::getObject(); //  соединение с БД
    4.     $smarty = new Smarty();
    5.     $option = "index";
    6. if(isset($_GET['option'])) {
    7.             $tmp_name = $_GET['option'];
    8.             $opt = $_GET['option'];
    9.             
    10. $path = ROOT.'/core/'.$opt.".class.php";
    11. if(file_exists($path)) {
    12. require_once $path;
    13. if(class_exists($opt)) {
    14. $option = $_GET['option'];
    15. }
    16.             } else {
    17.                 echo "Ошибка подключения файла класса";   
    18.             }
    19.         } else {
    20.             $tmp_name = "main";
    21.             require_once ROOT."/core/".$option.".class.php";
    22.         }
    23.     $view = new $option();
    24.  
    25.     $smarty->assign("tmp_name", $tmp_name);
    26.     $view->getContent();
    27.     $smarty->display("index.tpl");
    28.  
    Класс:
    Код (PHP):
    1. class Index {
    2.     public function getContent() {
    3.         global $mysqli;
    4.         $smarty = new Smarty();
    5.         $res = $mysqli->query("SELECT * FROM pages ORDER BY id DESC");
    6.         
    7.         
    8.         if ($res->num_rows > 0) {
    9.             for ($i=0; $i<$res->num_rows; $i++) {
    10.                 $row[] = $mysqli->assoc($res);
    11.             }
    12.             $smarty->assign("row", $row);
    13.         }
    14.     }
    15. }
    16.  
    Основной шаблон - index.tpl, в нем подключен шаблон main.tpl таким образом: {include file="$tmp_name.tpl"}.
    Массив формирует правильно, а вот выводит его не в месте где подключен шаблон main.tpl, а перед <html> тегом в самом начале страницы (и то только если в классе Index снизу добавить строку $smarty->display("main.tpl")).
    Получается что данные класса не доходят до индексного файла.
    P.S> Тот же код без класса (просто функция) все выводит нормально.
    Подскажите как можно решить проблему?

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Так вы в два разных объекта smarty пишете данный, один про другой ничего не знает. Класс - в один объект smarty, а index.php - в другой. Сделай или глобальный (правда, заклюют), или передавай в конструктор или метод getContent(). А вообще, здесь бы иерархию небольшую забабахать... Поскольку создание объекта smarty - тоже дело контроллера, по идее.
     
  3. middle123

    middle123 Новичок

    С нами с:
    29 июн 2015
    Сообщения:
    8
    Симпатии:
    0
    хм, просто в класс Index добавил строку global $smarty; и все заработало. А что конкретно означает "заклюют"?

    А если передавать в конструктор, нужно для него (и всего что связано с контроллерами) создать отдельный класс, который будут наследовать все остальные подобные модули, так? Просто с ООП и Smarty знаком всего день-два, после процедурного все это кажется "джунглями".
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Так теорию бы почитали. Заклюют, потому что ООП и global считается не хорошо совмещать. Если просто добавили global, то не всё заработало, поскольку вы ссылку на один объект затираете ссылкой на другой