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

MVC форма заказа

23.09.2017, 12:33. Показов 987. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! У меня есть интернет магазин, по сути совокупность лендов, человек тыкает на товар и страница с товаром это отдельны ленд с фомрой заказа. Подскажите плз как правильнее организовать обработку и отправку формы заказа. 2 поля всего имя и тел, а и скрытые два поля с айди товара и ценой. И еще после нажатия человека кидает на страницу с завершением заказа. Я пробую так: создаю модель Forma.php, контроллер FormController.php, для страницы завершения заказа создаю представление.
Модель:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
 
 
/**
* Класс Form - модель для работы с формой
*/
class Form
{
    // Получение и обработка данных из формы
    public static function GetFormData($name, $phone, $products)
    {
        // Переменные для формы
        $name = false;
        $phone = false;
        $product_id = false;
        $price = false;
 
        // Обработка формы
        if (isset($_POST['submit'])) {
            // Если форма отправлена 
            // Получаем данные из формы
            $name = $_POST['name'];
            $phone = $_POST['phone'];
            $product_id = $_POST['product_id'];
            $price = $_POST['price'];
 
            // Флаг ошибок
            $errors = false;
 
            // Валидация полей
            if (!Form::checkName($name)) {
                $errors[] = 'Неправильное имя';
            }
            if (!Form::checkPhone($phone)) {
                $errors[] = 'Неправильный телефон';
            }
 
            if ($errors == false) {
                // Если ошибок нет
                // Отправляем заказ в CRM 
 
                
                $result = true;
            }
        }
        return $result;
    }
 
    //Отправка данных из формы в CRM
    public static function SendFormData($name, $phone, $products)
    {
        
    $products_list = array(
        1 => array( 
                'product_id' => $_POST['product_id'],    //код товара (из каталога CRM)
                'price'      => $_POST['price'], //цена товара 1
                'count'      => '1'                      //количество товара 1
                ),
        2 => array( 
                'product_id' => '3',      //код товара 2 доставка
                'price'      => '1500',  //цена товара 2
                'count'      => '1'      //количество товара 2
        )
    );
    $products = urlencode(serialize($products_list));
    // параметры запроса
    $data = array(
        'key'             => 'токен', //Ваш секретный токен
        'order_id'        => number_format(round(microtime(true)*10),0,'.',''), //идентификатор (код) заказа (*автоматически*)
        'country'         => 'KZ',                      // Географическое направление заказа
        'products'        => $products,                 // массив с товарами в заказе
        'bayer_name'      => $name,             // покупатель (Ф.И.О)
        'phone'           => $phone,           // телефон
        'site'            => '<a target="_blank" href="'.$_SERVER['HTTP_REFERER'].'">'.$_SERVER['HTTP_REFERER'].'</a>',  // сайт отправляющий запрос
        'ip'              => $_SERVER['REMOTE_ADDR'],  // IP адрес покупателя
        'utm_source'      => $_SESSION['utms']['utm_source'],  // utm_source 
        'utm_medium'      => $_SESSION['utms']['utm_medium'],  // utm_medium 
        'utm_term'        => $_SESSION['utms']['utm_term'],    // utm_term   
        'utm_content'     => $_SESSION['utms']['utm_content'], // utm_content    
        'utm_campaign'    => $_SESSION['utms']['utm_campaign'] // utm_campaign
    );
     
    // запрос
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, 'http://crm');
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    $out = curl_exec($curl);
    curl_close($curl);
    //$out – ответ сервера в формате JSON
    
    }
    /**
     * Проверяет имя: не меньше, чем 2 символа
     * @param string $name <p>Имя</p>
     * @return boolean <p>Результат выполнения метода</p>
     */
    public static function checkName($name)
    {
        if (strlen($name) >= 2) {
            return true;
        }
        return false;
    }
 
    /**
     * Проверяет телефон: не меньше, чем 6 символов
     * @param string $phone <p>Телефон</p>
     * @return boolean <p>Результат выполнения метода</p>
     */
    public static function checkPhone($phone)
    {
        if (strlen($phone) >= 6) {
            return true;
        }
        return false;
    }
}
Контроллер:


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
/**
*  Контроллер FormController
*/
class FormController
{
    
    /**
     * Action для страницы с завершением заказа
     */
    public function actionEndOrder()
    {
 
        // Переменные для формы
        $name = false;
        $phone = false;
        $product_id = false;
        $price = false;
 
        // Обработка формы
        if (isset($_POST['submit'])) {
            // Если форма отправлена 
            // Получаем данные из формы
            $name = $_POST['name'];
            $phone = $_POST['phone'];
            $product_id = $_POST['product_id'];
            $price = $_POST['price'];
 
            // Флаг ошибок
            $errors = false;
 
            // Валидация полей
            if (!Form::checkName($name)) {
                $errors[] = 'Неправильное имя';
            }
            if (!Form::checkPhone($phone)) {
                $errors[] = 'Неправильный телефон';
            }
 
            if ($errors == false) {
                // Если ошибок нет
                // Отправляем заказ в CRM 
 
                $result = Form::SendFormData($name, $phone, $products);
                $result = true;
            }
        }
 
        // Подключаем вид
        require_once(ROOT . 'form.php');
        return true;
    }
}
роут:

PHP
1
'endorder' => 'form/EndOrder'
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.09.2017, 12:33
Ответы с готовыми решениями:

Форма заказа + калькулятор
Ребята, скажу откровенно, в php не разбираюсь, но так получилось что надо сделать Буду рад любой помощи... 1. так как у меня всё на...

Форма заказа PHP
Делаю сайт и нужно сделать форму заказа. Хочется, чтоб форма отправлялась сама, без вызова оутлука или другого почтового клиента =&gt;...

Форма заказа с отправкой на почту
Есть форма заказа с отправкой на почту, к ней нужно добавить стоимость каждого тарифа, в зависимости от выбранного автомобиля. Подскажите в...

5
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
23.09.2017, 21:22
Что то я не вижу тут ничего из фреймворка.

Косяков валом:
1) Form::GetFormData. Вы передаете $name, $phone, $products и сразу же задаете им значение false. Логика?
2) Модель у вас вовсе не модель, а просто свалка из методов. Вообще, модель это целый слой, а не класс. Поэтому не надо стараться запихать все в один класс.
3) Form::GetFormData это явно в контроллере должно быть.
4) Form::SendFormData это можно в отдельный сервис запихать, который будет знать как взаимодействовать с CRM.
5) Модель не должна ничего знать о $_POST и валидации данных пользователя, это забота контроллера.
6) Вместо кучи очевидных комментариев лучше напишите очевидный код.

На вашем месте я бы взял фреймворк laravel и прошел весь курс на laracast.
0
1 / 1 / 0
Регистрация: 07.07.2017
Сообщений: 22
25.09.2017, 14:53  [ТС]
Подскажи пож логику формы заказа тогда. Вот как я вижу это: тогда выходит так что мне модель тут вообще не нужна, а сразу данные принимать напрямую в контроллере, проверять и от туда же отправлять?
0
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
25.09.2017, 19:29
Для отправки в CRM (SendFormData) - обернуть в какой-нить компонент или хелпер, или оставить в контроллере.

GetFormData - ну что-то не очень он выглядит, если он и вправду оправдывает свое выведение в отдельную функцию, то да, а так можно просто в экшене принимать пост-запрос и валидировать его(+ ваши chekPhon-ы).

Наверное это лучше провернуть AJAX-ом, да и валидацию тоже выполнить на стороне клиента.

Цитата Сообщение от Granzik Посмотреть сообщение
тогда выходит так что мне модель тут вообще не нужна
Вам видимо да, если бы вы использовали фреймворк, например Yii, то вы бы просто создали Модель-форму, с нужными полями и правилами для них в конроллере принимали пост-запрос и проверяли валидность $model->validate() дальше отправляете в CRM, при этом правила прописываются прямо в клиенте, что есть удобно и красиво.
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
25.09.2017, 19:30
Если весь ваш код это лендос и обработчик формы, то MVC тут вообще не нужен. Надо четко понимать что и зачем вы делаете, а не внедрять всякие модные штуки везде.

Я бы разделил этот код на 3 функции:
1) показ лендоса
2) обработчик формы.
3) отправка данных на CRM.
0
1 / 1 / 0
Регистрация: 07.07.2017
Сообщений: 22
25.09.2017, 19:40  [ТС]
У меня есть витрина с товарами, каждый товар это отдельный ленд, есть внешняя црм. В дальнейшем я планирую статистику сделать. С большим трудом сделал отображение ленда посредством mvc, чтобы ленд понимал какой товар он представляет чтобы цены проставлять автоматом и тд. Вот теперь затык с формой, а какое вью вообще надо подключать? Может мне просто сделать проверку в контроллере, в котором я отображаю отдельный ленд?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.09.2017, 19:40
Помогаю со студенческими работами здесь

Форма заказа с загрузкой файла и отправкой на электронную почту
Подскажите как сделать в коде что-бы прикрепляли файл и отправлялся на почту? Все остальное у меня работает, а вот с файлами не как не...

Форма заказа
Не мог бы мне кто нибудь объяснить (или сказать вообще возможно это?) как сделать форму заказа в ресторане, что бы зайдя в меню можно было...

Форма заказа
Доброго времени суток, форумчане. Можно Вас попросить сделать php для отправки данных на емейл. Есть хтмл. &lt;!DOCTYPE HTML PUBLIC...

Форма заказа
Помогите разобраться с кодами. Не работает форма заказа, т.е. при заполнение формы заказа, данные не отправляются на почту! Код...

Форма заказа
Добрый день, Уважаемые! Подскажите пожалуйста, возможна ли реализация данной задумки. Есть исходный лист &quot;База данных&quot;, там...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru