10 KiB
Шаг 1. Техническое решение для сайта Рыбсток
Решение
Проект Рыбсток делаем на чистом PHP без фреймворка.
Базовая связка:
- Backend: чистый PHP 8.2+ или PHP 8.3+
- База данных: MySQL или MariaDB
- Доступ к базе: PDO
- Frontend: HTML, CSS, JavaScript
- Админка: собственная админ-панель на PHP
- Шаблоны: обычные PHP-шаблоны
- Поиск на первом этапе: SQL-поиск с нормализацией русских слов и словарем синонимов
- Поиск на расширенном этапе: отдельный поисковый индекс или внешний движок, если понадобится
- Excel-выгрузка: CSV на первом этапе, XLSX через PHP-библиотеку или ручную генерацию позже
- Карты и адреса: Яндекс.Карты / Яндекс Геокодер / Яндекс Маршрутизация
- Email: SMTP-почта домена или внешний SMTP-сервис
Почему чистый PHP подходит
Чистый PHP подходит, если важны:
- быстрый запуск на обычном хостинге;
- понятный код без тяжелого фреймворка;
- простая передача проекта другому программисту;
- полный контроль над логикой фасовок, корзины, доставки и админки;
- минимум зависимостей;
- возможность быстро править проект вручную.
Важно: чистый PHP нужно писать структурно. Даже без фреймворка проект должен иметь понятные слои: маршруты, контроллеры, модели/репозитории, сервисы, шаблоны и админку. Иначе большой каталог, фасовки, промокоды и доставка быстро станут трудными для поддержки.
Что сейчас есть в папке проекта
В папке проекта создан стартовый каркас:
.git.vscodeПЛАН_ДЕЙСТВИЙ_РЫБСТОК.mdШАГ_1_ТЕХНИЧЕСКОЕ_РЕШЕНИЕ.md.env.env.example.gitignoreREADME.mdpublic/index.phppublic/assets/css/app.cssapp/bootstrap.phpapp/helpers.phpapp/Core/Env.phpapp/Core/Database.phpapp/Core/View.phpviews/layouts/main.phpviews/pages/home.phpadmin/index.phpdatabase/schema.sqlstorage/docs/
В .env внесены данные подключения к базе MariaDB. Сам файл закрыт от git через .gitignore.
Что нужно установить для разработки
На рабочем компьютере должны быть доступны:
- PHP 8.2 или новее, лучше PHP 8.3
- MySQL или MariaDB
- Веб-сервер: Apache или Nginx
- Git
Желательно:
- Open Server Panel, Laragon или другой локальный сервер для Windows
- phpMyAdmin или Adminer для работы с базой
- Composer только по желанию, если позже захотим подключить готовые библиотеки для SMTP, Excel или dotenv
Для чистого PHP Composer не обязателен на старте.
Рекомендуемая структура проекта
loveriba.ru/
app/
Config/
Controllers/
Core/
Models/
Repositories/
Services/
Validators/
admin/
controllers/
views/
public/
assets/
css/
js/
images/
index.php
storage/
uploads/
exports/
logs/
views/
layouts/
pages/
product/
catalog/
cart/
checkout/
emails/
database/
migrations/
seeders/
schema.sql
docs/
.env.example
README.md
Основные модули
Products- товарыProductVariants- фасовки и ценыCategories- категории и подкатегорииCart- корзинаCheckout- оформление заказаOrders- заказыPromocodes- промокоды и ограниченияDelivery- расчет доставкиCustomerAccess- вход по email-коду и история заказовCompareList- список сравнения до 10 товаровSearch- поиск и голосовой вводReviews- отзывы и рейтингPriceExport- прайс-листAdminSettings- настройки сайта, писем, доставки, счетчиков
Базовая структура базы данных
На втором шаге нужно спроектировать таблицы:
admins- администраторыcategoriesproductsproduct_variantsordersorder_itemspromocodespromocode_targetscustomer_login_codesreviewssite_settingspopular_productspromo_blocksdelivery_calculationsproduct_imagesproduct_search_terms
Важные технические решения
Фасовки
Фасовка должна быть отдельной таблицей, а не просто текстовым полем товара. Это важно, потому что у каждой фасовки своя цена, шаг количества, единица измерения и отображение в корзине.
Пример:
- товар: горбуша неразделанная;
- фасовка: пласт 10 кг;
- базовая единица: кг;
- цена за кг: 600 руб.;
- цена фасовки: 6000 руб.;
- шаг количества: 10 кг.
Корзина
Корзина должна хранить не просто товар, а конкретную фасовку товара.
Пример позиции:
product_idvariant_id- название товара
- название фасовки
- количество
- шаг количества
- цена за единицу
- цена за фасовку
- итог
Заказы
Заказ должен сохранять снимок данных на момент оформления:
- название товара;
- выбранная фасовка;
- цена;
- количество;
- итог;
- расчет доставки;
- примененный промокод.
Это нужно, чтобы изменение цены в каталоге не ломало старые заказы.
Доставка
Расчет доставки делаем отдельным PHP-сервисом DeliveryCalculator.
Он принимает:
- тип получения;
- адрес;
- сумму заказа;
- расстояние от МКАД;
- признак подъема.
И возвращает:
- стоимость доставки;
- порог бесплатной доставки;
- текстовое объяснение для клиента;
- технические данные для заказа.
Админка
Админка должна быть собственной, без лишних плагинов.
Минимальные разделы:
- товары;
- категории;
- фасовки;
- заказы;
- промокоды;
- акции;
- популярные товары;
- отзывы;
- настройки доставки;
- настройки писем;
- прайс-лист;
- страницы и тексты сайта.
Email вместо SMS
Все коды входа и письма отправляются только на email. SMS не используются.
Прайс-лист
На первом этапе можно сделать выгрузку CSV, который открывается в Excel. Если нужен именно .xlsx, подключим отдельную библиотеку или сделаем генератор XLSX.
Прайс должен собираться из опубликованных товаров и опубликованных фасовок. Каждая фасовка должна быть отдельной строкой, чтобы покупатель видел все цены.
Второй шаг
Следующий шаг: спроектировать базу данных и модели проекта под чистый PHP.
Нужно подготовить:
- Список таблиц.
- Поля каждой таблицы.
- Связи между таблицами.
- Правила расчета цены фасовки.
- Правила расчета доставки.
- Структуру собственной админки.
- Первичный SQL-файл
database/schema.sql.
После второго шага можно будет создавать файловую структуру проекта и начинать код.
Файловая структура уже создана на шаге 1, поэтому на шаге 2 можно сразу перейти к SQL-схеме, таблицам и первичным PHP-моделям.
Что нужно уточнить перед кодом
Минимально важные вопросы:
- Есть ли файл с товарами, ценами и фасовками: Excel, CSV или другая база?
- Есть ли фотографии товаров и склада?
- Какой email использовать для получения заказов?
- Есть ли логотип Рыбсток?
- Где будет размещаться сайт: обычный хостинг, VPS, Timeweb, Beget, Reg.ru, другой вариант?
- Нужно ли сразу делать импорт из Excel или на старте можно заносить товары через админку?
- Какой локальный сервер удобнее использовать: Open Server Panel, Laragon или другой?