Задать вопрос
@lod2007
Программист

MVC. Как преобразовать (вынести) View из контроллера в модель?

Добрый день. В PHP я новичек. Сейчас осваиваю MVC.
Классический контролер:
//Controler.php
$Cat= new Category(); //создаем объект класса
$Cat->id=$id;
$Cat->GetData();
include('Category_view.php');//показываем данные

Соответственно, вид представляет собой:
//Category_view.php
echo "<div>".$Cat->MyString."</div>"

Мне необходимо заменить в контролере строчку:
include('Category_view.php');
на что-то типа:
$Cat->Display(); //показываем данные
Чтобы экземпляр класса сам показывал данные, т.е. модель в этом случае будет примерно такой:
//Category_Model.php
Class Category() {
//Методы
pablic function Display(){
  include('Category_view.php'); 
  }} //Class Category

Проблема в том, что не могу понять, как передать параметры модели во view. Сейчас пробую делать через переменную в классе, но это не выход, если свойств много - это куча переменных:
//Category_Model.php
Class Category() {
pablic function Display(){
 $br=$this-> MyString; // Код выполняется, Вид отображается, но это НЕПРАВИЛЬНО!!!
 include('Category_view.php'); 
  }
} //Class Category
//соответственно:
//Category_view.php
echo "<div>". $br."</div>"
Потому что, вот так не получается:
//Category_view.php
echo "<div>".$this->MyString."</div>"
Проблема получается в "видимости" свойств класса модели. Как я думаю, Вид не понимает, что-такое "$this->", и как ему отправить туда данные - вопрос. Смотрел в примерах, что делают отдельный класс View, который выводит данные, но их же туда надо как то отправлять из объекта другого класса?
  • Вопрос задан
  • 666 просмотров
Подписаться 2 Оценить 1 комментарий
Решения вопроса 1
@lod2007 Автор вопроса
Программист
Не знаю, с чем было связано, может комп глючил. Но сейчас все работает так, как и должно было работать с самого начала:
//Controler.php
$Cat= new Category(); //создаем объект класса
$Cat->id=$id;
$Cat->GetData();
$Cat->Display(); // объект сам знает как себя отображать

//Category_Model.php
Class Category() {
...
public function Display(){
  include('Category_view.php'); 
  }} //Class Category
//Category_view.php
<div>$this->MyString</div>

Для чего это нужно!? Вот для чего. Отправляем на сервер AJAX команду вида: класс1/метод1/праметры/класс2/метод2/метод3. Т.е. Некоторый объект класса 1 должен выполнить методы: 1 (а может 2 и 3) с параметрами, а так же класс 2 должен выполнить методы 2,3 (а может и метод 1 если он у него есть) так же с праметрами.

В Роутере строка разбирается на слова и запускается механизм:
foreach ($_POST as $Val) {
    if (class_exists($Val)) { //проверяем, есть ли такой класс
    $MyClass=$Val; //запоминаем имя кассса
    $MyObj= new $Val();//создаем объект
   }
  
  if (!empty($MyObj)) { //если создали экземпляр класса, присваиваем ему свойства
   foreach ($_POST as $prop => $obj) {
     if (property_exists($MyClass,$obj)){ //проверяем есть ли у класса свойство, если есть присваиваем его значение
      $MyObj->$prop=$obj;
      }
    }
  }

 foreach ($_POST as $Met) {//  отдельно выполняем методы, после заполнения параметров
  if (!empty($MyObj)) { //если создали экземпляр класса
      if (method_exists($MyClass,$Met)){ //проверяем есть ли у класса метод, если есть, то выполняем его
      $MyObj->$Met(); //выполняем метод
      }  
    } 
  }

Все это избавляет нас в контролере от писанины вида:
if ($Conntrol=="LoadCentrChild") {
      if ($Action=="сlick") {
              $Cat = new Catalog ();
              $Cat->idLeft=$params["id"];//отправляем на вход id, по которому кликнули
              $Cat->LoadLeftParent();//загружаем левую панель
              $Cat->Display();/
   }
}
if ($Conntrol=="NewCategory") {
   if ($Action=="Create") {
       $Category = new Category();
       $Category->NameCat=$params["NameCat"];
       $Category->Create();
       $Category->Display();
   }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@kedavra
code berserker
class Controller 
{
 private $view;
 public function __construct() {
  $this->view=new View();
  }
 ...
 $this->view->display('template.html');  //использование
}
class View 
{
  public function display($template); {
      include($template);
  }
}

Соответственно от базового контроллера наследуются все остальные и через конструктор получают объект view с нужным методом
Ответ написан
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
Так кто вы, новичЕк или новичОк? А методы pAblic или pUblic?
"Как преобразовать (вынести) View из контроллера в модель?" - это как сделать из неправильного ещё более неправильное. Вьюхи должен вызывать контроллер, а не модель, и данные из моделей в них должен передавать контроллер. А вообще, посмотрите как делают нормальные люди, например, во фреймворках - вот CI делает так: https://github.com/bcit-ci/CodeIgniter/blob/develo...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы