[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Прошу критиковать структуру MVC
m4a1fox
Условимся... Я знаю что есть отличный курс от Twin'a про mvc... Но все же... Как-то опыт ведь должен появляться... вот поэтому от меньшего к большему так сказать. В общем, необходимо сделать сайт. Как его сделать на php не прибегая к компонентам mvc я знаю... Но все же пробую сделать на mvc. Сразу оговорю. Это реально первый опыт, поэтому прошу помощи и критики. Значит вот такая структура.

собственно прилагаю картирку со структурой каталогов.
user posted image


Главная страница. index.php

<?php
include './variables.php';

ob_start();

include './skins/tpl/show.tpl';

$content = ob_get_contents();

ob_end_clean();

include './skins/tpl/index.tpl';
?>


а так же файл который в буфер уходит (include './skins/tpl/show.tpl';)


<?php
include './skins/tpl/block/head.php';
include './skins/tpl/block/menu.tpl';
include './skins/tpl/block/body_top.tpl';
switch ($page)
{
case 'second';
include './skins/tpl/'.$page.'/controller.php';
break;

case 'third';
include './skins/tpl/'.$page.'/controller.php';
break;

default:
include './skins/tpl/'.$page.'/controller.php';
break;
}
include './skins/tpl/block/body_bottom.tpl';
?>




файл который он включает т.е (include './skins/tpl/index.tpl';), имеет вот такую структуру

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
title>Главная</title>
<
meta name="description" content="" />
<
meta name="keywords" content="" />
<
meta http-equiv="content-type" content="text/html; charset=utf-8" />
<
link href="admin/img/favicon.ico" rel="icon" type="image/x-icon" />
<
link href="admin/img/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<
link href="style.css" rel="stylesheet" type="text/css" />
</
head>
<
body>
<?php echo $content; ?>
</body>
</
html>


файл контроллер (папка: ./skins/tpl/main/controller.php)

<?php
/*
* @
TODO
* @author m4a1fox
* @copyright 2011 m4a1fox
*/

include './skins/tpl/main/show.php';
?>


и собственно файл ( './skins/tpl/main/show.php';)

<?php
/*
* @
TODO
* @author m4a1fox
* @copyright 2011 m4a1fox
*/

echo 'Главная страница';
?>
<div style="width: 100px; height: 100px;
background-color: #C3FBF8; border: 1px solid black;"
>
тут произвольный текст/
</
div>


По такому же методу построены и остальные страницы.

понимаю что много написал, но если кого не затруднит, посмотрите поджалуйста, я хоть в правильном направлении иду?:)



Спустя 4 минуты, 24 секунды (1.06.2011 - 17:02) Игорь_Vasinsky написал(а):
В MVC - index.php - выступает в роли (контроллера) переключателя, там используют case

Спустя 1 минута, 35 секунд (1.06.2011 - 17:03) m4a1fox написал(а):
Игорь_Vasinsky
Да, это видел у twin'a. Но у меня маленькая проблемка в этом плане.

Спустя 51 секунда (1.06.2011 - 17:04) sharki написал(а):
Всё это можно заменить на

<?php
include './skins/tpl/block/head.php';
include './skins/tpl/block/menu.tpl';
include './skins/tpl/block/body_top.tpl';

if(file_exist('./skins/tpl/'.$page.'/controller.php'))
include './skins/tpl/'.$page.'/controller.php';
else
// какая нибудь ошибка


include './skins/tpl/block/body_bottom.tpl';
?>


Только не понимаю что критиковать?

Спустя 7 минут, 15 секунд (1.06.2011 - 17:11) Игорь_Vasinsky написал(а):
Цитата
Но у меня маленькая проблемка в этом плане.

а какая?

Спустя 14 минут, 31 секунда (1.06.2011 - 17:26) m4a1fox написал(а):
Игорь_Vasinsky
Вот так можно сделат?
index.php

<?php
/*
* Главный индекс (index)
* @author m4a1fox
* @copyright 2011 m4a1fox
*/


/**
* Подключаем файл с переменными ($_GET)
*/

include './variables.php';

ob_start();

include './skins/tpl/block/head.php';
include './skins/tpl/block/menu.tpl';
include './skins/tpl/block/body_top.tpl';
switch ($page)
{
case 'second';
include './skins/tpl/'.$page.'/controller.php';
break;

case 'third';
include './skins/tpl/'.$page.'/controller.php';
break;

default:
include './skins/tpl/'.$page.'/controller.php';
break;
}
include './skins/tpl/block/body_bottom.tpl';

