Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: "Версия для печати"
Форумы портала PHP.SU » PHP » Программирование на PHP » "Версия для печати"

Страниц (1): [1]
 

1. Eihwaz - 01 Января, 2008 - 01:31:49 - перейти к сообщению
Здравствуйте!
Всех с Новым Годом! Счастья и удачи во всех ваших начинаниях!
Вынужден омрачить свое поздравление вопросом Улыбка
Ситуация следующая:
Дописываю интернет-магазин. Есть два метода оплаты — безналичный рачет и наличными. Если пользователь выбирает безналичный расчет, то он, после оформления заказа видит кроме страницы с обычной "рыбой", вроде "Спасибо за ваш заказ", счет-фактуру, где перечислены заказанные им товары, их общая стоимость, НДС и так далее. На этой же странице удаляется сессия с ID заказа, чтобы при нажатии "Назад" в браузере пользователь ненароком не сделал еще один заказ. Все ничего, но для эстетизьму хотелось бы сделать клиенту нормальную версию для печати этого счета, т.е., без дизайна страницы.
Посоветуйте, как можно реализовать подобное, не дав пользователю сделать повторный заказ, но при этом отобразить его счет?
Насчет записи счета в файл до удаления сессии и отображения его при нажатии на ссылку на странице со "Спасибо за ваш заказ" — это я в правильную сторону думаю?
2. evgenijj - 01 Января, 2008 - 12:32:09 - перейти к сообщению
Погоди, для того, чтобы не дать пользователю еще раз сделать заказ (нажав кнопку "Назад" или "Refresh") ты должен делать редирект.
Т.е. пользователь заполнил форму и нажал кнопку "Оформить заказ". Обработчик формы проверяет, правильно ли заполнены поля формы. Если поля заполнены правильно, то мы делаем редирект на страницу, где выводим ему собщение "Спасибо за ваш заказ". Если форма заполнена неправильно, мы должны повторно предъявить ему форму, уже заполненную введенными пользователем данными (не заставлять же его еще раз заполнять форму?) и сообщением об ошибке. Сообщение об ошибке должно содержать описание того, какие обязательные поля не заполнены или заполнены неправильно. При этом все заполненные пользователем поля и сообщение об ошибке мы сохраняем в сессии. После повторного предъявления формы с сообщением об ошибке мы удаляем переменные сессии.
PHP:
скопировать код в буфер обмена
  1.  
  2. if ( поля формы заполнена правильно ) {
  3.   $_SESSION['success']['name'] = $name;
  4.   $_SESSION['success']['email'] = $email;
  5.   .............................................................
  6.   header( 'Location: success.php' );
  7.   die();
  8. } else {
  9.   $_SESSION['formOrder'] = array();
  10.   $_SESSION['formOrder']['error'] = 'При заполнении формы были допущены ошибки:'.$error;
  11.   $_SESSION['formOrder']['name'] = $name;
  12.   $_SESSION['formOrder']['email'] = $email;
  13.   ..............................................................
  14.   header( 'Location: formOrder.php' );
  15.   die();
  16. }
  17.  

Более подробно о том, как правильно обработать форму, можно почитать здесь
Обработка ошибочного заполнения формы
В твоем случае, если форма заполнена правильно, страница success.php удаляет заказ пользователя из сессии или таблицы БД (я не знаю, где храниться корзина) и выдает сообщение "Спасибо за ваш заказ". При этом, если был выбран безналичный рассчет (а об этом ты узнаешь из массива $_SESSION['success']) выдаешь это сообщение на чистой странице (для печати) и ниже - счет-фактуру и пр.

Примерно так.
3. Eihwaz - 01 Января, 2008 - 13:51:43 - перейти к сообщению
Хм... "Чем больше я знаю, тем меньше я знаю" Улыбка Спасибо за ссылку — очевидная, вобщем, штука, и так будет "солиднее", чем алерты (сейчас валидация полей на яве), но это не совсем то:
Получается так: на этапе оформления заказа в массиве S_SESSION есть ID заказа пользователя. Сам заказ хранится в таблице до тех пор, пока не будет окончательно оформлен, и удаляется оттуда, если пользователь передумал отовариваться (по удалению сессии или по тайм-ауту) или остается там, если пользователь таки оформляет заказ. После нажатия кнопки, мол, "введенные данные подтверждаю", он видит страницу с благодарностью за заказ, на которой происходит следующее:
Генерируется счет фактура, товары выбираются из таблицы заказов по ID из массива S_SESSION, после чего сессия удаляется. На предыдущей странице стоит проверка — пришел ID заказа из сессии, или нет, и если его нету, то пользователя редиректит на главную страницу. Т.е., на этом этапе все нормально и работает так, как нужно (хотя за ссылку с людской обработкой формы все-равно спасибо).
Задача стоит открыть счет отдельно от страницы с благодарностями, или просто дать ссылку на него. Т.е., на каком-то более раннем этапе сгенерировать этот счет, видимо... Бог его знает, я уже сам путаюсь Улыбка Вобщем, нужно дать пользователю возможность распечатать счет-фактуру без шапки и "подвала" самого магазина. Вы просто скажите, в какую сторону думать, я разберусь.
P.S.: Может быть путанно объясняю, прошу прощения — сами видите, как Новый Год встречаю, вторые сутки на ногах Улыбка
4. evgenijj - 01 Января, 2008 - 14:10:14 - перейти к сообщению
Так, а кто нам мешает разместить на странице с сообщением "Спасибо за покупку" ссылку "Версия для печати"? Переменная сесии, где хранится ID заказа ( $_SESSION['orderID'] ) у нас уже удалена. А она нам понадобиться для того чтобы сформировать счет-фактуру. Может быть, нам понадобятся и еще кое-какая информация о покупателе (имя, телефон, e-mail). Но ведь перед удалением переменной сесии, где хранится ID заказа, мы можем ее сохранить в другой переменной сессии (и всю другую нужную нам информацию). Пусть, для определенности, это будет $_SESSION['orderComplete']
PHP:
скопировать код в буфер обмена
  1.  
  2. $_SESSION['orderComplete']['id'] =  $_SESSION['orderID'];
  3. $_SESSION['orderComplete']['name'] =  $name;
  4. $_SESSION['orderComplete']['phone'] =  $phone;
  5. $_SESSION['orderComplete']['mail'] =  $mail;
  6.  
  7. unset ( $_SESSION['orderID'] );
  8.  

В этом случае мы будем знать, что если переменная сессии $_SESSION['orderID'] не определена, но при этом определена другая переменная $_SESSION['orderComplete'] значит, покупатель оформил заказ, но может возникнуть необходимость предьявить ему "страницу для печать". И если он затребует эту страницу, то там мы и удалим переменную $_SESSION['orderComplete'] потому как нам она больше не нужна.
PHP:
скопировать код в буфер обмена
  1.  
  2. if ( !isset ( $_SESSION['orderID'] ) and isset ( $_SESSION['orderComplete'] ) )
  3.   echo '<a href="...">Версия для печати</a>';
  4.  

Вообще, вариантов тут может быть множество.
5. Eihwaz - 01 Января, 2008 - 14:18:12 - перейти к сообщению
evgenijj пишет:
Так, а кто нам мешает разместить на странице с сообщением "Спасибо за покупку" ссылку "Версия для печати"?

Никто не мешает... Хы, вот это я затупил Улыбка))
Спасибо! Улыбка

 

Powered by ExBB FM 1.0 RC1