powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Ламерский вопрос про MVC.
8 сообщений из 8, страница 1 из 1
Ламерский вопрос про MVC.
    #38749448
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет :) Захотелось немного углубиться в ооп, решил ради саморазвития сделать свою модель mvc, но возникли вопросы.
В общем при заходе на сайт выполняется:

1. Контроллер страницы, к которой обращаемся:
Код: php
1.
2.
3.
4.
5.
6.
7.
class ControllerMainMain extends Controller {

    public function action() {
        $this->view->generateView($this->modul_name . "/" . $this->page_name, $this->model->getData());
    }

}



2. Базовый контроллер:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
abstract class Controller {

    protected $model,
                  $view,
                  $modul_name,
                  $page_name;
    private $modelClassName;

    function __construct($modul_name, $page_name) {
        $this->modul_name = $modul_name;
        $this->page_name = $page_name;

        $this->modelClassName = "Model" . $this->modul_name . $this->page_name;
        $this->model = new $this->modelClassName;

        $this->view = new View();
    }

    abstract function action();
}



3. Модель страницы, к которой обращаемся:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
class ModelMainMain extends Model {

    public function getData() {
        return $array = array(
            "page" => "main"
        );
    }
}



4. Базовая модель:
Код: php
1.
2.
3.
abstract class Model {
    abstract function getData();
}



5. Класс View
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class View {

    function generateView($tpl, $data = null) {
        if (is_array($data)) {
            extract($data);
        }
        include "./app/view/theme/default/tpl/" . $tpl . ".tpl";
    }

}



Вопрос в следующем: сейчас view грузит одну "заготовку" - include "./app/view/theme/default/tpl/" . $tpl . ".tpl"; , а мне хотелось бы разбить эту заготовку на части: header, contentTop, contentLeft, contentRight и footer. Соответственно у каждой этой части должны быть контроллер и модель.
Так вот проблема в том и состоит, что не могу додуматься, как по-очереди вызывать контроллер каждой части, а потом и "собирать" в нужном порядке ?
Очень надеюсь на ваши подсказки! Заранее благодарю!
...
Рейтинг: 0 / 0
Ламерский вопрос про MVC.
    #38749525
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunПривет :) Захотелось немного углубиться в ооп, решил ради саморазвития сделать свою модель mvc, но возникли вопросы.
В общем при заходе на сайт выполняется:

1. Контроллер страницы, к которой обращаемся:
Код: php
1.
2.
3.
4.
5.
6.
7.
class ControllerMainMain extends Controller {

    public function action() {
        $this->view->generateView($this->modul_name . "/" . $this->page_name, $this->model->getData());
    }

}



2. Базовый контроллер:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
abstract class Controller {

    protected $model,
                  $view,
                  $modul_name,
                  $page_name;
    private $modelClassName;

    function __construct($modul_name, $page_name) {
        $this->modul_name = $modul_name;
        $this->page_name = $page_name;

        $this->modelClassName = "Model" . $this->modul_name . $this->page_name;
        $this->model = new $this->modelClassName;

        $this->view = new View();
    }

    abstract function action();
}



3. Модель страницы, к которой обращаемся:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
class ModelMainMain extends Model {

    public function getData() {
        return $array = array(
            "page" => "main"
        );
    }
}



4. Базовая модель:
Код: php
1.
2.
3.
abstract class Model {
    abstract function getData();
}



5. Класс View
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class View {

    function generateView($tpl, $data = null) {
        if (is_array($data)) {
            extract($data);
        }
        include "./app/view/theme/default/tpl/" . $tpl . ".tpl";
    }

}



Вопрос в следующем: сейчас view грузит одну "заготовку" - include "./app/view/theme/default/tpl/" . $tpl . ".tpl"; , а мне хотелось бы разбить эту заготовку на части: header, contentTop, contentLeft, contentRight и footer. Соответственно у каждой этой части должны быть контроллер и модель.
Так вот проблема в том и состоит, что не могу додуматься, как по-очереди вызывать контроллер каждой части, а потом и "собирать" в нужном порядке ?
Очень надеюсь на ваши подсказки! Заранее благодарю!


варианты
(это не варианты решения, а просто два подхода обусловленные ситуацией)

1)разбиваем вьюху на части, ибо часть используеться в нескольких местах (например левая панель)

тогда файл вюьхи получает переменные(скажем $text $array_data_for_left_panel)
и в самой вьюхе вырезаем верстку левой панели, заменяя её на подключение вюьхи с передачей этого масива с даными для левой панели)

2)виджеты так званые, когда для такого кусочка(пример див с числом юзеров на сайте, или логин окошко, где логин форма для гостя, или ссылки на профайл и выход для залогиненого)

тут просто вызываеться контроллер этого кусочка, как и контролер целой страницы, и
берёться его ответ ввиде уже готового куска верстки.

чтобы небыло вывода, а именно схватить эту верстку в переменную, для этого использовать буферизацию ob_start() $login_div = ob_get_clean();

а лучше сделать себе клас - назвав его например виджет

чтобы подключить див логин во вьюхе по типу
<?Widget::factory('controller_login','action_get_login_widget',$some_param);?>
а виджет клас это и сделает, включит буферизацию, запустит контроллер, словит буфер и вернёт его вкачестве результата)

ЗЫ
потом сможешь и кеширование виджетов добавить легко.
...
Рейтинг: 0 / 0
Ламерский вопрос про MVC.
    #38751359
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответ :)
Немного изменил контроллер, вид и сделал доп. шаблон, который и формирует страницу в целом, получилось так:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class ControllerMainMain extends Controller {

    public function action() {
        $this->view->blocks = array(
            "Header",
            "Footer"
        );
        $this->view->generateBlocks();

        $this->view->generateView("content", $this->modul_name . "/" . $this->page_name, $this->model->getData());
        $this->view->showView();



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
<?php

class View {

    public $blocks = array();
    private $registry;

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

    function generateBlocks() {
        if (count($this->blocks) > 0) {
            foreach ($this->blocks as $key => $value) {
                require_once "./app/controller/common/" . strtolower($value) . ".php";
                require_once "./app/model/common/" . strtolower($value) . ".php";
                $className = "ControllerCommon" . $value;
                $blockController = new $className($this->registry, "Common", $value);
                $blockController->action();
            }
        }
    }

    function generateView($var_page, $tpl, $data = null) {
        if (is_array($data)) {
            extract($data);
        }

        ob_start();
        include "./app/view/theme/default/tpl/" . $tpl . ".tpl";
        $this->registry->set($var_page, ob_get_clean());
    }

    function showView() {
        $header = $this->registry->getValue("header");
        $content = $this->registry->getValue("content");
        $footer = $this->registry->getValue("footer");
        include "./app/view/theme/default/tpl/common/home.tpl";
    }

}



home.tpl
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?php

    echo $header;

?>

<div id="content"><?php echo $content; ?></div>

<?php

    echo $footer;



Как-то так в общем. Сильно страшно ?:)

И еще. Подскажите пожалуйста ide с поддержкой ООП, ибо пользую сейчас NetBeans - вообще не нравится: например в конструкции $this->registry->getValue("footer"); функция getValue уже не вылазит в выпадающем меню.
...
Рейтинг: 0 / 0
Ламерский вопрос про MVC.
    #38751446
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshun,

почти любая нормальная ide поймёт, если юзать PHPDoc...

А вот насчёт самого mvc, если тут позволено критиковать то:
1. generateView - излишество... достаточно для showView добавить аргумент $return = false и при установке в true возвращать контент, а при установке в false - выводить.

2. getData в модели - неправильно (как я думаю). Дело в том, что у модели в теории будет уйма методов, которые производят разные манипуляции по отдаче данных контроллеру (получить документ с стороннего сервера, получить логин на вход и отдать данные пользователя на выход, убрать все теги для упрощённого вывода данных etc.). А вот вызывать эти методы должен контроллер, который вызовет 2-3 метода модели и сформирует массив значений для представления... А в представлении они подставятся (ну с этим всё ок).
Потому в чистом виде модели не обязаны иметь некие общие одноимённые методы (и для каждой модели эти методы будут разные и работать будут по-разному). А вот когда модели научатся работать с базой, с внешними источниками данных, разрастутся методами для упрощения работы (например валидациями, отдачей определённого списка атрибутов и т.д.), только тогда они будут иметь одинаковые методы :)

А то сейчас получается, что у тебя модель умеет просто отдавать некий список своих внутренних полей и всё :) При чём она обязана это уметь (хотя реально модель может быть рассчитана строго на запись данных)
...
Рейтинг: 0 / 0
Ламерский вопрос про MVC.
    #38751462
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр, спасибо за комментарии!

Програмёрпочти любая нормальная ide поймёт, если юзать PHPDoc...
Очень нравится IDEA, но так и не смог подружить ее с php :(
Если подскажете Вы или кто-то другой, как это сделать, буду просто безмерно благодарен!
...
Рейтинг: 0 / 0
Ламерский вопрос про MVC.
    #38751561
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunПрограмёр, спасибо за комментарии!

Програмёрпочти любая нормальная ide поймёт, если юзать PHPDoc...
Очень нравится IDEA, но так и не смог подружить ее с php :(
Если подскажете Вы или кто-то другой, как это сделать, буду просто безмерно благодарен!

Никогда не пробовал (не подскажу) :) Вообще сам сидел на eclipse и netBeans... обе очень неплохие. Хотя некоторые недостатки как и всегда присутствуют.
...
Рейтинг: 0 / 0
Ламерский вопрос про MVC.
    #38751628
авторСильно страшно ?:)
УЖОС!
...
Рейтинг: 0 / 0
Ламерский вопрос про MVC.
    #38751879
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы советовал больше углубиться в ооп, если можно так выразиться вплане использования

вью.

а именно

echo $conroller->execute(); например.

тоесть нам побарабану что возвращает конролер, строку текста, или целую вьюху(обьект) у которого определён могический метод ту стринг

class view{

...

protected function _render(){//return view as text }

public function __to_string(){return $this->_render();}
}

с другой стороны, едия о том чтобы вьха могла и возвращать текст и сразу выводить сама тоже имеет место быть(параметр метода рендер)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Ламерский вопрос про MVC.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]