Регистрация    Забыли пароль?        Правила форума    FAQ (читать перед созданием новой темы)
Имя   Пароль  запомнить
  
Просмотр темы
Вернуться на сайт: PHP-Fusion SF Russian Support Site

Форум поддержки PHP-Fusion SF | PHP-Fusion SF - Моды/Плагины | Моды/Mods
# 1 Тема: Виртуальный магазин
terrakmk
Пользователь

Avatar пользователя




Местный

Сообщений: 45
Откуда: Беларусь
Зарегистрирован: 12 Февраля 2008, 12:50:25
Сказали спасибо 1 раз
Статус: offline
Опубликовано 03 Февраля 2010, 17:28:03
Нашел вот такую статейку - запустил - на одном хостинге проходит только кол-во не обновляет
может кто поможет в чем может быть проблема

Виртуальный магазин? Всего 3 часа работы и 5 Kb кода.

Что это?
Это так называемый виртуальный магазин, т.е. прайс лист некой организации с наименовнием товаров, часть из которых можно ПОМЕТИТЬ и занести в корзину, чтобы в дальнейшем можно было заполнить анкету (ФИО, адрес и т.д.) для покупки этих товаров. Все проще простого. Дизана нет никакого, только "скелет".


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


А почему размер файла 10Кб, а не 5Кб?
Если выкинуть все комментарии, вот и будет 5 кб :-) Программа (без комментариев) была написана за 3 часа в присутствии человека, изучающего ПХП. Комментарии, на самом деле были, но только устные :-)


Подготовка сервера
1. Возможный глюк: у вас не настроен временный каталог на сервере для размещения временных файлов.

2. Программа подразумевает, что PHP поместит в переменную $SID номер сесии. По умолчанию, возможно, этого не произойдет.

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

Вариант 1 - php.ini
Если править php.ini, то в нем уже есть те переменные, что надо изменить
ищем строку session.save_path и пишем путь к своему временному каталогу. В этот каталог Apache/PHP будут писать свои файлы, след. для них там должен быть доступ. Если у вас Unix, то пишем /tmp, если Windows, то \temp (не забудьте создать C:\TEMP или X:\TEMP, смотря где находится Апач)
ищем строку session.name и заменяем на SID (большими буквами)
Вариант 2 - .htaccess или httpd.conf
Если вносить те же измения в указанные файлы, то надо написать так:
вариант для unix: php_value session.save_path /tmp и для windows: php_value session.save_path \temp
и имя сессии: php_value session.name SID
Итак, нам надо для 1) и 2) пунктов подправить переменные PHP-процессора: session.save_path (временный каталог) и session.name (присвоить знаначение "SID").


Настройка каталога
создать файл shop.txt ПО ТАКОМУ ОБРАЗЦУ. (
ID\Наименование товара\Описание\Цена(руб)
1\Товар 1\Опиание товара 1\10998
2\Товар 2\Опиание товара 2\1998
3\Товар 3\Опиание товара 3\109
)
Если вы захотите добавить новые колонки, то не забудьте, что первой кононкой должны идти ID товаров (например числа от 1 до ..), а последней - цена товара. Разделитель товаров - слеш (\).

создать файл shop.phtml (имя не принципиально), код программы приведен ниже.


Текст программы

<?

// символы "<?" должны быть первыми(!) в файле. Т.е. ни пустых строк, ни
// пробелов до символов "<?" ставить нельзя, иначе не будет работать
// 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=$PHP_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=$PHP_SELF?c=del&id=$id&SID=$SID>удалить</a></td></tr>";
}

// внизу таблицы две кнопки:
// Измениения - сохранить изменение числа товаров и обновить страницу
// Заказ - сорх. изм. + перейти на страницу оформления заказа
echo "</table><input type=submit name=edit value='Внести изменения'> ".
"<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=$PHP_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> </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++) {
// если ячейка пустая, там надо поместить " ";
if (strlen($a[$j])==0) echo "<tD> </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='$PHP_SELF?c=korzina&SID=$SID'>Корзина покупок</a>";
break;


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

summa(); // см. выше
korzina(); // рисуем таблицу корзины
// пишем 2 ссылки
echo "<li><a href='$PHP_SELF?SID=$SID'>Каталог товаров</a>";
echo "<li><a href='$PHP_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=$PHP_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="Анкета посетителя:\n\n";
for ($i=0; $i<count($post); $i++) {
$msg.="$post[$i]: ".substr($v[$i],0,500)."\n";
}
$msg.="\nСписок покупок:\n\n";
$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])." руб\n";
}


?>
<table width=100% height=95%><tr><td align=center>
<h2>Ваш заказ отправлен!<br>
Спасибо за покупку!</h2>
<hr width=60%><br>
<a href='/?<?=SID?>'>страница сервера</a><br><br>
<a href='<? echo $PHP_SELF; ?>?<?=SID?>'>прайс-лист</a>
</tD></tr></table>
В переменной $msg хранится анкета посетителя,
с которой можно сделать все, что угодно (послать мылом,
записать в лог-файл, вывести на экран):
<pre><? echo $msg; ?></prE>

<?
}
?>
 
^ наверх ^
1 пользователь сказал спасибо Вам: lamerdes
# 2  
terrakmk
Пользователь

Avatar пользователя




Местный

Сообщений: 45
Откуда: Беларусь
Зарегистрирован: 12 Февраля 2008, 12:50:25
Сказали спасибо 1 раз
Статус: offline
Опубликовано 03 Февраля 2010, 17:32:36
Заработало - глюк гдето был я думаю из-за файлика shop.txt - может где пробелы лишние или что
Прикрепленные файлы
Для просмотра вложения зарегистрируйтесь


