Интернет - справочник для веб-мастеров
   
     
 
 
php, javascript,ajax,mysql,TIGER CMS
  Для начинающих
php, javascript,ajax,mysql,TIGER CMS
  Общие
php, javascript,ajax,mysql,TIGER CMS
  Безопасность
php, javascript,ajax,mysql,TIGER CMS
  Интересное
php, javascript,ajax,mysql,TIGER CMS
  Новости PHP
php, javascript,ajax,mysql,TIGER CMS
  PHP + AJAX
php, javascript,ajax,mysql,TIGER CMS
  JavaScript
php, javascript,ajax,mysql,TIGER CMS
  Дизайн
php, javascript,ajax,mysql,TIGER CMS
  Раскрутка
php, javascript,ajax,mysql,TIGER CMS
  Заработок
php, javascript,ajax,mysql,TIGER CMS
  Советы

   
 

   
 
 
1. Рейтинг сайтов


 
 
  Всего статей: 405
  Опубликовано: 405
  Проверяються: 0
  Добавлено сегодня: 0
-------------------------------------
  Прочитано статей: 405
  Всего прочтений: 634637
-------------------------------------
  Сейчас читают: 5 чел.


 

PHP. Пишем Интернет магазин. [Версия для печати]
Разместил: admin . Раздел: Интересное. Опубликовано: 07-25-2007 22:18:04

Это так называемый виртуальный магазин, т.е. прайс лист некой организации с наименованием товаров, часть из которых можно пометить и занести в корзину, чтобы в дальнейшем можно было заполнить анкету (ФИО, адрес и т.д.) для покупки этих товаров. Дизайна нет никакого, только код т.е. алгоритм работы.

Требования: где ЭТО будет работать?

На win/unix в PHP версии не ниже 4.0 с поддержкой сессий. Включение cookies от поcетителей не требуется, нужно лишь правильно настроить некоторые опции PHP, чтобы программа получила доступ к сессиям (будет написано ниже).