$content = ob_get_contents();

ob_end_clean();

include './skins/tpl/index.tpl';

?>

Спустя 2 минуты, 17 секунд (1.06.2011 - 17:28) m4a1fox написал(а):
sharki
Я структуру разбил... правильно ли... И вообще так можно делать?

Спустя 1 минута, 59 секунд (1.06.2011 - 17:30) sharki написал(а):
m4a1fox
Ты и в правду думаешь, что всякие модели, роутеры и контроллеры просто так придуманы?

index.php выступает в роли только как ведущего контроллера, который подключает другие контроллеры, те, в тоже время, подключают модели и виды

Спустя 1 минута, 13 секунд (1.06.2011 - 17:31) m4a1fox написал(а):
Вот тут

include './skins/tpl/block/head.php'; // файл в котором находится шапка файта
include './skins/tpl/block/menu.tpl'; // соответственно тут меню :)
include './skins/tpl/block/body_top.tpl'; // тут верхняя часть контента сайта (имеется ввиду верхняя часть таблицы)

// это блок отвечающий только за вывод контента

switch ($page)
{
case 'second';
include './skins/tpl/'.$page.'/controller.php';
break;

case 'third';
include './skins/tpl/'.$page.'/controller.php';
break;

default:
include './skins/tpl/'.$page.'/controller.php';
break;
}
// это блок отвечающий только за вывод контента
include './skins/tpl/block/body_bottom.tpl'; // соответственно нижняя часть контента сайта (имеется ввиду нижняя часть таблицы)



Спустя 40 секунд (1.06.2011 - 17:32) m4a1fox написал(а):
sharki
Уверен, что не просто так.... но я честно стараюсь)

Спустя 1 минута, 45 секунд (1.06.2011 - 17:34) sharki написал(а):
m4a1fox
Я же тебе написал как можно заменить блок с кейсами smile.gif или ты каждый раз будешь прописывать что-то новенькое в кейс блок?)

Если ты уже что-то понимаешь в MVC, то стоит еще раз прочесть ирбисовское ядро, только не ligth)

Спустя 2 минуты, 22 секунды (1.06.2011 - 17:36) m4a1fox написал(а):
sharki
Это да... спасибо. Сейчас заменяю....

Спустя 3 минуты, 15 секунд (1.06.2011 - 17:39) m4a1fox написал(а):
sharki
Только не file_exist а file_exists!

Спустя 2 минуты, 32 секунды (1.06.2011 - 17:42) sharki написал(а):
m4a1fox
Верно smile.gif наизусть не знаю, редко пользуюсь

Спустя 5 минут, 43 секунды (1.06.2011 - 17:48) Игорь_Vasinsky написал(а):
m4a1fox
Цитата
include './skins/tpl/'.$page.'/controller.php';


ты зачем файлы контроллеров (вообще php) в TPL папке держишь?, там только TPL.

Я вот как делаю (на функциях):

index.php - главный контроллер
function.php - сдесь include функций (тоже case - в зависимости от модуля, чтоб не нужные не висели)
папка image - картинки
папка JS - общие скрипты
папка CSS - обобщёный стиль

папка lib - файлы функций (имя-название функции)
папка moduls - файлы модулей
папка controllers - контроллеры модулей
папка themes - темы
- Имя темы, например default:
- image - картинки
- css - стили
- js - скрипты JS
- tpl - шаблоны

Спустя 25 секунд (1.06.2011 - 17:48) m4a1fox написал(а):
Вот у меня возник вопрос..... Как быть в случае, если у меня ссылка будет вида /?page=second&link=guest - тоесть ссылка на другую страницу, из страницы $_GET['page']. То есть, при вызове $_GET['link'] у меня на страницу будет вылазить и $_GET['page'] и $_GET['link']. если $page у меня инициализируется в файле variables.php

$page = !empty($_GET['page'])?$_GET['page']:'main';


Спустя 1 минута, 2 секунды (1.06.2011 - 17:49) m4a1fox написал(а):
Игорь_Vasinsky
О! Спасибо. Возьму Вашу структуры за пример. Можно?smile.gif

Спустя 7 минут, 14 секунд (1.06.2011 - 17:56) Игорь_Vasinsky написал(а):
m4a1fox
можно wink.gif
так же не стоит забывать что отдельный контроллер модуля тоже может содержать блок case (например чтоб файл модуля подключал тот или иной шаблон), например:

модуль admin.php, а шаблоны: general, add_news, add_pages и т.д.

