Помощник
|
куда делать сабмит формы |
Degradator
|
Сообщение
#1
|
||
|
|
||
|
|||
Arks |
25.3.2015, 23:32;
Ответить: Arks
Сообщение
#2
|
|
я вообще ничего не понял. Какой редирект, какой код обработчика. Что это вообще и зачем? Почему нельзя работать по http-стандартам? Методы запроса, коды ответа и т.п.?
|
|
|
Degradator
|
Сообщение
#3
|
|
Методы запроса, коды ответа Собственно это к вопросу вобще не относится никак. И в целом это подходит, если делаешь аяксовые формы, или если у тебя хелловорлд. Если форма это один блок из 20 других, которые есть на странице, то это все не очень катит. Есть серверный код, который формирует форму - определяет какие поля показывать, подставляет в эти поля данные (например, из поста если была отправка, но не прошла валидацию, или из базы данных, если это открыта форма для редактирования), помечает поля ошибками, если они не прошли валидацию. Вобщем-то это вьюха, но не совсем. Допустим, пользователь шлет какой-то коммент. После отправки формы, открывается страница, которую пользователь может обновить через f5. При таком обновлении, после поста формы, коммент добавляется второй раз. Для того, чтобы избежать повторной отправки формы, из кода, который обрабатывает сабмит формы, делается редирект. Вот этот код куда лучше засунуть? Туда же, где получаются данные для вьюхи? |
|
|
Den1xxx |
26.3.2015, 17:57;
Ответить: Den1xxx
Сообщение
#4
|
|
Стоит стараться ставить сабмит на обработчик, если нет другого выхода.
Если же делать сабмит на себя, то после сохранения делать хидден-поле и редирект. При перезагрузке скрипт поймёт, что сохранение уже было (по хидден-полю) и выведет сообщение что данные сохранены. |
|
|
Degradator
|
Сообщение
#5
|
|
Стоит стараться ставить сабмит на обработчик, если нет другого выхода. обычно выход есть то после сохранения делать хидден-поле и редирект. Не понимаю зачем это нужно, ведь редирект можно сделать с сервера, при помощи отправки заголовка. Просто меня напрягает, что если делать сабмит на обработчик, то сложно сделать красивую валидацию формы. Собсно, у меня только одна идея как сделать отображение ошибок в таком случае - сохранить ошибки в сессию, сделать редирект на новую отрисовку страницы, забрать данные из сессии, и очистить сессию. Но меня радует, что при помощи сабмита на обработчик гораздо проще понять куда данные ушли, и где там они обрабатываются. Все таки склоняюсь к тому, что надо делать сабмит на себя с каким-то уникальным полем которое будет показывать что за форму надо обрабатывать. |
|
|
Den1xxx |
26.3.2015, 23:34;
Ответить: Den1xxx
Сообщение
#6
|
|
то после сохранения делать хидден-поле и редирект. Не понимаю зачем это нужно, ведь редирект можно сделать с сервера, при помощи отправки заголовка. Чтобы после редиректа сервер мог ответить «Ваши настройки сохранены». Например в редирект подставить гет-параметр &result=success или fail Собсно, у меня только одна идея как сделать отображение ошибок в таком случае - сохранить ошибки в сессию, сделать редирект на новую отрисовку страницы, забрать данные из сессии, и очистить сессию. Физически это будет тормозить при большой посещаемости. |
|
|
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
|
Сообщение
#8
|
|
Аркс, я твой фанат. Честно. Я так люблю когда ты пишешь целую простыню текста, и при этом ничего нового не сообщаешь. Но в любом случае, спасибо, я тебя понял.
|
|
|
Den1xxx |
27.3.2015, 11:26;
Ответить: Den1xxx
Сообщение
#9
|
|
Всё это достаточно банальная фигня.
А вот был более интересный случай. На странице в 10 местах используется одинаковый код сабмита (отличается лишь value). Это добавление товаров в корзину. Но код в корзину добавляется из разных модулей. Если таких 3 модуля на странице, то товар может добавиться в корзину трижды. Пришлось делать в форме дополнительное рандом поле. И при добавлении его проверять и устанавливать флаг что добавлять уже не надо — для последующих скриптов. |
|
|
Degradator
|
Сообщение
#10
|
|
Я бы в таком случае сделал какое-то статическое поле, которое бы сигнализировало что товар добавлен, и выставлял его в тру после любой обработки.
|
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
В течении десяти лет копил деньги . Куда вложить? | 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 |
Текстовая версия | Сейчас: 28.3.2024, 16:29 |