Возможные проблемы:

 

  • Возможный глюк: у Вас не настроен временный каталог на сервере для размещения временных файлов.
  • Программа подразумевает, что PHP поместит в переменную $SID номер сесии. По умолчанию, возможно, этого не произойдет.

     

    Для решения вышеуказанных проблем, необходимо изменить опции PHP. Это можно сделать в php.ini или файлах httpd.conf/.htaccess

    Изменение php.ini:

    Если корректировать php.ini, следует учесть, что в нем уже есть те переменные, которые необходимо изменить.

  • ищем строку session.save_path и пишем путь к своему временному каталогу. В этот каталог Apache/PHP будут писать свои файлы, следовательно для них там должен быть доступ. Если у вас Unix, то пишем /tmp, если Windows, то emp (не забудьте создать C:TEMP или X:TEMP, смотря где находится Apache)
  • ищем строку session.name и заменяем на SID (все большими буквами).

    Второй вариант:.htaccess или httpd.conf

    Если вносить те же измения в указанные файлы, то следует написать так:

  • вариант для unix: php_value session.save_path /tmp и для windows: php_value session.save_path emp
  • и имя сессии: php_value session.name SID

    Настройка каталога.

  • создать файл shop.txt. по образцу. Если Вы захотите добавить новые колонки, то не забудьте, что первой колонкой должны идти ID товаров (например числа от 1 до ..), а последней - цена товара. Разделитель товаров - слеш ().
  • создать файл shop.phtml (имя не принципиально), код программы приведен ниже.

    Код скрипта:

    <?php

    // символы "<?" должны быть первыми(!) в файле. Т.е. ни пустых строк, ни
    // пробелов до символов "<?" ставить нельзя, иначе не будет работать
    // header - появятся warning'и

    unset($t);
    session_start();


    /*
       функция прибавляет в корзину новый товар, где $n - это номер строки
       в shop.txt. Далее, в сессиях сохраняется не номер строки, а число ID
       из shop.txt и используется повсеместно. Если товар уже существует,
       то корзина никак не меняется.
    */
    function tadd($n) {
       global $t;

       // открыли файл
       $f=file("./shop.txt") or die("файл не найден");
       // и получили нужную строку с товаром (в массив $o)
       $o=explode("\",$f[$n]);

       $id=$o[0];
       if (isset($t[all][$id])) return; // если товар уже в корзине - выход

       $t[all][$id]=$id;    // флаг, благодаря которому, двумя строчками выше
                            // мы определили, что товар уже есть в корзине
       $t[$id][name]=$o[1]; // наименование
       $t[$id][info]=$o[2]; // инфо
       $t[$id][cena]=$o[3]; // и д.р. не значащие данные
       $t[$id][kol]=1;      // кол-во в начале равно "1 штуке"

       session_register("t"); // записали переменную в сессию
    }


    /*
       Рисует таблицу с товарами в корзине. Из файла shop.txt мы читаем только
       названия колонок и не более. Названия товара (в данном случае только
       название/цена/кол-во) берется из сессии.
    */
    function korzina() {
       global $t,$PHP_SELF,$SID;

       $f=file("./shop.txt") or die("файл не найден");
       $ogl=explode("\",$f[0]);

       echo "<form action="http://php.spb.ru/php/%24PHP_SELF" method=POST>".
            "<input type=hidden name=SID value='$SID'>". // передаем сесиию
            "<input type=hidden name=c value=kolvo>".
       // рисуем заголовок таблицы с корзиной:
            "<table border=2><tR><td>$ogl[1]</td></td><td>$ogl[3]</td>".
            "<td>кол-во</td><td>команды</td></tr>";

       // проходим массив $t[all] по списку его ключей
       $k=@array_keys($t[all]);
       for ($i=0; $i<count($k); $i++) {
          $id=$k[$i];
          echo "<tr><td>{$t[$id][name]}</td>".
               "<td>{$t[$id][cena]}</td>".
               "<td><input size=4 type=text name=v[$id] value={$t[$id][kol]}></td>".
               "<td><a href="javascript:if(confirm('http://php.spb.ru/php/$PHP_SELF?c=del&id=$id&SID=$SID   This file was not retrieved by Teleport Pro, because the server reports that this file cannot be found.   Do you want to open it from the server?'))window.location='http://php.spb.ru/php/%24PHP_SELF?c=del&id=$id&SID=$SID'" tppabs="http://php.spb.ru/php/%24PHP_SELF?c=del&id=$id&SID=$SID">удалить</a></td></tr>";
       }

       // внизу таблицы две кнопки:
       //   Измениения - сохранить изменение числа товаров и обновить страницу
       //   Заказ - сорх. изм. + перейти на страницу оформления заказа
       echo "</table><input type=submit name=edit value='Внести изменения'> &nbsp; &nbsp;".
            "<input type=submit name=zakaz value='Оформить заказ'></form>";
    }


    /*
       Выводит на экран таблицу с товарами. В таблице автоматом генериться новая
       колонка с checkbox'асами, отметив которые и нажав "добавив", можно
       занести товары в корзину.
    */
    function price() {
       global $t, $PHP_SELF,$SID;

       $f=file("./shop.txt") or die("файл не найден"); // читаем файл
       $ogl=explode("\",$f[0]); // из него берем огравление
       $x=count($ogl); // вычисляем число колонок
       $y=count($f);   //         и число строк
       // форма (не забываем вписать $SID) + начало таблицы:
       echo "<form action="http://php.spb.ru/php/%24PHP_SELF" method=POST><input type=hidden name=c value=add>".
            "<input type=hidden name=SID value='$SID'><table border=2>";

       // рисуем заголовок таблицы, названия колонок - первая строка файла shop.txt
       echo "<tr>";
       for ($j=0; $j<$x; $j++) {
          if (strlen($ogl[$j])==0) echo "<tD>&nbsp;</td>";
          else echo "<td>$ogl[$j]</td>";
       }
       // рисуем последнюю колонку, где будут checkbox'ы
       echo "<td>x</td></tr>";

       // основной цикл вывода прайса
       for ($i=1; $i<$y; $i++) {

          $a=explode("\",$f[$i]); // читаем очередную строку файла
          if (count($a)<2) continue; // если она пустая (глюки), пропускаем
          echo "<tr>";
          // цикл вывода всех колонок текущей строки таблицы

          for ($j=0; $j<$x; $j++) {
             // если ячейка пустая, там надо поместить "&nbsp;";
             if (strlen($a[$j])==0) echo "<tD>&nbsp;</td>";
             else echo "<td>$a[$j]</td>";
          }

          // рисуем тот самый checkbox в последней колонке текущей строки
          echo "<td><input type=checkbox name=v[$i] value=$i></td></tr>";
       }

       echo "</table><br><center><input type=submit value='Добавить ".
            "отмеченные товары в корзину'></center></form>";
    }


    /*
       Выводит на экран несколько чисел (написано). Подсчет значений происходит
       при каджом вызове.
    */
    function summa() {
       global $t;
       // традиционный проход массива товаров из корзины
       $k=@array_keys($t[all]);
       for ($i=0; $i<count($k); $i++) {
          $id=$k[$i];
          // если убрать (double), то копейки округляться
          $summ+=(double)$t[$id][kol]*(double)$t[$id][cena];
          $summ2+=$t[$id][kol];
       }
       // просто выводим посчитанные цифры на экран
       echo "Корзина: наименований товаров - $i (в кол-ве $summ2 шт), цена -  ".sprintf("%.2f руб.<br>",$summ);
    }

    /*
       Объявление переменной post, которая содержит поля для заполнения
       посетителем при оформление заказа. Т.к. этот список используется
       2 раза, то описано это именно тут, а не ниже.
    */
       $post=array(
    "название организации",
    "Ф.И.О. должностного лица",
    "должность",
    "ИНН организации",
    "местонахождение организации",
    "контактный телефон",
    "e-mail");

    /*****************************************************************************/
    // основной код программы

    // $c - основная переменная, указывающая на нужное действие
    if (!isset($c)) $c='';

    switch($c) {

    case "":
    // без параметров - рисуем прайс-лист

       summa(); // статистика по корзине
       price(); // прайс
       // ссылка для перехода на корзину
       echo "<li><a href="javascript:if(confirm('http://php.spb.ru/php/$PHP_SELF?c=korzina&SID=$SID   This file was not retrieved by Teleport Pro, because the server reports that this file cannot be found.   Do you want to open it from the server?'))window.location='http://php.spb.ru/php/%24PHP_SELF?c=korzina&SID=$SID'" tppabs="http://php.spb.ru/php/%24PHP_SELF?c=korzina&SID=$SID">Корзина покупок</a>";
       break;

    case "korzina":
    // вывод корзины

       summa(); // см. выше
       korzina(); // рисуем таблицу корзины
       // пишем 2 ссылки
       echo "<li><a href="javascript:if(confirm('http://php.spb.ru/php/$PHP_SELF?SID=$SID   This file was not retrieved by Teleport Pro, because the server reports that this file cannot be found.   Do you want to open it from the server?'))window.location='http://php.spb.ru/php/%24PHP_SELF?SID=$SID'" tppabs="http://php.spb.ru/php/%24PHP_SELF?SID=$SID">Каталог товаров</a>";
       echo "<li><a href="javascript:if(confirm('http://php.spb.ru/php/$PHP_SELF?c=delete&SID=$SID   This file was not retrieved by Teleport Pro, because the server reports that this file cannot be found.   Do you want to open it from the server?'))window.location='http://php.spb.ru/php/%24PHP_SELF?c=delete&SID=$SID'" tppabs="http://php.spb.ru/php/%24PHP_SELF?c=delete&SID=$SID">Очистить корзину (осторожно!)</a>";

       break;

    case "add":
    // добавление из формы прайса всех товаров

       // в массиве $v скоплены номера строк товаров, которые функция ...
       $k=@array_keys($v);
       for ($i=0; $i<count($k); $i++) {
          // ... tadd() преобразует из файла в данные и поместит в сессии
          tadd($v[$k[$i]]);
       }
       // надо перенаправить браузер на приличный адрес, чтобы:
       // 1) в URL был написан приличный адрес
       // 2) чтобы не было глюка, если посетитель нажмет ОБНОВИТЬ СТРАНИЦУ
       exit(header("Location: $PHP_SELF?c=korzina&SID=$SID"));
       // Ну, а то, что header засунуто в exit... Это просто фича такая :-)
       break;


    case "kolvo":
    // измение кол-ва товаров, когда а странице КОРЗИНА нажимают СОХРАНИТЬ
    // ИЗМЕНЕНИЯ или ОФОРМИТЬ ЗАКАЗ..
    // Оцените, насколько короткий код преобразования корзины

       $k=@array_keys($v);
       for ($i=0; $i<count($k); $i++) {
          $t[$k[$i]][kol]=abs(intval($v[$k[$i]]));
       }
       // после изменения переенной сессии ее нужно записать
       session_register("t");

       // Далее важная проверка. Если посетитель нажимает кнопку СОХРАНИТЬ, то
       // у нас устанавливается переменная $edit, которая содержит строку
       // "Сохранить изменения". Если он нажимает ЗАКАЗ, то устанавливается
       // $post. Устанавливается только одна из этих твух переменных.

       // если это было ИЗМЕНИТЬ, то переправить на корзину
       if (isset($edit)) exit(header("Location: $PHP_SELF?c=korzina&SID=$SID"));
       // иначе переправить на страницу с офрмлением заказа
       exit(header("Location: $PHP_SELF?c=zakaz&SID=$SID"));
       break;

    case "del":
    // удаление товара по его $id

       $id=intval($id);
       unset($t[$id]);
       unset($t[all][$id]);
       session_register("t");
       exit(header("Location: $PHP_SELF?c=korzina&SID=$SID"));
       break;


    case "delete":
    // удаление всей корзины.. Как и в пред. пункте, только с проходом
    // массива id товаров

       $k=@array_keys($t[all]);
       for ($i=0; $i<count($k); $i++) {
          unset($t[$k[$i]]);
          unset($t[all][$k[$i]]);
       }
       session_register("t");
       exit(header("Location: $PHP_SELF?c=korzina&SID=$SID"));


    case "zakaz":
    // форма для оформления заказа

       echo "<form action="http://php.spb.ru/php/%24PHP_SELF" method=post><input type=hidden name=c value=post>".
            "<input type=hidden name=SID value='$SID'>".
            "<table border=1>";
       for ($i=0; $i<count($post); $i++) {
          echo "<tr><td>$post[$i]</td><td><input type=text size=40 name='v[$i]'></td></tr>";
       }
       echo "</table><input type=submit value='Отправить заказ'></form>";
       break;


    case "post":
    // генерим и отправляем анкету посетителя, где указаны данные посетителя
    // и список товаров из корзины

       $msg="Анкета посетителя: ";
       for ($i=0; $i<count($post); $i++) {
          $msg.="$post[$i]: ".substr($v[$i],0,500)." ";
       }
       $msg.=" Список покупок: ";
       $k=@array_keys($t[all]);
       for ($i=0; $i<count($k); $i++) {
          $id=$k[$i];
          $msg.=($i+1).") {$t[$id][name]} \ ".doubleval($t[$id][cena])." руб \ {$t[$id][kol]} шт. \ = ".
               sprintf("%.2f",$t[$id][cena]*$t[$id][kol])." руб ";
       }

       print <<< end
    <table width=100% height=95%><tr><td align=center>
    <h2>Ваш заказ отправлен!<br>
    Спасибо за покупку!</h2>
    <hr width=60%><br>
    <a href="http://php.spb.ru/?=SID">страница сервера</a><br><br>
    <a href="http://php.spb.ru/php/$PHP_SELF?=SID">прайс-лист</a>
    </td></tr></table>
    end;
    <?
    }
    ?>

    В переменной $msg хранится анкета посетителя, с которой можно сделать все, что угодно (послать на e-mail, записать в лог-файл, вывести на экран):

    <? echo $msg; ?>
  •  

    Источник: http://www.softportal.com/   Прочитана 6281 раз.
      Выпей пива!!! Обсудить на форуме  
         
         
         
    Google
     




         
    Copyright 2007 by bvisoft.com
    Powered by TIGER-News v1.1