Спустя 7 минут, 37 секунд (1.06.2011 - 18:04) m4a1fox написал(а):
Игорь_Vasinsky
Ага! Значит если я хочу сделать ссылку вида

/?page=second&link=guest

то мне надо надо в контроллере переключать через swich&case модули и все... Так получается? Я вопрос первым постом на этойц странице спрашивал? Получается ответ то что вы написали?

Спустя 13 минут, 23 секунды (1.06.2011 - 18:17) sharki написал(а):
link - будет служить как переключателем функций модуля page . Т.е page служит как переключатель самих модулей.

в итоге

include './modules/'.$_GET['page'].'/'.$_GET['link'].'_controller.php';


а в контроллере делай что тебе угодно, тебе известно что надо подключить и откуда что взять, осталось все это связать =) и кстати ен забывай про безопасность

Спустя 1 минута, 41 секунда (1.06.2011 - 18:19) m4a1fox написал(а):
m4a1fox
Только не модули, а страницы?! Так же?!

Спустя 3 минуты, 24 секунды (1.06.2011 - 18:22) m4a1fox написал(а):
sharki
Вот так переключаю модули

switch ($link)
{
case 'guest':
include './skins/modules/second/guest.php';
break;

default :
include './skins/modules/second/show.php';
break;
}


А в файле variables.php

$link = !empty($_GET['link'])?$_GET['link']:NULL;


Насколько понимаю, так нельзя?

Спустя 2 минуты, 51 секунда (1.06.2011 - 18:25) sharki написал(а):
m4a1fox
ты находишься на странице новости, значит ссылка

?page=news&link=read


в индексе подключаешь контроллер который выше, он подключает модель и вид, и т.п, вообщем что душе угодно подключай там.

например тебе нужно вывести новость под номером 3, значит ссылка имеет вид

?page=news&link=read&id=3


Опять же подключаешь контроллер, там же смотришь, если есть id то подключить модель которая за это отвечает, или просто совмести и там сделай банальное if else

так же подключаешь дополнительные шаблоны, главный принцип и был описан на ирбисе.


название модулей похожи на названия шаблонов, они так же находят в папках

include './modules/'.$_GET['page'].'/'.$_GET['link'].'_controller.php';

include './skins/tpl/'.$_GET['page'].'/'.$_GET['link'].'.tpl';


В итоге одна ссылка подключает и нужные шаблоны и нужные тебе контроллеры, и никакой путаницы

Спустя 5 минут, 35 секунд (1.06.2011 - 18:31) m4a1fox написал(а):
sharki
Ага! Спасибо. Буду разбираться. Но мне кажется это запутано немножко.... Хотя наверно это сперва такое ощущение:)

Спустя 2 минуты, 16 секунд (1.06.2011 - 18:33) m4a1fox написал(а):
sharki
Да, еще вопрос. Вот тут ?page=news&link=rea. Если нахожусь на странице новости, то почему у меня ссылка имеет вот такой ?page=news&link=read вид, а не вот ?page=news такой?

Спустя 4 минуты, 59 секунд (1.06.2011 - 18:38) sharki написал(а):
m4a1fox
ну ты можешь автоматически подставлять read в индексе, т.е если не существует $_GET['link'] то подставить read

Спустя 2 минуты, 51 секунда (1.06.2011 - 18:41) m4a1fox написал(а):
sharki
Нет нет. Я не стпросил. Вообще, зачем нужно так? Ну, то есть, если есть ссылка вида
?page=news то вот это

if(file_exists('./skins/modules/'.$page.'/controller.php'))
include './skins/modules/'.$page.'/controller.php';

и так вытащит все из папки news....

Спустя 2 минуты, 37 секунд (1.06.2011 - 18:43) m4a1fox написал(а):
Как я понимаю то ссылка вида ?page=news&link=read означет что! Разбиваем на части
вот это ?page=news вот тут

include './modules/'.$_GET['page'].'/'.$_GET['link'].'_controller.php';

означает папку! Так?!

а вот это &link=read вот тут

include './modules/'.$_GET['page'].'/'.$_GET['link'].'_controller.php';

означет файл в этой папке. То есть, первая часть ссылки указыват только путь?

Спустя 2 минуты, 15 секунд (1.06.2011 - 18:46) sharki написал(а):
m4a1fox
А если ты хочешь другую функцию использовать например add_controller.php и ты будешь опять вручную все прописывать?

А так
 include './modules/'.$_GET['page'].'/'.$_GET['link'].'_controller.php';

данный код всё за тебя сделает, у тебя в модуле news может содержаться много чего

read_controller.php - читать новость
add_controller.php - допустим добавить новость
edit_controller.php - редактировать
comment_controller.php - читать все комментарии какой то новости. и тебе всего лишь надо указать второй аргумент в ссылке $_GET['link']

Спустя 1 минута, 22 секунды (1.06.2011 - 18:47) m4a1fox написал(а):
sharki
Да. Значит я правильно понял. Спасибо. Буду дальше практиковаться.

Спустя 8 секунд (1.06.2011 - 18:47) sharki написал(а):
$_GET['page'] указывает какой модуль подключить, содержит имя модуля, которым ты дополняешь путь до этого модуля, $_GET['link'] указывает тоже часть имени файла, который нужно открыть

Спустя 2 минуты, 37 секунд (1.06.2011 - 18:50) m4a1fox написал(а):
sharki
Так получается что контроллеров может быть велико множество.....

Спустя 2 минуты, 39 секунд (1.06.2011 - 18:52) m4a1fox написал(а):
m4a1fox
Тогда какой же файл вот тут

if(file_exists('./skins/modules/'.$page.'/controller.php'))
include './skins/modules/'.$page.'/controller.php';
else
echo 'Ошибка';

подключать?

Спустя 3 минуты, 11 секунд (1.06.2011 - 18:56) sharki написал(а):
m4a1fox

if(empty($_GET['link'])) {
$_GET['link'] = 'read';
}

if(empty($_GET['page'])) {
$_GET['page'] = 'main';
}


if(file_exists('./modules/'.$_GET['page'].'/'.$_GET['link'].'_controller.php')) {
include './modules/'.$_GET['page'].'/'.$_GET['link'].'_controller.php';
include './skins/tpl/'.$_GET['page'].'/'.$_GET['link'].'.tpl';
}
else
echo 'Ошибка';


Спустя 11 минут, 24 секунды (1.06.2011 - 19:07) m4a1fox написал(а):
sharki
Окей! Спасибо что подсказали.... буду разбираться.

Спустя 19 часов, 55 минут, 6 секунд (2.06.2011 - 15:02) m4a1fox написал(а):
sharki
Я тут эксперементировал... И вопрос возник. Объясните зачем нужна вот эта

include './skins/tpl/'.$_GET['page'].'/'.$_GET['link'].'.tpl';

Строка. Я понимаю что она делает, но для чего? Не понимаю... Можете разъяснить?

Спустя 2 минуты, 41 секунда (2.06.2011 - 15:05) sharki написал(а):
m4a1fox
Подключает не только модуль но и шаблон этого модуля, ты можешь её удалить, эту строчку, если ты делаешь подключение нужных шаблонов в "виде"

Спустя 27 секунд (2.06.2011 - 15:05) Игорь_Vasinsky написал(а):
Так она показывает - какой шаблон, какого модуля надо подключить wink.gif

Спустя 2 минуты, 49 секунд (2.06.2011 - 15:08) m4a1fox написал(а):
Игорь_Vasinsky
Я понимаю зачем она.... Я только не понимаю пользы от нее. Как написал sharki я ее убрал... Но у меня сомнения... Может не надо было убиратьГ

Спустя 4 минуты, 8 секунд (2.06.2011 - 15:12) Игорь_Vasinsky написал(а):
Цитата
ты можешь её удалить, эту строчку, если ты делаешь подключение нужных шаблонов в "виде"

Спустя 41 секунда (2.06.2011 - 15:13) m4a1fox написал(а):
И вот это


можешь её удалить, эту строчку, если ты делаешь подключение нужных шаблонов в "виде"

Я немного запутался и теперь сам не могу разобраться так ли я делаю или нет?! Понимаете?

Спустя 2 минуты, 35 секунд (2.06.2011 - 15:15) m4a1fox написал(а):
Кажется начинаю догонять. Я подключаю вид в контроллере

Спустя 1 минута, 28 секунд (2.06.2011 - 15:17) sharki написал(а):
m4a1fox
Ну вот, там же наверняка подключаешь нужный тебе шаблон, если это так, то можешь удалить то, про что спрашивал smile.gif

Спустя 1 минута, 9 секунд (2.06.2011 - 15:18) m4a1fox написал(а):
sharki
Да, вроде догнал. Спасибо.

Спустя 3 минуты, 51 секунда (2.06.2011 - 15:22) m4a1fox написал(а):
Еще, скажите пожалуйста вот такая структура

ob_start(); // Начинаем собирать буфер.

