| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Структура программы |
| Автор: Ripper 18.11.2011, 02:50 |
| Доброе время суток. Хотел посоветоваться с тем, как лучше организовать приложение, прежде чем его писать. Нужно сделать сайт, где пользователь сможет купить товар. Для этого ему нужно пройти несколько шагов, в последнем шаге формируется форма, которая отправляет пост-запрос на чужой сайт и на этом все заканчивается (практически). При этом нужно все красиво оформить, чтобы все подгружалось через аякс, окошки и формочки всплывали итп. Есть файл 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 в жквери наверно не хорошо, при подгрузке аякс страниц. |
| Автор: $дмитрий 18.11.2011, 05:12 |
| Тут главная проблема сохранять промежуточное состояние между формами Я это делал через input hidden, смотри http://автодоговор.рф/ |
| Автор: -=Ustas=- 18.11.2011, 11:09 |
| Если не важен например такой момент - когда пользователь например закрыл случайно браузер, то нужно вернуть его на тот шаг, на котором он прервал свое заполнение (редко когда кому-то нужно). Можно использовать такой вариант: Есть одна больша форма, разбиваем её на логические части и скрываем их. Начинаем показывать этого мастера с первой части и до N. Плюсы - нет проблем с сохранением промежуточных данных (пользователь может её заполнять хоть неделю), нет проблем с prev/next. |
| Автор: Ripper 18.11.2011, 14:00 | ||||
| Так, что-то я немного запутался) 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 18.11.2011, 14:58 |
| шаги 1-3 хранить в сессии. В момент отсылки письма все данные, используемые для оформления заказа нужно сериализовать (удобно, если все данные сидят в одной структуре/массиве) и записать в таблицу (hash PRIMARY, data TEXT, expired DATA) data - все данные в сериализованном виде expired - NOW + 2 дня на хранение данных. Периодически устаревшие данные нужно чистить. hash переслать в письме в составе ссылки-идентификации. К хашу удобно приписывать таймстамп, чтобы иметь возможность сказать юзеру, что его данные устарели 5 дней назад и были удалены... По этой ссылке восстанавливается информация о заполненном товаре, просто заполняя десериализованый элемент сессии. Можно сразу завести подобную строчку в базе и хранить в сессии только ее идентификатор. Ну или не в сессии, а в скрытых полях формы. В этом случае, появляется возможность оформлять параллельно несколько заказов в разных вкладках. |
| Автор: $дмитрий 18.11.2011, 15:21 |
| Логика работы интернет-магазина 1. Клиент формирует корзину, ID-шники товаров сохраняются в сессии 2. Нажимает "Оформить заказ", если он не авторизован вываливается форма авторизации, иначе форма регистрации + подтверждение мыло 4. Выбирает способ доставки и способ оплаты 5. Формируется заказ: в БД сохраняются данные о заказе + отчищается сессия корзины |
| Автор: -=Ustas=- 18.11.2011, 17:37 | ||
а что мешает это письмо швырнуть асинхронно, не перезагружая страницу? |
| Автор: SomeOneElse 19.11.2011, 15:20 |
| Мешает видимо то, что после того, как пошлётся запрос на почту нужно ждать ответа, и после этого только продолжать (у него там ещё один этап). Я ему уже посоветовал сделать последним этап валидации через эл-почту. Он хочет, чтобы можно было кнопочками назад возвращаться на предыдущие этапы. А при таком раскладе в середине запросить валидацию через e-mail не получится. Потому что попав на следующий после валидации этап вернуться на шаг назад это значит вернуться на этап до валидации а значит в последующем пройти её снова. Добавлено через 3 минуты и 30 секунд Зачем вообще нужны эти мучения с почтой? Это как один из видов борьбы с ботами (типа внесения капчи в процесс регистрации)? Имхо в магазине боты ничего плохого не могут сделать. Ну даже если они создадут 100 фиктивных заказов в сутки, которые не будут оплачены, они все просто удалятся (как предлагал ksnk) по тайм-ауту. Или есть другие причины? |
| Автор: Ripper 21.11.2011, 03:20 | ||||||
| В общем, решили без ссылки делать. Я посмотрел многие инет магазины, и удивился - но нигде не требовалось подтвердить регистрацию по ссылке. Во всяком случае из-за того что нужно быстрее сделать, я этот этап пока опускаю. Сделал так. Есть 5 шагов, между ними пользователь свободно ходит. Но только 5ый финальный, и после этого он назад уже вернуться не сможет. Мне просто хотелось бы советов по грамотному написанию кода, т.к. постоянно ощущение что все слишком криво. Есть index.php, где в начале вот такое:
Т.к. товара всего 3 и скорее всего это значение не будет изменено ближайшие N месяцев, то так. Но если было бы много товаров, то там бы стоял пустой массив типа ID -> count? И при нажатии на "в корзину" в $_SESSION["data"]["arrayOfGoods"] пушился бы элемент? Далее вот какой вопрос важный - элементы сессии заполняются скриптом который отвечает за следующий шаг? Т.е. в первом шаге я инициализирую все нулями. Далее я что-то там заполняю (у меня это кол-во товара, из тех трех товаров), жму далее и передаю скрипту (шаг 2) параметры в пост\ет запросе, а он далее заполняет переменные сессии, верно? На ум пришло написать такую ф-ию:
которая вызывается в начале каждого шага. AcceptableData - массив тех переменных которые участвуют в сессии. Т.е например если мне нужно передать инфу о пользователе, то я передаю в пост запросе переменные с заранее известными именами, ну и ф-ия все заполняет. Т.е. в начале каждого шага стоит
И так я дохожу до последнего шага собирая инфу. Далее я уже в каждом инпуте пишу value="<?=$_SESSION["data"]["fiz_name"]; ?>" например. И еще - это нормально смешивать JS и PHP, например, при переходе на какой то шаг, если юзер уже раньше выбрал свой тип (например юридическое лицо), то нужно показать один див, если нет то другой. И получается я пишу в JS что то вроде uType = <?=$_SESSION[...]; ?>. |