X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> куда делать сабмит формы
на себя или на обработчик
на себя или на обработчик
на себя [ 1 ] ** [50,00%]
на обработчик [ 1 ] ** [50,00%]
Всего голосов: 2
  
Degradator
Degradator
Topic Starter сообщение 24.3.2015, 15:53; Ответить: Degradator
Сообщение #1


Добрый день, куда лучше делать сабмит формы - на себя, или на какой-то контроллер?

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

на обработчик
- в форму нужно подсунуть уникальный идентификатор формы, потому что имея один уникальный action будет проблема с загруженными файлами, при их загрузке с разных вкладок браузера
+ получение данных формы отделено от сохранения данных
- неудобно реализовывать отображение ошибок
+ страница генерируется всегда один раз + обработчик формы
- при повторном встраивании формы на других страницах, нужно лезть в код обработчика чтобы починить редирект

Кто что думает?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 25.3.2015, 23:32; Ответить: Arks
Сообщение #2


я вообще ничего не понял. Какой редирект, какой код обработчика. Что это вообще и зачем? Почему нельзя работать по http-стандартам? Методы запроса, коды ответа и т.п.?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Degradator
Degradator
Topic Starter сообщение 26.3.2015, 12:43; Ответить: Degradator
Сообщение #3


(Arks @ 26.3.2015, 01:32) *
Методы запроса, коды ответа

Собственно это к вопросу вобще не относится никак. И в целом это подходит, если делаешь аяксовые формы, или если у тебя хелловорлд. Если форма это один блок из 20 других, которые есть на странице, то это все не очень катит.

Есть серверный код, который формирует форму - определяет какие поля показывать, подставляет в эти поля данные (например, из поста если была отправка, но не прошла валидацию, или из базы данных, если это открыта форма для редактирования), помечает поля ошибками, если они не прошли валидацию. Вобщем-то это вьюха, но не совсем.

Допустим, пользователь шлет какой-то коммент. После отправки формы, открывается страница, которую пользователь может обновить через f5. При таком обновлении, после поста формы, коммент добавляется второй раз. Для того, чтобы избежать повторной отправки формы, из кода, который обрабатывает сабмит формы, делается редирект. Вот этот код куда лучше засунуть? Туда же, где получаются данные для вьюхи?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Den1xxx
Den1xxx
сообщение 26.3.2015, 17:57; Ответить: Den1xxx
Сообщение #4


Стоит стараться ставить сабмит на обработчик, если нет другого выхода.
Если же делать сабмит на себя, то после сохранения делать хидден-поле и редирект.
При перезагрузке скрипт поймёт, что сохранение уже было (по хидден-полю) и выведет сообщение что данные сохранены.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Degradator
Degradator
Topic Starter сообщение 26.3.2015, 19:44; Ответить: Degradator
Сообщение #5


(Den1xxx @ 26.3.2015, 19:57) *
Стоит стараться ставить сабмит на обработчик, если нет другого выхода.

обычно выход есть

(Den1xxx @ 26.3.2015, 19:57) *
то после сохранения делать хидден-поле и редирект.

Не понимаю зачем это нужно, ведь редирект можно сделать с сервера, при помощи отправки заголовка.

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

Все таки склоняюсь к тому, что надо делать сабмит на себя с каким-то уникальным полем которое будет показывать что за форму надо обрабатывать.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Den1xxx
Den1xxx
сообщение 26.3.2015, 23:34; Ответить: Den1xxx
Сообщение #6


(Degradator @ 26.3.2015, 21:44) *
то после сохранения делать хидден-поле и редирект.
Не понимаю зачем это нужно, ведь редирект можно сделать с сервера, при помощи отправки заголовка.

Чтобы после редиректа сервер мог ответить «Ваши настройки сохранены».
Например в редирект подставить гет-параметр &result=success или fail

(Degradator @ 26.3.2015, 21:44) *
Собсно, у меня только одна идея как сделать отображение ошибок в таком случае - сохранить ошибки в сессию, сделать редирект на новую отрисовку страницы, забрать данные из сессии, и очистить сессию.

Физически это будет тормозить при большой посещаемости.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 27.3.2015, 1:56; Ответить: Arks
Сообщение #7


и почему методы http нельзя использовать и это не относится к вопросу?

