Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 1
Регистрация: 06.03.2013
Сообщений: 6

Модель Page страницы

06.03.2013, 14:46. Показов 2021. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Берём простой случай. Требования к сайту:
- динамическая генерация страниц
- блок новостей
То есть по идее должны быть две CRUD модели. Понятно, что редактирование, обновление и удаление доступно админу, чтение - всем пользователям.
Вопросы в следующем:
1) как правильно организовать модели и контроллеры?
2) как взаимодействовать с базой?

Все запросы будут отправляться файлу index.php, в нём создаваться экземпляр класса Route, в котором вызывается метод start
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
static function start($mRequestUri)
        {
            // контроллер и действие по умолчанию
            $controller_name = 'Page';
            $action_name = 'index';           
            
            $routes = explode('/', $mRequestUri);
    
            // получаем имя контроллера
            if ( !empty($routes[1]) )
            {   
                $controller_name = $routes[1];
            }
            
            // получаем имя экшена
            if ( !empty($routes[2]) )
            {
                $action_name = $routes[2];
            }
    
            // добавляем префиксы
            $model_name = 'Model_'.$controller_name;
            $controller_name = 'Controller_'.$controller_name;
            $action_name = 'action_'.$action_name;
    
            // подцепляем файл с классом модели (файла модели может и не быть)
    
            $model_file = strtolower($model_name).'.php';
            $model_path = "application/models/".$model_file;
            if(file_exists($model_path))
            {
                include "application/models/".$model_file;
            }
    
            // подцепляем файл с классом контроллера
            $controller_file = strtolower($controller_name).'.php';
            $controller_path = "application/controllers/".$controller_file;
            if(file_exists($controller_path))
            {
                include "application/controllers/".$controller_file;
            }
            else
            {
                /*
                правильно было бы кинуть здесь исключение,
                но для упрощения сразу сделаем редирект на страницу 404
                */
                Route::ErrorPage404();
            }
            
            // создаем контроллер
            $controller = new $controller_name;
            $action = $action_name;
            
            if(method_exists($controller, $action))
            {
                // вызываем действие контроллера
                $controller->$action();
            }
            else
            {
                // здесь также разумнее было бы кинуть исключение
                Route::ErrorPage404();
            }
        
        }
Контроллер страницы вероятно должен выглядеть следующим образом
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Controller_Page extends Controller {
        
        function __construct()
        {
            $this->model = new Model_Page();
            $this->view = new View();
        }
        
        function action_index()
        {
            $data = $this->model->get_data();       
            $this->view->generate('index_view.php', 'template_view.php', $data);
        }
        
    }
Класс Модели
PHP
1
2
3
4
5
6
 class Model
    {
        public function get_data()
        {
        }
    }
Для упрощения модель страницы описал так
PHP
1
2
3
4
5
6
7
8
9
10
<?php
    class Model_Page extends Model {
        function get_data() {
            $mysqli = new mysqli('localhost', 'root', 'pass', 'dbname');
            $result = $mysqli->query("SELECT * FROM ru_pages WHERE id=1");
            $row = $result->fetch_object();
            return array ('title' => $row->title);
            $result->close();
        }
    }
Еще раз вопросы:
как правильно организовать модель и контроллер?
как вытащить обращение к базе в отдельный класс?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.03.2013, 14:46
Ответы с готовыми решениями:

Чем определяется одинаковость урлов /page?FAQ и /page.php?FAQ
Подскажите, пожалуйста, какая опция php или настройка сервера позволяет не указывать .php в урлах? Просто раньше у меня на сайте работал...

Как сделать скролинг (или Page Up, Page Down) страницы Chrome ?
ИСПОЛЬЗУЕТСЯ: C#, WebDriver, Chrome Как сделать скролинг страницы? Или нажать Page Up, Page Down.

Как запретить страницы page/2/?
Здравствуйте! Сайт на DLE. Обнаружил в яндекс вебмастер, что страниц стало вдвое больше, проиндексировались страницы типа...

9
:)
 Аватар для PlumBoom
134 / 134 / 31
Регистрация: 30.03.2013
Сообщений: 428
14.04.2013, 19:41

Не по теме:

Пример взят с хабра) Хотя ошибки и недочеты там есть :)



Вот пример структуры:

Code
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
-/includes/
---/languages/
---/templates/
------/defaulttmpl/
---------/header/
---------/footer/
---------/content/
---/db.mysql.php
-/components/
---/index/
------/view.php
------/controller.php
------/model.php
---/news/
------/view.php
------/controller.php
------/model.php
-/core/
---/Base_Controller.php
---/Base_View.php
---/Base_Model.php
---/Loader.php
---/Router.php
---/config.php
-/index.php
includes - директория подключаемых или включаемых в приложение файлов (языки, шаблоны, конфиги БД MySQL и т.п.).
includes/languages - директория с различными языками
includes/languages/templates - директория с шаблонами
includes/languages/templates/defaulttmpl - 1-й шаблон по умолчанию (разделяется на шапку, содержание и нижний колонтитул, всё это подключается представлением (представлениями))
includes/languages/templates/db.mysql.php - конфиг БД MySQL (например, логин, пароль, БД и т.п.)
components - составные части приложения, например, главная страница (index) и блок новостей (news), которые в свою очередь содержат свое предстваление, свой контроллер, свою модель.
core - ядро системы
Base_Controller.php, Base_View.php, Base_Model.php... здесь, думаю, пояснений не нужно
core/Loader.php - загрузчик компонентов ядра (также можно назвать и bootstrap - начальная загрузка)
core/config.php - файл конфигурации самого приложения и его модулей

Вот я привел пример структуры, которым сам пользуюсь Посмотрите MVC-движки и фреймворки, посмотрите, как они устроены

И вообще, многие чудики представление заполняют html-кодом... Так вот, представление отвечает за вывод информации, и там есть свои методы для отображения Поэтому рекомендую задуматься)))
P.S. Писать нужно на свой вкус и чувствовать это
0
:)
 Аватар для PlumBoom
134 / 134 / 31
Регистрация: 30.03.2013
Сообщений: 428
14.04.2013, 19:43
Подробная схема MVC
P.S. Диспетчер - это ядро))
Миниатюры
Модель Page страницы  
0
:)
 Аватар для PlumBoom
134 / 134 / 31
Регистрация: 30.03.2013
Сообщений: 428
14.04.2013, 19:53
Забыл еще дописать: Router - маршрутизатор (выбирает маршрут м/у компонентами и модулями)
Кстати, я говорил, что взятый тобою пример с хабра имеет недочеты и ошибки, так вот, введи такой адрес:
[you-site].ru/main/index - отобразится главная страница; а вот так:
[you-site].ru/main/index/бла/бла/крутяк/приколчэг/бугага ... и продолжаем до бесконечности... - всё равно отобразится главная страница.. Вот первый недочет)
0
28 / 50 / 2
Регистрация: 10.01.2012
Сообщений: 347
15.04.2013, 09:28
в схемке подразумевается, что шаблон может вызвать другой контроллер? например для отображения меню или тулбара...
0
:)
 Аватар для PlumBoom
134 / 134 / 31
Регистрация: 30.03.2013
Сообщений: 428
15.04.2013, 11:27
Нет. Представление запрашивает шаблон, а контроллер запрашивает представление.
0
28 / 50 / 2
Регистрация: 10.01.2012
Сообщений: 347
15.04.2013, 11:52
вот рекомендую предусмотреть ) например в симфони это делается так:

http://symfony.com/doc/master/... ontrollers

Code
1
2
3
4
5
{# app/Resources/views/base.html.twig #}
 
<div id="sidebar">
    {{ render(controller('AcmeArticleBundle:Article:recentArticles', { 'max': 3 })) }}
</div>
т.е. из шаблона отрисовывается то что вернёт котроллер Article:recentArticles с параметром max = 3

Добавлено через 14 минут
и еще вопрос, вот контроллер вернул данные от шаблона обратно в "диспетчер", что именно будет делать диспетчер с ними? и в каком виде предполагается данные придут в него?
0
:)
 Аватар для PlumBoom
134 / 134 / 31
Регистрация: 30.03.2013
Сообщений: 428
15.04.2013, 15:02
Я делаю не так, как на картинке)
Контроллер сразу передает данные юзеру от представления) Ошибкой это не будет)
0
28 / 50 / 2
Регистрация: 10.01.2012
Сообщений: 347
15.04.2013, 15:22
а как же пост обработка ответа от контроллера перед отправкой клиенту? ) например если захочется сжать ответ гзипом?
0
:)
 Аватар для PlumBoom
134 / 134 / 31
Регистрация: 30.03.2013
Сообщений: 428
16.04.2013, 12:07
Юзер запрашивает страницу --> контроллер обрабатывает запрос и передает соответствующие данные модели и представлению --> контроллер забирает полученные результаты от модели и представления --> контроллер отправляет результаты юзеру.
Контроллер не передает POST-запросы, а вызывает соответствующие методы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.04.2013, 12:07
Помогаю со студенческими работами здесь

Создание посадочной страницы (Landing Page)
Возникла потребность в создании посадочной страницы. Было бы здорово получить ответы на несколько дилетантских вопросов от знающего...

Прокрутка веб-страницы с задержкой. Landing Page
Здравствуйте, уважаемые форумчане! Я, мягко сказать, в программировании не шарю. Веб-дизайнер. Но предо мной встала такая вот цель:...

Маршрутизация для мастер страницы (routing for master page)
не знаю с чего начать. есть маршрутизация, которая прекрасно работает. но возникла проблема создание маршрутной ссылки для masterpage. ...

Google speed page после оптимизации не пропускает внутренние страницы
Здравствуйте. Оптимизировал сайт http://www.massage-ekb.ru/ под требования гугла. В итоге проходит только главная страница, некоторые...

Сделать привязку button к кнопке 'Page Down' или 'Page Up' на клавиатуре
Здравствуйте! Подскажите пожалуйста, как можно сделать привязку button к кнопке 'Page Down' или 'Page Up' на клавиатуре , то есть когда я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru