Як зробити Інтернет-магазин?
Перед тим, як ми приступимо власне до теми, я хотів би підійти до спільного знаменника (хоча може, це треба було зробити в самому кінці?). Програмне рішення, запропоноване тут, не є ідеальним і єдино правильним. У світі взагалі мало ідеального :-) Так що давайте домовимося не зациклюватися на таких речах, як вибір мови програмування, стилю програми, способів вирішення виникаючих проблем. Все це можна довго і старанно обговорювати, але свою мету я бачу трохи в іншому - дати всім бажаючим необхідний мінімум інформації на тему створення власного Інтернет-магазину без складних програмних і технічних рішень. А головне - без значних фінансових витрат, що дуже часто грає вирішальну роль.
Зробити простий (ми не будемо розглядати складні рішення) Інтернет-магазин самому, як не дивно, дуже просто. І не дивуйтеся - реалізація такого проекту доступна навіть починаючому програмісту, знайомому з Інтернет-технологіями. Сподіваюся, Ви зможете переконатися в цьому самі. Дещо складніше придумати, як прив'язати власний магазин (тут, і в подальшому, мається на увазі, звичайно, Інтернет-магазин) до конкретних товарів. Ну, ось Вам приклад. Є набір канцтоварів. У кількості 1000 найменувань. Прайс з цінами і інформацією про товари оновлюється мало не щодня, і не просто оновлюється, а іноді кардинально оновлюється! Причому змінюються не тільки ціни, що ще півбіди, але і види товарів, їх опису, терміни гарантії і поставок і т.д. Спробуйте вносити всі ці дані в свій магазин щодня, і Ви відразу проникніться повагою до тих людей, які роблять таку роботу :-) Ось саме оновлення даних в магазині і займає основну частину власне самої програми. Це те, що необхідно продумати в першу чергу.
Перш ніж Ви почнете робити свій магазин, Вам треба досконально вивчити прайс товарів і способи його поновлення в оригіналі. Давайте для прикладу прийдемо до деяких умовностей. Є фірма, в асортименті якої комп'ютерні товари. Їх достатня кількість для того, що б не займатися оновленням в ручну, а придумати власну систему для синхронізації даних прайса та магазина. Нехай прайс буде у нас в Excel-е. Це, як правило, не так, багато фірм використовують в роботі спеціалізовані програми, наприклад, 1С Бухгалтерію, але такі моменти не принципові, так як завжди можна імпортувати дані з таких пакетів в Excel. Кількість розділів в прайсі і товарів в них не фіксоване, а сам прайс являє собою набір рядків і колонок. У кожному рядку - товар або найменування розділу прайса (наприклад - процесори, пам'ять, мишки і т.д.). Кількість колонок не важно, стандартно можуть бути присутніми ціна, найменування, опис товару. Втім, можуть бути й інші варіанти. Ось Вам і опис звичайного прайса, з яким Ви можете зіткнутися.
Що і як можна використовувати, маючи такі дані? Звичайно, можна застосувати спеціальні модулі для вибірки даних з файлу формату Excel (вони існують в різних варіантах для різних мов програмування), але такі модулі, як правило, не є безкоштовними, а значить, не прийнятні для нас. Крім того - завжди залишається проблема настройки. Часом, що б це зробити, потрібно володіти такою кваліфікацією, що простіше самому все написати з нуля :-) Втім, ці модулі і не потрібні насправді. Що собою являє наш прайс? Правильно, набір рядків і колонок, причому строго синхронізованих один щодо одного. А значить, з таких рядків і колонок можна побудувати текстовий файл з точно такою ж структурою. Тільки замість візуального розділення рядків і колонок (як в Excel-е), треба використовувати будь-які символи. Звичайно, в цьому випадку візуальна синхронізація буде загублена, так як довжина рядків завжди різна, але це і не важливо, адже внутрішня структура залишиться колишньою. Це будуть все ті ж рядки і колонки, тільки вже в текстовому форматі. А цей формат дуже легко прочитати і обробити практично на будь-якій мові програмування.
Якщо вже мова зайшла про приклади та умовності, давайте тепер визначимося, на якій мові програмування будуть наші приклади. Вибір для мене очевидний, так як свій магазин я написав саме на РНР. Це нескладний (і в той же час досить потужний) скриптова мова програмування, що надає всі необхідні засоби для реалізації Інтернет-магазину (і не тільки його, між іншим). Отже, нехай буде РНР. Але не забувайте, що Ви завжди легко зможете перенести алгоритм на будь-яку іншу платформу. Просто з РНР: зручніше якось.
Повернемося до нашого прайса. Excel, як відомо, вміє зберігати свої файли в різних форматах. Нас буде цікавити зараз один - текстовий файл з роздільниками табуляції. В принципі, роздільники не важливі, є можливість зберігати в форматі з роздільниками комами або пробілами. Використовуйте той, який Вам більше сподобається. Ми ж зупинимося на табуляції.
І ось що у нас вийшло на виході: файл * .txt, рядки розділені переведенням каретки (це простий Enter), колонки розділені символами табуляції. Вся внутрішня структура прайса залишилася колишньою, так як про це подбав майстер збереження Excel. Ну що ж, вже краще :-)
Ось ми і знайшли спосіб не займатися рутинною роботою по щоденному оновленню прайса в нашому Інтернет-магазині, а максимально автоматизувати цей процес. Перед тим, як починати працювати з отриманим файлом, можна подумати, як його трохи стиснути або обробити. Це буває необхідно для того, що б видалити не потрібні колонки, повторювані прогалини, тимчасово відсутні в наявності товари і т.д. Для цього треба вважати файл в масив, обробити кожен рядок на предмет наявності непотрібної інформації, записати отриманий результат знову в масив на теж місце і, нарешті - весь масив записати в файл. Приблизно так. Але треба виходити з конкретної необхідності таких операцій, цілком можливо досить просто видалити повторювані пробіли.
Коли все готово, настав час приступати до алгоритму вибірки даних їх нашого текстового файлу з прайсом. Як Ви вже, сподіваюся, здогадалися, він зовсім не складний. Вважати файл в масив:
$ File = "price.txt";
$ Tovar = file ($ file);
Ще раз нагадую, приклади дані в форматі мови PHP. Далі треба обробити масив $ tovar [] в циклі з виведенням результатів роботи на екран:
$ I = 0; // лічильник починається з нуля
while ($ i echo $ tovar [$ i]; // виводимо рядок на екран
echo "
"; // не забуваємо про переклад рядків $ 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 куди або в інше місце, крім як у відведений користувачем. Не можна, не можна, не можна: Звичайно, все це за умови того, що Ви стежите за безпекою власного комп'ютера і встановлюєте найсучасніше програмне забезпечення. До речі, практично у всіх браузерах-файли за замовчуванням включені, і якщо Ви змогли їх вимкнути - зможете і включити. Зробити це можна в налаштуваннях програми-браузера. Дуже велика кількість сайтів використовує в своїй роботі 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. На практиці це буде виглядати так:
Ось і все, що нам знадобиться для роботи зі страшними cookie.
Раз технологія вибрана - давайте застосуємо її на ділі! Прайс у нас, якщо Ви пам'ятаєте, зберігається в текстовому файлі. Блок вибірки даних звідти є. Залишилося вирішити, що саме зберігати в cookie. Можна - всю інформацію про товар, а можна тільки цифровий ідентифікатор і кількість. Конкретний вибір треба зробити виходячи з реальних умов. За принципом - що простіше. Тільки треба враховувати, що цифровий ідентифікатор займає не дуже багато місця в пам'яті, але з ним більше клопоту в сенсі програмування. Доведеться робити блок зіставлення ідентифікатора і вибірки інформації з файлу прайса. Тут є і ще один момент. Якщо прайс часто змінюється, відповідно інформація в кошику покупця може швидко застаріти і не відповідати дійсності. Значить, варто подумати про контроль дати. Дату, коли відвідувач поклав товар в корзину, теж доведеться зберігати в cookie, так як більше ніде. Якщо дати сильно розрізняються - варто попередити покупця про невідповідність. Інакше можуть відбутися прикрі казуси. Неприємно, коли замовлення робиться по тижневої давності ціною. Адже вона може не тільки впасти, але і збільшитися! Потім доведеться пояснюватися: Так що краще подбати про такі речі заздалегідь. Хоча, якщо прайс більш-менш постійний, турбуватися на варто.
Цифровим кодом дуже зручно вибрати номер позиції в прайсі. Цей номер, ясна річ, унікальний для кожного товару, а нам це і треба. І, крім того - за номером позиції легко витягти інформацію про товар з текстового файлу з прайсом. Досить вважати весь файл в масив:
$ File = "price.txt"; // до речі, розширення файлу може бути будь-яким
$ As = file ($ file);
І звернутися до рядка масиву з потрібним індексом:
$ Id - ідентифікатор. який нам потрібен. Правда, застосовуючи даний метод, нам не уникнути контролю дат, але це не так вже й погано.
Разом з ідентифікатором товару треба запам'ятовувати і кількість товару. Відповідно, при першому замовленні вводиться число 1. Далі бажано надати можливість довільно (в обмежених, звичайно, рамках) змінювати це число. Для перерахунку суми знадобиться кнопка, якщо вона буде першою після форми - спрацює і натискання на клавішу Enter. Дуже зручно - увів нове кількість товару і натиснув Enter для перерахунку.
Звичайно, необхідно продумати, як саме виводити інформацію про повну вартість замовлення. Не варто забувати про знижки і подарунки, якщо вони, звичайно, є у Вашому Інтернет-магазині. Добре впишуться сюди різні бонуси і інформація про доставку. Якщо вона безкоштовна - напишіть про це. Зайвим не буде.
Як бачите, на замовлення можна відреагувати практично відразу, як тільки онпоступіт. Це підвищує довіру клієнтів до магазину і позитивно позначається на репутації. Ось, як мені здається, і все для початку.
Дуже хочеться побажати не боятися самостійно займатися розробками в цій галузі. Проблем залишилося багато, але всі вони вирішуються, повірте. І, як правило - простіше виявляється самостійно розробити систему, ніж шукати і налаштовувати чужу.