[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP MVC ООП - как принять и обработать форму, отпр
Albatros88
Здравствуйте, прошу помощи по следующей проблеме...
В целях изучения ООП и паттерна проектирования MVC решил создать сайт с использованием этих технологий. Информации в интеренете полно, но....никак не могу разобраться в некоторый нюансах. Принципы MVC кажется понял....Контроллер реагирует на действия пользователя, принимает некие данные, компонует их и передает в модель, а модель в свою очередь их обрабатывает(сохраняет в базе, достает оттуда и прочее), а результат должен отразится в шаблоне, в котором чистый html с минимальным количеством логики. Стремиться нужно к тонкому контроллеру и толстой модели.

Есть следующая структура:
user posted image

Есть файл controller/main.php - в нем описан класс контроллера main. Модель в model/main.php - описан класс модели. И соотвtтственно шаблон - view/main.tpl.
Есть одна точка вхождения index.php и все запросы адресуются именно на него. Там же и создается екземпляр класса и вызывается его метод, который собирает страничку по частям.

В шаблоне есть форма, я отправляю ее аяксом используя jQuery. В нетворке видно, что запрос идет. Как мне принять и обработать эту форму?

На форумах пишут, что это нужно делать в контроллере....НО КАК?? Ведь в контроллере у меня описан класс(!!!), допустим я могу написать метод в этом классе, который и будет обрабатывать данные....но ГДЕ мне вызывать этот метод, в каком месте, в каком файле?? Ведь в файле-контроллере должен быть только класс, верно?? Как это сделать так, чтоб это было правильно и вписывалось в концепции MVC и ООП ??

И еще, когда я оправляю форму на index.php, то в ответ приходит вся html страница, почему так?? Я создал отдельный файл controller/ajax_form.php и начал отправлять форму на него, а сам этот файл подключил инклюдом в index.php после создания екземпляра класса и все стало нормально, но я сомневаюсь, что это правильно с точки зрения MVC. или я ошибаюсь?

Так же заметил такую штуку...
В controller/ajax_form.php пишу следующее:
if (isset($_POST['name'])) {
echo $_POST['name'];
}

А в блоке success:
alert(response);

И в алерте выводится имя, введенное в форме, т.е. все ок.
Но при этом в controller/ajax_form.php:
var_dump($_POST); // выводит NULL.

Как такое может быть. Помогите разобраться, кто чем может)) спасибо.
Invis1ble
Цитата (Albatros88 @ 28.04.2015 - 12:21)
НО КАК?? Ведь в контроллере у меня описан класс(!!!), допустим я могу написать метод в этом классе, который и будет обрабатывать данные....но ГДЕ мне вызывать этот метод, в каком месте, в каком файле??

этим должен заниматься роутер
либо какой-то отдельный сервис, вызываемый вслед за роутером

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

AllesKlar
Albatros88
Вот, прочти это http://habrahabr.ru/post/31270/
Там простенькая модель MVC описана.

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

_____________
[продано копирайтерам]
ApuktaChehov
Albatros88 - ты в запросе, должен отправлять на сервер и инструкции о том, какой контроллер должен обработать этот запрос.

Например: site.ru/ajax/form?a=1&b=2
тут ajax - это имя контроллера, а form имя действия(метода контроллера), а далее параметры всякие.

И должен быть код, который определяет все эти параметры и вызывает нужный контроллер.
Например роутер, как говорилось выше.

Но бы не стал загружать роутер работой по созданию эземпляров контроллера. Лучше сделать базовый контроллер-фабрику, который и будет создавать экземпляры на основ данных, которое ему передаст роутер.

_____________
stump
Я бы в моделе форму валидировал. Как по мне, то так прикольнее! Если конечно речь идет о данных формы.

_____________
Трус не играет в хокей
ApuktaChehov
stump - неоднозначный вопрос. С одной стороны, зачем звать модель, если неизвестно готовы ли данные для нее? С другой, конечно хорошо, когда вся обработка данных в одном месте.

Опять же не получится ли так, что контроллеры, фактически только модели вызывают и все. А модели широкие и пузатые.

_____________
chee
Albatros88,
Тебе нужна одна точка входа, это раз, читай одноимённый паттерн.
Тебе нужен роутер для создание списка белых url-ов, это два.
Тебе нужны фабрики контроллеров, моделей, вьюшек и валидаторов, это три.
Тебе нужен объект посредник(гидратор), который будет заполнять данные из формы в модель, это четыре.
Под каждый конкретный случай бизнесс-логики у тебя должен быть свой объект валидатора, который ВНИМАНИЕ валидирует состояние модели для совершение этой бизнесс логики, а не какие-то внешние данные.

Короче, ты ничего не поймешь. smile.gif

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
ApuktaChehov
chee - по последнему пункту можно манула?

_____________
Albatros88
ApuktaChehov, AllesKlar - спасибо огромное, ваши советы помогли разобраться. Роутер сделал, вызывать нужный метод при запросе научился...

Спасибо всем, кто откликнулся

Остается непонятным вопрос, касательно ajax...Данные я получаю, и все кажется хорошо, НО...не дает покоя, то, что в ответ на запрос возвращается весь хтмл код страницы. Т.е. перед тем как селать в PHP
echo 'ответ';

генерится страница и возвращается ее код вместе с 'ответ'. Так происходит, только если заворачивать все запросы на index.php. Если же обработку выносить в отдельный файл, то все ОК. Как это победить?
ApuktaChehov
Albatros88 значит смотри.


Запрос -------------- Роутер Базовая модель ------ Модель
| /
| /

Базовый контроллер ---------------------------- Контроллер
\
\

Представление
<-----------------------------------------------------------------------------------------------


Котроллер решает что выдавать на запрос. Именно в нем ты должен решить, отдать html или просто слово 'ответ'.
Если у тебя html выдается еще где-то кроме контроллера, то ты допустил ошибку.

_____________
kaww
Albatros88
Ты можешь в зависимости от типа запроса отдавать ответ в определенном формате.
Например, этот код расположен там, где у тебя инициализируется рендер представления:
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {

$context = 'json';
} else {

$context = 'html';
}

if ($context == 'json') {

header('Content-Type: application/json');
echo json_encode($view->getVars());
} else {

echo $view->render();
}
chee
Цитата (ApuktaChehov @ 29.04.2015 - 12:22)
chee - по последнему пункту можно манула?

я не понял вопроса, но вот типичный код для того что я описал выше


class DomainModel
{

}


class Validator
{
public $model;
}

class Mediator
{
public $request;
public $model;
}

$model = new DomainModel;

$mediator = new Mediator;
$mediator->request = new Request;
$mediator->model = new Model;
$mediator->hydrate('edit');

$validator = new Validator;
$validator->model = $model;
if (!$validator->isValid('edit')) {
var_dump($validator->getMessages());
}



_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
ApuktaChehov
chee - спс.

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

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