include './skins/tpl/block/head.php';
include './skins/tpl/menu.tpl';
include './skins/tpl/block/body_top.tpl';

if(file_exists('./skins/modules/'.$page.'/'.$link.'_controller.php'))
include './skins/modules/'.$page.'/'.$link.'_controller.php';
else
echo 'Ошибка';

include './skins/tpl/block/body_bottom.tpl';

$content = ob_get_contents();

ob_end_clean();

это нормально. Я сейчас собственно про первые 3 includ'a говорю. То есть так делается и насколько сильно это грузит систему?

Спустя 3 минуты, 59 секунд (2.06.2011 - 15:26) sharki написал(а):
m4a1fox
Нормалек, с опытом излишества сам уберешь, и сделаешь грамотнее smile.gif

Спустя 8 минут, 4 секунды (2.06.2011 - 15:34) m4a1fox написал(а):
sharki
И еще. Знаю что запарил но вопросы быстро очень возникают. Собственно речь о ссылках.

Вот мой блок меню (menu.tpl)

<div id="menu">
<
table width="1000px" border="0" height="50px"
align="center" style="text-align: center;">
<
tr>
<
td>
<
a href="?page=main&link=read">Главная</a>
</
td>

<
td>
<
a href="?page=second&link=read">Меню2</a>
</
td>

<
td>
<
a href="?page=third&link=read">Меню3</a>
</
td>

<
td>
<
a href="?page=four&link=read">Меню4</a>
</
td>

<
td>
<
a href="?page=five&link=read">Меню5</a>
</
td>
</
tr>
</
table>
</
div>


Есть еще одна ссылка, выглядит вот так:
<a href="?page=guest&link=read">
Страница№3</a>

Есть ли какой нибудь способ не прописывать ссылки каждый раз вот так?

Спустя 3 минуты, 47 секунд (2.06.2011 - 15:38) sharki написал(а):
m4a1fox
Я же говорил, и даже по моему писал, на 3ей странице. Надеюсь поймешь что надо отсюда забрать, и вставить туда, чтобы не писать в ссылках &link=read

if(empty($_GET['link'])) {
$_GET['link'] = 'read';
}

if(empty($_GET['page'])) {
$_GET['page'] = 'main';
}


if(file_exists('./modules/'.$_GET['page'].'/'.$_GET['link'].'_controller.php')) {
include './modules/'.$_GET['page'].'/'.$_GET['link'].'_controller.php';
include './skins/tpl/'.$_GET['page'].'/'.$_GET['link'].'.tpl';
}
else
echo 'Ошибка';

Спустя 1 минута, 36 секунд (2.06.2011 - 15:39) m4a1fox написал(а):
sharki
Нет нет! Я так и сделал... Там все работает! Я про то что ссылки придется в пункте меню (например) прописывать вручную... Хотя наверно так и надо. Я чего-то гоню. Все понял! Спасибо.

Спустя 4 дня, 18 часов, 29 минут, 30 секунд (7.06.2011 - 10:09) m4a1fox написал(а):
Возвращаемся к нашим баранам:). Итак. Пункт админки. Как мы помним я пытаюсь все реализовать на моделе MVC. Итак. Вопрос для уточнения. В админке есть пункт добавления записи.
Собственно сам router.php

if (!empty($_GET['link']) && !isset($_GET['act']))
{
include './skins/modules/'.$link.'/read_controller.php';
include './skins/modules/'.$link.'/show.php';
}
elseif($_GET['act'] == 'add')
{
include './skins/modules/'.$link.'/'.$act.'/add_controller.php';
include './skins/modules/'.$link.'/'.$act.'/add_show.php';
}

Думаю с роутером понятно.
Далее, есть кнопка добавить. Ссылка на нее -

<div id="toolbar">
<
a href="?act=add" id="add_btn">Создать</a>
</
div>

.
Вот файлы в папке add (?act=add).
add_controller.php (подключает model.php (насколько я понимаю) и подключает add_show.)
add_show.php (выводит форму для внесения данных в БД).


Собственно и САМ вопрос. в файле model.php необходимо прописать функции для добавления информации в БД. А именно (примерно)

function SaveBook ($table) {
if (!empty($_POST['add'])) {
$result = mysql_query("INSERT INTO $table SET
`name` = '"
.$_POST['name']."',
`text` = '"
.$_POST['text']."'
"
);
header('Location: ?page=guest');
}
return $result;
}

Итак... Так вообще делается, или я на ложном пути... Прошу в этом помочь разобраться. Спасибо всем кто откликниться.

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.