[Изменил(а) terrakmk, 04 Февраля 2010, 12:39:43]  
^ наверх ^
# 3  
lushas
Пользователь

Avatar пользователя




новичек

Сообщений: 8
Зарегистрирован: 24 Декабря 2008, 06:27:09
Сказали спасибо 0 раз
Статус: offline
Опубликовано 04 Февраля 2010, 02:58:43
а дальше как из из переменной достать данные и отправить на мыло

и будет ли работать если будет

<?php
/*Пустая форма для создания отдельных страничек*/
require_once "maincore.php";
require_once "subheader.php";
require_once "side_left.php";
КОД МАГАЗА

require_once "side_right.php";
require_once "footer.php";
?>




если как было написанно символы "<?" должны быть первыми(!) в файле.


[Изменил(а) lushas, 04 Февраля 2010, 03:01:54]  
^ наверх ^
# 4  
jikaka
Пользователь

Avatar пользователя

jikaka

Почетный SF

Сообщений: 1112
Откуда: Питер
Зарегистрирован: 01 Октября 2008, 08:39:58
Сказали спасибо 106 раз
Статус: offline
ICQ статус 196346743
Опубликовано 04 Февраля 2010, 08:12:52
киньте ссылку на пример с магазином посмотреть...


--------------------
жить хорошо! а хорошо жить - еще лучше!
www.rusfusion.ru - официальная поддержка
^ наверх ^ 196346743 www.jikaka.ru
# 5  
terrakmk
Пользователь

Avatar пользователя




Местный

Сообщений: 45
Откуда: Беларусь
Зарегистрирован: 12 Февраля 2008, 12:50:25
Сказали спасибо 1 раз
Статус: offline
Опубликовано 04 Февраля 2010, 12:41:13
Что бы отправляло на мыло - выложил пример в прикрепленке (старую заменил)
Пример на kmk.by можно глянуть
 
^ наверх ^
# 6  
jikaka
Пользователь

Avatar пользователя

jikaka

Почетный SF

Сообщений: 1112
Откуда: Питер
Зарегистрирован: 01 Октября 2008, 08:39:58
Сказали спасибо 106 раз
Статус: offline
ICQ статус 196346743
Опубликовано 04 Февраля 2010, 13:17:35
что-то я магазин не нашел,
тыркни пальцем, если не трудно...


--------------------
жить хорошо! а хорошо жить - еще лучше!
www.rusfusion.ru - официальная поддержка
^ наверх ^ 196346743 www.jikaka.ru
# 7  
jikaka
Пользователь

Avatar пользователя

jikaka

Почетный SF

Сообщений: 1112
Откуда: Питер
Зарегистрирован: 01 Октября 2008, 08:39:58
Сказали спасибо 106 раз
Статус: offline
ICQ статус 196346743
Опубликовано 04 Февраля 2010, 15:18:33
сразу ссылочку поставил бы kmk.by/shop.php, а то не сразу доперло...
думал у тебя с сайта есть где-то...


--------------------
жить хорошо! а хорошо жить - еще лучше!
www.rusfusion.ru - официальная поддержка
^ наверх ^ 196346743 www.jikaka.ru
# 8  
terrakmk
Пользователь

Avatar пользователя




Местный

Сообщений: 45
Откуда: Беларусь
Зарегистрирован: 12 Февраля 2008, 12:50:25
Сказали спасибо 1 раз
Статус: offline
Опубликовано 04 Февраля 2010, 16:12:43
http://kmk.by/viewpage.php?page_id=13 -прикрутил к сайту

Это скорее не магазин даже - просто удобный способ заказа прямо с прайса
для моих целей как раз подходит

файл shop.php открываю во фрейме


[Изменил(а) terrakmk, 04 Февраля 2010, 16:14:16]  
^ наверх ^
# 9  
jikaka
Пользователь

Avatar пользователя

jikaka

Почетный SF

Сообщений: 1112
Откуда: Питер
Зарегистрирован: 01 Октября 2008, 08:39:58
Сказали спасибо 106 раз
Статус: offline
ICQ статус 196346743
Опубликовано 04 Февраля 2010, 23:43:07
On-line заказ колбасы

smiley
отлично звучит...


--------------------
жить хорошо! а хорошо жить - еще лучше!
www.rusfusion.ru - официальная поддержка
^ наверх ^ 196346743 www.jikaka.ru
# 10  
lushas
Пользователь

Avatar пользователя




новичек

Сообщений: 8
Зарегистрирован: 24 Декабря 2008, 06:27:09
Сказали спасибо 0 раз
Статус: offline
Опубликовано 05 Февраля 2010, 17:33:24
файл shop.php открываю во фрейме


не пойму как сделал, опиши пожалуйста)



Все разобрался, сначала не правильно понял как синтаксис тега фрейма работает...


[Изменил(а) lushas, 05 Февраля 2010, 17:48:12]  
^ наверх ^
# 11  
terrakmk
Пользователь

Avatar пользователя




Местный

Сообщений: 45
Откуда: Беларусь
Зарегистрирован: 12 Февраля 2008, 12:50:25
Сказали спасибо 1 раз
Статус: offline
Опубликовано 24 Февраля 2011, 22:58:20
на новой версии php - не работает, да и нужно ему работать с глобальными переменными - так что код требует переделки
 
^ наверх ^
Перейти на форум:


105,444,377 уникальных посетителей
сейчас: 22 Ноября 2024, 00:33:57
Генерация страницы: 0.29 сек.

Original size:47 кб.
GZipped size: 12 кб.
Compression:75%