приведу 2 use-case:
1. форма сабмитится на тот же адрес который ее рисует.
Проверяется - если пользователь пришел через GET то значит нужно нарисовать форму. Если пользователь пришел через POST - то возможно он при этом заполнил форму(если нет то можно сделать редирект).
В этом случае если форма заполнена корректно - то надо обработать результат и сделать редирект. Если форма заполнена некорректно - то надо нарисовать все ту же форму и показать ошибки. Ключевая разница: В этом случае если пользователь нажмет F5 то ему опять отобразится та же форма и ошибки, но если он перейдет по адресу(не нажмет F5 а жмакнет ENTER в адресной строке) то ему просто нарисуется "чистая" форма.
2. форма сабмитится на другой адрес.
Проверяется - если пользователь пришел через GET то очевидно это некорректное поведение. Если пользователь пришел через POST - то возможно он при этом заполнил форму(если нет то можно сделать редирект на адрес отрисовки формы - еще подумав где этот самы адрес). Если форма заполнена некорректно - то надо нарисовать все ту же форму и показать ошибки (еще подумав где этот код который рисует форму). Ключевая разница - если пользователь нажмет F5 то ему опять отобразится та же форма и ошибки, но если он перейдет по адресу то он получит полный фейл(очевидно отдельный адрес сабмита не обрабатывает GET).

Отсюда вопрос - если есть место в коде которое рисует форму - какой смысл разносить его по разным url'ам и заботиться о редиректах - когда это один и тот же код просто http-методы разные(чистая форма - GET, гипотетически отправленная - POST).
Теперь вопрос при чем тут http-методы и коды ответов(редирект в частности) я надеюсь снят?

Насчет форм и ajax вопрос простой - форма предполагает логику определения засабмичена она или нет. Все хорошо когда это helloworld или там одна форма на странице - а если на странице форм скажем 5? Без ajax придется для каждой определять заполнена она или нет и логику поведения? Заново инициализировать все формы, все поля и т.п. - зачем это нужно? Так что вопрос какой-то сильно устаревший. Используйте ajax - и не занимайтесь ерундой с синхронным сабмитом форм!
Это справедливо больше для сервера чем для клиента. В случае синхронного запроса - редирект при успешной отправке формы пришлет сервер. В случае асинхронного - клиент дождется ответа. Но очевидно что формы могут не пройти валидацию - и каждый раз на сервере инициализировать всю страницу ради маленькой ошибки в одной из этих 5 форм - не бред ли?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Degradator
Degradator
Topic Starter сообщение 27.3.2015, 11:02; Ответить: Degradator
Сообщение #8


Аркс, я твой фанат. Честно. Я так люблю когда ты пишешь целую простыню текста, и при этом ничего нового не сообщаешь. Но в любом случае, спасибо, я тебя понял.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Den1xxx
Den1xxx
сообщение 27.3.2015, 11:26; Ответить: Den1xxx
Сообщение #9


Всё это достаточно банальная фигня.
А вот был более интересный случай.
На странице в 10 местах используется одинаковый код сабмита (отличается лишь value).
Это добавление товаров в корзину. Но код в корзину добавляется из разных модулей.
Если таких 3 модуля на странице, то товар может добавиться в корзину трижды.
Пришлось делать в форме дополнительное рандом поле.
И при добавлении его проверять и устанавливать флаг что добавлять уже не надо — для последующих скриптов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Degradator
Degradator
Topic Starter сообщение 27.3.2015, 12:24; Ответить: Degradator
Сообщение #10


Я бы в таком случае сделал какое-то статическое поле, которое бы сигнализировало что товар добавлен, и выставлял его в тру после любой обработки.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) В течении десяти лет копил деньги . Куда вложить?
8 kapusta1 763 26.3.2024, 21:50
автор: kapusta1
Открытая тема (нет новых ответов) Куда напрямую лить Кликандер и Попандер трафик?
9 Boymaster 3532 7.9.2022, 9:35
автор: MKOLL
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыРассылка ваших сообщений в контакт формы!
3 dizaynmaks 1681 18.4.2022, 9:04
автор: dizaynmaks
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыВы мне код, я вам как - делать не надо.
0 fedornabilkin 941 18.9.2020, 18:59
автор: fedornabilkin
Открытая тема (нет новых ответов) Куда уйти с Rotaban?
19 Tactic 5506 18.9.2020, 18:06
автор: dulesov


 



RSS Текстовая версия Сейчас: 28.3.2024, 16:29
Дизайн