![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
Ripper |
|
|||
![]() Lonely soul... ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 30.6.2004 Где: г. Москва Репутация: 1 Всего: 23 |
Доброе время суток.
Хотел посоветоваться с тем, как лучше организовать приложение, прежде чем его писать. Нужно сделать сайт, где пользователь сможет купить товар. Для этого ему нужно пройти несколько шагов, в последнем шаге формируется форма, которая отправляет пост-запрос на чужой сайт и на этом все заканчивается (практически). При этом нужно все красиво оформить, чтобы все подгружалось через аякс, окошки и формочки всплывали итп. Есть файл index.php, в котором собственно все отображается. В нем я хочу сделать див, в который бы подгружалось оформление очередного шага (ну т.е. внешний файл с инфой). Подгружаю с помощью jquery. Сначала при заходе на главную страницу регистрируется сессия, и там я храню переменную step = 1, после чего подгружаю в див файл step1.php, где проверяю $_SESSION["step"]==1, иначе die; Далее, по кнопке перехожу на след. шаг, т.е. подгружаю step2.php, там проверяю, если $_SESSION["step"]==1 то устанавливаю её в 2 и вывожу инфу. И так далее. В один момент нужно будет отправить пользователю на почту ссылку с подтверждением его мейла. Ссылка содержит хэш, и переходит на Index.php?hash=..., в этом случае я проверяю $_GET["hash"] && $_SESSION["step"] == нужному_шагу, если это выполняется, делаю запрос к скрипту который проверит хэш и выдаст р-т который я опять же обработаю на index.php через Jquery. Но что-то мне кажется что это все бред и так не делают, каждый раз возникают новые вопросы о том как поддерживать структуру и т.п. Например, куча методов live в жквери наверно не хорошо, при подгрузке аякс страниц. -------------------- "Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом |
|||
|
||||
$дмитрий |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1037 Регистрация: 19.6.2004 Репутация: 17 Всего: 45 |
Тут главная проблема сохранять промежуточное состояние между формами
Я это делал через input hidden, смотри пример |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Чтобы послать на чужой сервер правильный запрос, нужно сформировать-уточнить у пользователя большой объем данных. Так как объем данных велик - ввод его выполняется в виде "мастера", состоящего из последовательных форм.
Обычно, такие формы содержат кнопки "вперед-назад", которые позволяют юзеру вернутся к предыдущим данным и уточнить их. Никто не помешает юзеру открыть несколько форм "мастера" в разных вкладках браузера и остановить их оформление на разных этапах. Так что хранить $_SESSION["step"] не имеет смысла. Имеет смысл хранит в сессии весь массив заполняемых данных в виде одной структуры. Шаг заполнения должен определяться самими формами. Кнопка "Next" ведет на следующую форму, Prev - на предыдущую. Сами формы заполняются, используя данные из структуры. Каждая форма заполняет свой кусочек этой структуры. Последняя форма мастера проверяет корректность всей структуры и оформляет финальный пост.
Нужно помнить, что почта может работать небыстро. Нужно расчитывать на задержку в несколько часов от момента посылки письма до реального получения его пользователем. Все это время висеть окошко оформления заказа не сможет и сессии так долго тоже не живут. Так что правильно будет на этапе подтверждения заказа куда-то сохранить введенные уже данные и по подтверждении - восстановить. Для восстановления обычно используются уникальные ссылки, которые пересылаются в письме. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
-=Ustas=- |
|
|||
![]() Ustix IT Group ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2222 Регистрация: 21.1.2005 Где: Краснодар Репутация: 32 Всего: 69 |
Если не важен например такой момент - когда пользователь например закрыл случайно браузер, то нужно вернуть его на тот шаг, на котором он прервал свое заполнение (редко когда кому-то нужно). Можно использовать такой вариант:
Есть одна больша форма, разбиваем её на логические части и скрываем их. Начинаем показывать этого мастера с первой части и до N. Плюсы - нет проблем с сохранением промежуточных данных (пользователь может её заполнять хоть неделю), нет проблем с prev/next. -------------------- В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм. ----- |
|||
|
||||
Ripper |
|
||||
![]() Lonely soul... ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 30.6.2004 Где: г. Москва Репутация: 1 Всего: 23 |
Так, что-то я немного запутался)
1. Заходим в index.php который стартует сессию. А, вот еще - здесь нужно какую-нибудь переменную продефайнить, и проверять её в подгружаемых файлах, чтобы на них нельзя было напрямую зайти, да? (А в самих файлах проверять определена ли такая переменная). Здесь же проверяем, если установлены какие то переменные сессии и они не нулевые, то заполняем форму с этими значениями, т.о. на какое-то время последние введенные значения будут сохранятся в формах. 2. Подгружаем файл step1.php в див, в котором есть форма, или даже не обязательно <form>, можно через jQuery все данные передать по клику на кнопку, ну не важно в общем. 3. Файлу step2.php передаются заполненные параметры, например в виде гет-запроса, и он в переменные сессии вгоняет их. Но далее меня смущает момент со ссылкой. Я тогда приведу полную последовательность шагов, чтобы было понятно как хотят чтобы было устроено все: 1. Шаг 1 - пользователь выбирает нужный товар и кол-во 2. Шаг 2 - пользователь выбирает физ или юр лицо. Сейчас акцент на то что пока только физ. 3. Шаг 3 - пользователю пишут "На почту выслана ссылка для подтверждения почты". Причем физ лицо не регистрируется, а просто подтверждает свою почту (юр лицо будет регистрироваться) 4. Пользователь кликает на ссылку в почте и попадает на шаг 4, где он выбирает нужный способ оплаты, и по клику формируется финальный пост запрос. Меня смущает шаг 3. Т.е. например пользователь кликнул по ссылке на почту, а потом вдруг нажал шаг назад. Хранить какой то флаг $_SESSION["MailAlreadySent"] и в зависимости от этого пропускать шаг? Или даже 2 шага, один - то что письмо послано, другой - то что подтверждено. В случае если не подтверждено, то показать "Отправить ссылку еще раз".
А где хранить? Ну например, срок сессии истек, пользователю пришла ссылка, он кликает, попадает на index.php?hash=..., далее например в БД хранить его почту, хэш, введенные данные, и если для этой почты хэш верный, то вытащить из БД все данные? Как-то не так, не буду же я делать для каждого товара столбец) Ну, можно разбивать на таблицы, но все равно чувствую что бред ![]()
Т.е. сразу изначально загрузить всю форму и в зависимости от шага отображать нужные части? Я так и делал, пока не столкнулся с тем что в середине шагов должна отсылаться ссылка, ведь тогда пользователь перейдет на страницу, т.е. обновит её и все данные потруться. -------------------- "Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом |
||||
|
|||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
шаги 1-3 хранить в сессии.
В момент отсылки письма все данные, используемые для оформления заказа нужно сериализовать (удобно, если все данные сидят в одной структуре/массиве) и записать в таблицу (hash PRIMARY, data TEXT, expired DATA) data - все данные в сериализованном виде expired - NOW + 2 дня на хранение данных. Периодически устаревшие данные нужно чистить. hash переслать в письме в составе ссылки-идентификации. К хашу удобно приписывать таймстамп, чтобы иметь возможность сказать юзеру, что его данные устарели 5 дней назад и были удалены... По этой ссылке восстанавливается информация о заполненном товаре, просто заполняя десериализованый элемент сессии. Можно сразу завести подобную строчку в базе и хранить в сессии только ее идентификатор. Ну или не в сессии, а в скрытых полях формы. В этом случае, появляется возможность оформлять параллельно несколько заказов в разных вкладках. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
$дмитрий |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1037 Регистрация: 19.6.2004 Репутация: 17 Всего: 45 |
Логика работы интернет-магазина
1. Клиент формирует корзину, ID-шники товаров сохраняются в сессии 2. Нажимает "Оформить заказ", если он не авторизован вываливается форма авторизации, иначе форма регистрации + подтверждение мыло 4. Выбирает способ доставки и способ оплаты 5. Формируется заказ: в БД сохраняются данные о заказе + отчищается сессия корзины |
|||
|
||||
-=Ustas=- |
|
|||
![]() Ustix IT Group ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2222 Регистрация: 21.1.2005 Где: Краснодар Репутация: 32 Всего: 69 |
а что мешает это письмо швырнуть асинхронно, не перезагружая страницу? -------------------- В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм. ----- |
|||
|
||||
SomeOneElse |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 19.11.2011 Репутация: нет Всего: нет |
Мешает видимо то, что после того, как пошлётся запрос на почту нужно ждать ответа, и после этого только продолжать (у него там ещё один этап). Я ему уже посоветовал сделать последним этап валидации через эл-почту.
Он хочет, чтобы можно было кнопочками назад возвращаться на предыдущие этапы. А при таком раскладе в середине запросить валидацию через e-mail не получится. Потому что попав на следующий после валидации этап вернуться на шаг назад это значит вернуться на этап до валидации а значит в последующем пройти её снова. Добавлено через 3 минуты и 30 секунд Зачем вообще нужны эти мучения с почтой? Это как один из видов борьбы с ботами (типа внесения капчи в процесс регистрации)? Имхо в магазине боты ничего плохого не могут сделать. Ну даже если они создадут 100 фиктивных заказов в сутки, которые не будут оплачены, они все просто удалятся (как предлагал ksnk) по тайм-ауту. Или есть другие причины? Это сообщение отредактировал(а) SomeOneElse - 19.11.2011, 15:21 |
|||
|
||||
Ripper |
|
||||||
![]() Lonely soul... ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 30.6.2004 Где: г. Москва Репутация: 1 Всего: 23 |
В общем, решили без ссылки делать. Я посмотрел многие инет магазины, и удивился - но нигде не требовалось подтвердить регистрацию по ссылке. Во всяком случае из-за того что нужно быстрее сделать, я этот этап пока опускаю.
Сделал так. Есть 5 шагов, между ними пользователь свободно ходит. Но только 5ый финальный, и после этого он назад уже вернуться не сможет. Мне просто хотелось бы советов по грамотному написанию кода, т.к. постоянно ощущение что все слишком криво. Есть index.php, где в начале вот такое:
Т.к. товара всего 3 и скорее всего это значение не будет изменено ближайшие N месяцев, то так. Но если было бы много товаров, то там бы стоял пустой массив типа ID -> count? И при нажатии на "в корзину" в $_SESSION["data"]["arrayOfGoods"] пушился бы элемент? Далее вот какой вопрос важный - элементы сессии заполняются скриптом который отвечает за следующий шаг? Т.е. в первом шаге я инициализирую все нулями. Далее я что-то там заполняю (у меня это кол-во товара, из тех трех товаров), жму далее и передаю скрипту (шаг 2) параметры в пост\ет запросе, а он далее заполняет переменные сессии, верно? На ум пришло написать такую ф-ию:
которая вызывается в начале каждого шага. AcceptableData - массив тех переменных которые участвуют в сессии. Т.е например если мне нужно передать инфу о пользователе, то я передаю в пост запросе переменные с заранее известными именами, ну и ф-ия все заполняет. Т.е. в начале каждого шага стоит
И так я дохожу до последнего шага собирая инфу. Далее я уже в каждом инпуте пишу value="<?=$_SESSION["data"]["fiz_name"]; ?>" например. И еще - это нормально смешивать JS и PHP, например, при переходе на какой то шаг, если юзер уже раньше выбрал свой тип (например юридическое лицо), то нужно показать один див, если нет то другой. И получается я пишу в JS что то вроде uType = <?=$_SESSION[...]; ?>. -------------------- "Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |