Как сделать Интернет-магазин?

Как сделать Интернет-магазин? Этот вопрос не зря вынесен в заголовок. Если вы введете его в поисковике (например, http://yandex.ru), то в ответ получите массу ссылок на коммерческие предложения от разнообразных фирм или просто предприимчивых товарищей. Нет, я не хочу сказать, что они делают что-то плохое или делают не так, просто меня удивляет практически полное отсутствие информации на данную тему (может, кому-то повезло больше?). А тема действительно интересная и актуальная — по крайней мере, я смог найти в Интернете больше вопросов, чем ответов. И эта статья — маленькая попытка хоть немного восполнить недостаток информации. Итак, как же сделать Интернет-магазин самому?

Перед тем, как мы приступим собственно к теме, я хотел бы подойти к общему знаменателю (хотя, может, это надо было сделать в самом конце?). Программное решение, предложенное тут, не является идеальным и единственно правильным. В мире вообще мало идеального:-). Так что давайте договоримся не зацикливаться на таких вещах, как выбор языка программирования, стиля программы, способов решения возникающих проблем. Все это можно долго и с усердием обсуждать, но свою цель я вижу несколько в ином — дать всем желающим необходимый минимум информации на тему создания собственного Интернет-магазина без сложных программных и технических решений. А главное — без значительных финансовых затрат, что очень часто играет решающую роль. Сделать простой (мы не будем рассматривать сложные решения) Интернет-магазин самому, как ни странно, очень просто. И не удивляйтесь — реализация такого проекта доступна даже начинающему программисту, знакомому с интернет-технологиями. Надеюсь, вы сможете убедиться в этом сами. Несколько сложнее придумать, как привязать собственный магазин (тут и в дальнейшем подразумевается, конечно, Интернет-магазин) к конкретным товарам. Ну, вот вам пример. Есть набор канцтоваров в количестве 1000 наименований. Прайс с ценами и информацией о товарах обновляется чуть ли не ежедневно, и не просто обновляется, а иногда кардинально обновляется! Причем изменяются не только цены, что еще полбеды, но и виды товаров, их описания, сроки гарантии и поставок и т.д. Попробуйте вносить все эти данные в свой магазин ежедневно — и вы сразу проникнитесь уважением к тем людям, которые делают такую работу. Вот именно обновление данных в магазине и занимает основную часть собственно самой программы. Это то, что необходимо продумать в первую очередь.
Прежде чем вы начнете делать свой магазин, вам надо досконально изучить прайс товаров и способы его обновления в оригинале. Давайте для примера придем к некоторым условностям. Есть фирма, в ассортименте которой компьютерные товары. Их достаточное количество для того, чтобы не заниматься обновлением вручную, а придумать собственную систему для синхронизации данных прайса и магазина.
Пусть прайс будет у нас в Excel-е. Это, как правило, не так, многие фирмы используют в работе специализированные программы, например, "1С: Бухгалтерию", но такие моменты не принципиальны, так как всегда можно импортировать данные из таких пакетов в Excel. Количество разделов в прайсе и товаров в них не фиксировано, а сам прайс представляет собой набор строк и колонок. В каждой строке — товар или наименование раздела прайса (например процессоры, память, мышки и т.д.). Количество колонок не важно, стандартно могут присутствовать цена, наименование, описание товара. Впрочем, могут быть и другие варианты. Вот вам и описание обычного прайса, с которым вы можете столкнуться.
Что и как можно использовать, имея такие данные? Конечно, можно применить специальные модули для выборки данных из файла формата Excel (они существуют в разных вариантах для разных языков программирования), но такие модули, как правило, не являются бесплатными, а значит, не приемлемы для нас. Кроме того, всегда остается проблема настройки. Подчас, чтобы это сделать, нужно обладать такой квалификацией, что проще самому все написать с нуля. Впрочем, эти модули и не нужны на самом деле. Что собой представляет наш прайс? Правильно, набор строк и колонок, причем строго синхронизированных относительно друг друга. А значит, из таких строк и колонок можно построить текстовый файл с точно такой же структурой. Только вместо визуального разделения строк и колонок (как в Excel-е), надо использовать какие-либо символы. Конечно, в этом случае визуальная синхронизация будет утеряна, так как длина строк всегда разная, но это и не важно, ведь внутренняя структура останется прежней. Это будут все те же строки и колонки, только уже в текстовом формате. А этот формат очень легко прочитать и обработать практически на любом языке программирования.
Если уж речь зашла о примерах и условностях, давайте теперь определимся, на каком языке программирования будут наши примеры. Выбор для меня очевиден, так как свой магазин я написал именно на РНР. Это не сложный и в то же время достаточно мощный скриптовый язык программирования, предоставляющий все необходимые средства для реализации Интернет-магазина (и не только его, между прочим). Итак, пусть будет РНР. Но не забывайте, что вы всегда легко сможете перенести алгоритм на любую другую платформу. Просто с РНР удобнее как-то.
Вернемся к нашему прайсу. Excel, как известно, умеет сохранять свои файлы в разных форматах. Нас будет интересовать сейчас один — текстовый файл с разделителями табуляции. В принципе, разделители не важны, есть возможность сохранять в формате с разделителями запятыми или пробелами. Используйте тот, который вам больше понравится. Мы же остановимся на табуляции.
И вот что у нас получилось на выходе: файл *.txt, строки разделены переводом каретки (это простой Enter), колонки разделены символами табуляции. Вся внутренняя структура прайса осталась прежней, так как об этом позаботился мастер сохранения Excel. Ну что ж, уже лучше.
Вот мы и нашли способ не заниматься рутинной работой по ежедневному обновлению прайса в нашем Интернет-магазине, а максимально автоматизировать этот процесс. Перед тем, как начинать работать с полученным файлом, можно подумать, как его немного сжать или обработать. Это бывает необходимо для того, чтобы удалить ненужные колонки, повторяющиеся пробелы, временно отсутствующие в наличии товары и т.д. Для этого надо считать файл в массив, обработать каждую строку на предмет наличия ненужной информации, записать полученный результат опять в массив на то же место и, наконец, весь массив записать в файл. Примерно так. Но надо исходить из конкретной необходимости таких операций — вполне возможно, достаточно просто удалить повторяющиеся пробелы.
Когда все готово, пора приступать к алгоритму выборки данных из нашего текстового файла с прайсом. Как вы уже, надеюсь, догадались, он совсем не сложен. Считать файл в массив:

$file = "price.txt";
$tovar = file ($file);

Еще раз напоминаю, примеры даны в формате языка PHP. Дальше надо обработать массив $tovar[] в цикле с выводом результатов работы на экран:

$i = 0; // счетчик начинается с нуля
while ($i < count($tovar)); // открыли цикл до последнего элемента в массиве
echo $tovar[$i]; // выводим строку на экран
echo "<br> "; // не забываем про перевод строк
$i++; // заканчиваем цикл
endwhile;

Вот вам и самый простейший вариант вашего прайса. Он, правда, обладает существенным недостатком — весь прайс выводится за один раз, да еще все колонки в одной строке. А это не приемлемо по эстетическим причинам. Правильнее предоставить клиенту возможность выбора раздела прайса. Впрочем, не стоит исключать и первый вариант. Всегда лучше, когда есть выбор из разных вариантов просмотра прайса, тем более, что в смысле программных решений тут не предвидится проблем.
Значит, нужно отделить разделы прайса от информации о товаре. Это можно сделать, если обратить внимание на то, в какой из колонок идет название раздела. Как правило, в той же, что и название товара. Но в строке с названием раздела нет информации о цене товара, а это может служить хорошим отличительным признаком для программы. Достаточно каждый раз отслеживать наличие в выбранной строке колонку цен. Когда там пусто — в строке название раздела и его можно вывести на экран, если нет — это товар, такую строку просто пропускаем, если надо выводить только названия разделов. И наоборот для вывода только товаров.
Впрочем, названия разделов сами по себе мало кого заинтересуют. Нам надо продумать возможность просмотра конкретного раздела прайса. Для этого выводимые наименования разделов прайса надо сделать ссылками. А в ссылке в качестве параметра указать информацию о том, с какой строки начинается данный раздел. Немного модернизируем наш алгоритм вывода разделов прайса таким образом, чтобы после нажатия на ссылку-наименование раздела посетитель попадал на другую программу, которая начинала бы просмотр файла с прайсом не с начала, а с того места, которое передано по ссылке в качестве параметра. И уже выводила бы не разделы прайса, а сами товары — их цену, наименование, описание и т.д. Тут происходит обратное. В цикле программа просматривает строки файла. Если в колонке с ценой не пусто — это товар, и его надо вывести на экран, предварительно отформатировав информацию. Если же пусто — это начало следующего раздела прайса, и обработку надо прекратить, так как цель достигнута — весь выбранный посетителем раздел выведен на экран. Обязательно необходимо продумать удобную навигацию, ваш посетитель не должен заблудиться в дебрях программ. На каждой страничке должна быть ссылка на начало и на список разделов прайса. Неплохо предоставить возможность перехода на следующий и на предыдущий разделы прайса прямо из списка товаров.
Теперь о том, как разделить информацию в выбранной строке по колонкам. Отведем каждой колонке свою переменную. Если колонок в прайсе пять, то и переменных надо зарезервировать тоже пять. Чтобы не запутаться, возьмите похожие имена: $n_1, $n _2, $n_3, $n_4,
$n _5. Теперь, если нужная строка находится в массиве $tovar[$i], достаточно применить такую конструкцию:

list ($n_1, $n_2, $n_3, $n_4, $n_5) = split ("\t",$tovar[$i]);

...и если колонки были разделены символом табуляции, они распределяться каждая в свою переменную. Если вы использовали другой разделитель колонок, вам надо прописать его вместо \t. Теперь легко проверить наличие цены, а также отсортировать и отформатировать данные прайса нужным образом.
Вот вам и готовое решение для того, чтобы просто выводить прайс по разделам на экран. Но этого еще не достаточно для полноценного Интернет-магазина, так как он подразумевает возможность заказа выбранных товаров.
Мы подошли к очень интересной теме — виртуальная корзина. Не сомневаюсь, на очень многих сайтах вы пробовали заказать выложенный там товар, и на всех работа корзины была реализована по-разному. Что надо стандартному посетителю от Интернет-магазина? Правильно, купить товар. А что ему для этого требуется? Удобная навигация, легкий и быстрый доступ к товарам, возможность изменить количество одного наименования товара в корзине, возможность удалить товар из корзины, информация о товаре (данные, параметры, фотография, наконец — цена!). Это — необходимый минимум, увеличение доступных функций отрицательно сказывается на быстродействии и существенно усложняет программу. Но этого более чем достаточно для нас.
Итак, как можно хранить товары в корзине покупателя? Можно попросить его (покупателя, конечно) зарегистрироваться в системе, но для этого надо быть уверенным в необходимости нашего товара для покупателя. Чаще это не так:-). А поэтому не усложняйте жизнь своим клиентам различного рода регистрациями. Подумайте — как относитесь к ним вы сами, часто ли хочется оставлять свои данные на сомнительных:-) сайтах? Вот именно, очень не хочется. А значит, надо иметь очень веские причины, чтобы ввести регистрацию. Такими причинами могут быть: наличие постоянного круга покупателей, ходовой товар... Впрочем, это уже не относится к теме статьи. Сделайте свой выбор сами. Только имейте в виду, что регистрацию тоже придется разрабатывать самому.
А мы же не будем останавливаться на регистрации, так как она в принципе ничего не меняет. Все равно вам никуда не уйти от cookie... Ну вот, уже слышу массу голосов с не очень лестными отзывами, типа "Опять, а мы-то думали...". Да и еще раз да! Давайте, я попробую привести ряд аргументов за использование этой технологии, а вы решите сами — прав я или нет.
Чтобы сделать это, нужно рассмотреть преимущества и недостатки нескольких конкурирующих технологий. Что можно противопоставить cookie? Из того, что попроще — Java script и сессии. Давайте рассмотрим все три по порядку.
Cookie — небольшие файлы, записываемые на вашем компьютере сервером. Все браузеры поддерживают работу с ними, и поверьте — в этой технологии больше ограничений, чем возможностей. Например, нельзя записать в один cookie больше 4 килобайт данных, нельзя обратиться к чужому cookie, только к своему (созданному своим сервером), нельзя записать cookie куда-либо в другое место, кроме как в отведенное пользователем. Нельзя, нельзя, нельзя... Конечно, все это при условии того, что вы следите за безопасностью собственного компьютера и устанавливаете самое современное программное обеспечение. Кстати, практически во всех браузерах сookie по умолчанию включены, и если вы смогли их выключить — сможете и включить. Сделать это можно в настройках программы-браузера. Очень большое количество сайтов использует в своей работе cookie, а часть из них просто не пустит вас к себе без включенной их поддержки в браузере. Хорошо это или плохо, но это так. Есть специальные программы — брандмауэры, отсекающие cookie или отказывающие сайту в доступе, так что выбор все равно остается за посетителем. Но — среднестатистический пользователь компьютера не отключает cookie, а для продвинутых стоит написать предупреждение на сайте.
Дальше — Java Script. Эта технология тоже достаточно распространена, но... Есть версии популярных браузеров, которые не поддерживают работу Java Script. Например, версии Opera. Правда, это не тот недостаток, на котором мне хотелось бы сделать акцент. Java Script технология клиентская, а это значит, что текст программы-скрипта надо передать браузеру. Само собой — увеличение времени загрузки и замедление работы программы вам гарантированы. Учтите еще требования к ресурсам компьютера — и мы получаем гремучую смесь. А ведь своего клиента надо уважать и немножко даже любить — как никак он платит нам за нашу работу. Так зачем же усложнять ему путь по сайту? Впрочем, есть тут и достоинства — если сервер не поддерживает программирование на своей стороне, остается воспользоваться только Java Script.
Сессии. Очень эффективный механизм, встроенный во многие современные языки программирования. Присутствует, например, в PHP версии 4.0 и выше. Позволяет передавать переменные от одного окна браузера к другому без их потери и без передачи методами POST или GET. Это на пальцах. В действительности — использует в своей работе уникальные идентификаторы, которые хранятся в тех же файлах cookie, так что нового в принципе ничего не несет, разве что повышается удобство работы... Если только знать, как этим пользоваться. Само собой — требует поддержки cookie от браузера.
Вот они, конкуренты. На самом деле, выбор стоит между двумя: cookie или Java Script. Второе стоит выбирать только в случае, если ваш хостинг не поддерживает программирование на стороне сервера ни на одном из языков. Это практически все бесплатные службы хостинга. А на первом стоит останавливаться во всех других случаях, когда есть возможность отдать основную работу по обработке серверу. Впрочем, ваш Java Script тоже будет работать с cookie, иначе оборвавшаяся так некстати связь с Интернетом лишит посетителя с трудом набитого в корзину товара. Второй раз он (посетитель магазина) может этого и не сделать. Если используются cookie — вся корзина остается нетронутой, ведь она записана на компьютере клиента. Как видите, круг замкнулся, нам все равно от них никуда не деться. Итак, решение о выборе технологии зависит от возможностей хостинга.
Мы, как прогрессивные программисты, остановимся на cookie. Тем более, что у нас есть РНР, а в нем очень просто устанавливать, удалять и считывать cookie. На практике это будет выглядеть так:

isset ($name); прочитать установленный cookie с именем name;
$y = mktime (12, 50, 0, 12, 12, 2005); установить время, до которого хранить cookie;
setcookie("name", $data, $y); записать в cookie с именем name переменную $data;
setcookie("name); удалить cookie с именем name;

Вот и все, что нам понадобится для работы со страшными cookie.
Раз технология выбрана — давайте применим ее на деле! Прайс у нас, если вы помните, хранится в текстовом файле. Блок выборки данных оттуда есть. Осталось решить, что именно хранить в cookie. Можно всю информацию о товаре, а можно только цифровой идентификатор и количество. Конкретный выбор надо сделать исходя из реальных условий. По принципу — что проще. Только надо учитывать, что цифровой идентификатор занимает не очень много места в памяти, но с ним больше хлопот в смысле программирования. Придется делать блок сопоставления идентификатора и выборки информации из файла прайса. Тут есть и еще один момент. Если прайс часто меняется, соответственно информация в корзине покупателя может быстро устареть и не соответствовать действительности. Значит, стоит подумать о контроле даты. Дату, когда посетитель положил товар в корзину, тоже придется хранить в cookie, так как больше негде. Если даты сильно различаются, стоит предупредить покупателя о несоответствии. Иначе могут произойти досадные казусы. Неприятно, когда заказ делается по недельной давности цене. Она ведь может не только упасть, но и увеличиться! Потом придется объясняться... Так что лучше позаботиться о таких вещах заранее. Хотя, если прайс более-менее постоянный, беспокоиться на стоит.
Цифровым идентификатором очень удобно выбрать номер позиции в прайсе. Этот номер, понятное дело, уникальный для каждого товара, а нам это и надо. И, кроме того, по номеру позиции легко извлечь информацию о товаре из текстового файла с прайсом. Достаточно считать весь файл в массив:

$file = "price.txt"; // кстати, расширение файла может быть любым
$as = file ($file);

И обратиться к строке массива с нужным индексом:
$info = $as[$id];
$id — идентификатор, который нам нужен. Правда, применяя данный метод, нам не избежать контроля дат, но это не так уж и плохо.

Вместе с идентификатором товара надо запоминать и количество товара. Соответственно, при первом заказе вводится число 1. Дальше желательно предоставить возможность произвольно (в ограниченных, конечно, рамках) менять это число. Для пересчета суммы понадобится кнопка, если она будет первой после формы — сработает и нажатие на клавишу Enter. Очень удобно — ввел новое количество товара и нажал Enter для пересчета. Кроме того, в корзине обязательно надо предусмотреть возможность заказать еще товар и окончательно оформить заказ. Это можно сделать и кнопками, и ссылками — что удобнее для навигации. Никаких параметров передаваться тут не будет.
Конечно, необходимо продумать, как именно выводить информацию о полной стоимости заказа. Не стоит забывать о скидках и подарках, если они, конечно, есть в вашем Интернет-магазине. Хорошо впишутся сюда различные бонусы и информация о доставке. Если она бесплатная, напишите об этом. Лишним не будет.
Наконец, оформление. Стандартные поля — имя, адрес, телефон, почтовый ящик и т.д. Кому что надо. Чем меньше, кстати, тем лучше. Обязательно должно быть поле "примечания" — оставьте клиенту возможность высказать свои пожелания. Тут же должна присутствовать вся информация о заказанном товаре и о его стоимости. Самая главная кнопка — "ЗАКАЗАТЬ". Если нет регистрации, можно введенные данные запомнить (а для чего мы говорили столько о cookie?) и при следующем заказе просто подставить. Клиент будет благодарен, поверьте.
После того, как заказ оформлен и подтвержден, первым делом... скажите спасибо клиенту за покупку. И выведите еще раз информацию о заказе на экран. При этом не забывайте очистить корзину — она ведь уже отработала свое. Если был введен адрес электронной почты, отправьте на него сообщение о заказе и самую разнообразную информацию, включая рекламу. Вот и все. По крайней мере, для покупателя.
Теперь перейдем к внутренним процессам, происходящим при заказе. Само собой, для хранения информации о всех заказах надо отвести служебный файл. В него и будем писать все, что назаказывают. Причем писать уже надо не идентификаторы (надеюсь, места у вас на хостинге много), а полную информацию — название, цену и т.д. Так удобнее потом просматривать и обрабатывать. Тут ничего сложного — просто дописываем специальным образом сформированную строку в конец файла. Прочитать такой файл можно и в текстовом редакторе и при помощи специальной служебной программы, вход в которую, конечно же, должен быть запаролирован.
Очень актуальным является момент своевременности обработки заказов. Я вам подскажу очень хороший и, кстати, современный метод, позволяющий практически мгновенно узнавать о заказе. И это без необходимости постоянно сидеть в Интернете и даже выходить в него раз в день. Удивлены? А на самом деле все просто. Нам понадобится простой... пейджер. Практически все операторы предоставляют возможность отправить электронное сообщение на свой пейджер из Интернета. Как правило, адрес для отправки выглядит так: номер_пейджера@адрес.оператора. Или приблизительно так. Если на этот адрес отправить письмо, оно придет на ваш пейджер. А из PHP, например, очень просто отправлять электронные сообщения на почтовые ящики. Идея ясна, надеюсь? Кстати, неплохим вариантом может быть SMS на сотовый телефон, но надо уточнять у оператора, поддерживает ли их сеть такую возможность.
Как видите, на заказ можно отреагировать практически сразу, как только он поступит. Это повышает доверие клиентов к магазину и положительно сказывается на репутации. Вот, как мне кажется, и все для начала.
Очень хочется пожелать не бояться самостоятельно заниматься разработками в данной области. Проблем осталось много, но все они решаемы, поверьте. И, как правило, проще оказывается самостоятельно разработать систему, чем искать и настраивать чужую.
Если вам пришлись по сердцу идеи, изложенные в данной статье, вы можете оценить работу описываемого здесь Интернет-магазина по адресу http://204040.com. Может быть, даже что-нибудь купите:-). Еще раз хочется напомнить — статья ориентирована в первую очередь на то, чтобы дать начальную информацию о технологиях, применяемых в Интернет-магазинах. Тот или иной описанный здесь блок может быть реализован по-другому. Исследуйте, экспериментируйте, творите... Успехов вам в бизнесе!

Андрей Кухарчик
http://virtual.bresttelecom.by
virtualbrest@tut.by



Компьютерная газета. Статья была опубликована в номере 23 за 2002 год в рубрике интернет :: вебмастеру

©1997-2024 Компьютерная газета