Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структура программы 
:(
    Опции темы
Ripper
Дата 18.11.2011, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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 в жквери наверно не хорошо, при подгрузке аякс страниц. 


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
$дмитрий
Дата 18.11.2011, 05:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 17
Всего: 45



Тут главная проблема сохранять промежуточное состояние между формами
Я это делал через input hidden, смотри пример
PM MAIL   Вверх
ksnk
Дата 18.11.2011, 09:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Чтобы послать на чужой сервер правильный запрос, нужно сформировать-уточнить у пользователя большой объем данных. Так как объем данных велик - ввод его выполняется в виде "мастера", состоящего из последовательных форм.

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

Так что хранить $_SESSION["step"] не имеет смысла. Имеет смысл хранит в сессии весь массив заполняемых данных в виде одной структуры. Шаг заполнения должен определяться самими формами. Кнопка "Next" ведет на следующую форму, Prev - на предыдущую. Сами формы заполняются, используя данные из структуры. Каждая форма заполняет свой кусочек этой структуры. Последняя форма мастера проверяет корректность всей структуры и оформляет финальный пост.

Цитата(Ripper @  18.11.2011,  02:50 Найти цитируемый пост)
В один момент нужно будет отправить пользователю на почту ссылку с подтверждением его мейла.

Нужно помнить, что почта может работать небыстро. Нужно расчитывать на задержку в несколько часов от момента посылки письма до реального получения его пользователем. Все это время висеть окошко оформления заказа не сможет и сессии так долго тоже не живут. Так что правильно будет на этапе подтверждения заказа куда-то сохранить введенные уже данные и по подтверждении - восстановить. Для восстановления обычно используются уникальные ссылки, которые пересылаются в письме.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
-=Ustas=-
Дата 18.11.2011, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Если не важен например такой момент - когда пользователь например закрыл случайно браузер, то нужно вернуть его на тот шаг, на котором он прервал свое заполнение (редко когда кому-то нужно). Можно использовать такой вариант:
Есть одна больша форма, разбиваем её на логические части и скрываем их. Начинаем показывать этого мастера с первой части и до N. Плюсы - нет проблем с сохранением промежуточных данных (пользователь может её заполнять хоть неделю), нет проблем с prev/next.


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Ripper
Дата 18.11.2011, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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=..., далее например в БД хранить его почту, хэш, введенные данные, и если для этой почты хэш верный, то вытащить из БД все данные? Как-то не так, не буду же я делать для каждого товара столбец) Ну, можно разбивать на таблицы, но все равно чувствую что бредsmile

Цитата

Есть одна больша форма, разбиваем её на логические части и скрываем их. Начинаем показывать этого мастера с первой части и до N. Плюсы - нет проблем с сохранением промежуточных данных (пользователь может её заполнять хоть неделю), нет проблем с prev/next. 

Т.е. сразу изначально загрузить всю форму и в зависимости от шага отображать нужные части? Я так и делал, пока не столкнулся с тем что в середине шагов должна отсылаться ссылка, ведь тогда пользователь перейдет на страницу, т.е. обновит её и все данные потруться.




--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
ksnk
Дата 18.11.2011, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



шаги 1-3 хранить в сессии. 
В момент отсылки письма все данные, используемые для оформления заказа нужно сериализовать (удобно, если все данные сидят в одной структуре/массиве) и записать в таблицу (hash PRIMARY, data TEXT, expired DATA)
data - все данные в сериализованном виде
expired - NOW + 2 дня на хранение данных. Периодически устаревшие данные нужно чистить.
hash переслать в письме в составе ссылки-идентификации. К хашу удобно приписывать таймстамп, чтобы иметь возможность сказать юзеру, что его данные устарели 5 дней назад и были удалены... По этой ссылке восстанавливается информация о заполненном товаре, просто заполняя десериализованый элемент сессии. 

Можно сразу завести подобную строчку в базе и хранить в сессии только ее идентификатор. Ну или не в сессии, а в скрытых полях формы. В этом случае, появляется возможность оформлять параллельно несколько заказов в разных вкладках.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
$дмитрий
Дата 18.11.2011, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 17
Всего: 45



Логика работы интернет-магазина
1. Клиент формирует корзину, ID-шники товаров сохраняются в сессии
2. Нажимает "Оформить заказ", если он не авторизован вываливается форма авторизации, иначе форма регистрации + подтверждение мыло
4. Выбирает способ доставки и способ оплаты
5. Формируется заказ: в БД сохраняются данные о заказе + отчищается сессия корзины
PM MAIL   Вверх
-=Ustas=-
Дата 18.11.2011, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Цитата(Ripper @  18.11.2011,  14:00 Найти цитируемый пост)
Т.е. сразу изначально загрузить всю форму и в зависимости от шага отображать нужные части? Я так и делал, пока не столкнулся с тем что в середине шагов должна отсылаться ссылка, ведь тогда пользователь перейдет на страницу, т.е. обновит её и все данные потруться.

а что мешает это письмо швырнуть асинхронно, не перезагружая страницу?


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
SomeOneElse
Дата 19.11.2011, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 19.11.2011

Репутация: нет
Всего: нет



Мешает видимо то, что после того, как пошлётся запрос на почту нужно ждать ответа, и после этого только продолжать (у него там ещё один этап). Я ему уже посоветовал сделать последним этап валидации через эл-почту.

Он хочет, чтобы можно было кнопочками назад возвращаться на предыдущие этапы. А при таком раскладе в середине запросить валидацию через e-mail не получится. Потому что попав на следующий после валидации этап вернуться на шаг назад это значит вернуться на этап до валидации а значит в последующем пройти её снова.

Добавлено через 3 минуты и 30 секунд
Зачем вообще нужны эти мучения с почтой? Это как один из видов борьбы с ботами (типа внесения капчи в процесс регистрации)?

Имхо в магазине боты ничего плохого не могут сделать. Ну даже если они создадут 100 фиктивных заказов в сутки, которые не будут оплачены, они все просто удалятся (как предлагал ksnk) по тайм-ауту.

Или есть другие причины?

Это сообщение отредактировал(а) SomeOneElse - 19.11.2011, 15:21
PM MAIL   Вверх
Ripper
Дата 21.11.2011, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: 1
Всего: 23



В общем, решили без ссылки делать. Я посмотрел многие инет магазины, и удивился - но нигде не требовалось подтвердить регистрацию по ссылке. Во всяком случае из-за того что нужно быстрее сделать, я этот этап пока опускаю.
Сделал так. Есть 5 шагов, между ними пользователь свободно ходит. Но только 5ый финальный, и после этого он назад уже вернуться не сможет.
Мне просто хотелось бы советов по грамотному написанию кода, т.к. постоянно ощущение что все слишком криво.
Есть index.php, где в начале вот такое:
Код

    session_start();
    
    $data = array (
        "good1" => 0,
        "good2" => 0,
        "good3" => 0,
        "totalSum" => 0,
        "user_type" => 0,
        "fiz_name" => "", //Поля для физ лица
        "fiz_mail" => "",
        "ur_inn" => "", //Тут пока нет полей, типа показать что еще для юр лица будут
        "ur_kpp" => "",
        "payment_type" => 0, //Способ оплаты
        "agree" => 0 // Подтверджение лицензионного соглашения
    );
    
    $_SESSION["data"] = $data;    


Т.к. товара всего 3 и скорее всего это значение не будет изменено ближайшие N месяцев, то так. Но если было бы много товаров, то там бы стоял пустой массив типа ID -> count? И при нажатии на "в корзину" в $_SESSION["data"]["arrayOfGoods"] пушился бы элемент?

Далее вот какой вопрос важный - элементы сессии заполняются скриптом который отвечает за следующий шаг? Т.е. в первом шаге я инициализирую все нулями. Далее я что-то там заполняю (у меня это кол-во товара, из тех трех товаров), жму далее и передаю скрипту (шаг 2) параметры в пост\ет запросе, а он далее заполняет переменные сессии, верно? На ум пришло написать такую ф-ию:
Код

    function parsePost() {
        global $acceptableData;
        foreach ($_POST as $k=>$v) { 
            if (in_array($k, $acceptableData)) {
                $_SESSION["data"][$k] = $v;
            }
        }
    }

которая вызывается в начале каждого шага. AcceptableData - массив тех переменных которые участвуют в сессии. Т.е например если мне нужно передать инфу о пользователе, то я передаю в пост запросе переменные с заранее известными именами, ну и ф-ия все заполняет.  Т.е. в начале каждого шага стоит 
Код

    session_start();
    parsePost();


И так я дохожу до последнего шага собирая инфу.

Далее я уже в каждом инпуте пишу value="<?=$_SESSION["data"]["fiz_name"]; ?>" например.

И еще - это нормально смешивать JS и PHP, например, при переходе на какой то шаг, если юзер уже раньше выбрал свой тип (например юридическое лицо), то нужно показать один див, если нет то другой. И получается я пишу в JS что то вроде uType = <?=$_SESSION[...]; ?>.




--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.