План разработки сайта

Собираем шаблон

1 где взять шаблон для сайта? Примеры.

FREE WEBSITE TEMPLATES
Бесплатные Шаблоны Сайтов
HTM-FREE-TEMPLATES
Шаблоны по категориям

2 скачать html шаблон разместить его в папке html дублируем папки css fonts images js в корень сайта

3 разметку главной страницы скопировать в индексную страницу будущего сайта

4 Провести анализ общих частей разметки всех страниц html шаблона. В детальном сравнении поможет программа winMerge.

5 разрезаем html-шаблон на head header footer и помещаем эту разметку в файлы в папку /template/ Также возможно вам придётся выделить части: slider sidebar


Создаём файловую структуру

1 создаём файловую структуру сайта.
У нас уже есть index.php и папки /template/ и /html/

2 в корне создаём файл core.php - где стартуем сессию и подключаемся к БД через PDO.

3 создаём файл setting.php - тут будем прописывать переменные путей для сайта, подключать файл core.php.

4 Все php скрипты страниц, кроме индексной, буду хранить в папке page, чтобы не засорять корневую папку сайта. Дополняем структуру страниц:
В папке /page/ - about, authorise, register, news, team
В папке /form/ - do_auth, do_reg, do_order, add_to_basket

5 Каталог товаров и коммерческую структуру вынесем в отдельную папку /catalog/.
Где разместим пять файлов: index.php, category.php, product.php, basket.php, order.php

6 На каждой странице в папке /page/ и на индексной подключаем setting.php и файлы шаблона через require_once();

7 Дораскидываем разметку с остальных страниц html шаблона по созданным страницам если между ними есть соответствие. Если нет, то недостающие контентные части придётся собрать на страницах из типовых блоков вёрстки

8 при необходимости, если сайт лежит не в корне домена или вы переложили часть страниц по пути /page/ нужно прописать правильные пути к картинкам, стилям, скриптам, ссылкам используйте для этого:
$setting['TEMPLATE_PATH'] = $_SERVER['DOCUMENT_ROOT'] . '/путь к папке/вашего сайта/относительно домена/';


База данных

1 Создаём базу данных и таблицы (подключение у нас уже есть).

2 setting - таблица настроек сайта
колонки: code, value. code - primary
наполняем данными: site_name, template, phone, email

3 menu_type - типы меню на сайте
колонки: code, name. code - primary

4 menu_item - элементы меню
колонки: id, link, name, menu_type, class, parent, sort
id - AI + primary
Пример заполнения:
2, page/plan.php, План, account, fa-star, 0, 50

5 category - id, type, code, name, parent, image, description
id - AI + primary

6 product - id, code, name, category_id, image, description
id - AI + primary

Пока нам этого хватит, позже по необходимости добавим другие таблицы


Вывод из базы данных

1 в setting.php получим данные из таблицы setting
$query = 'SELECT * FROM setting';
$setting['SITE_INFO'] = $pdo->query($query)->fetchAll(PDO::FETCH_KEY_PAIR);

это единственный запрос который мы выполняем в файле общем для всех страниц, так как получаем настройки для всего сайта

2 теперь в нашем шаблоне мы можем вывести телефон и почту, примерно так:
echo $setting['SITE_INFO']['phone'];

3 Выводим на сайт меню из БД.
Для этого делаем выборку
$query = 'SELECT * FROM menu_item WHERE menu_type = "account"';
$setting['ACCOUNT_MENU'] = $pdo->query($query)->fetchAll();

4 И затем вывод циклом
foreach ($setting['ACCOUNT_MENU'] as $key => $item) {...}

5 Так же через запрос выводим категории каталога на странице /catalog/index.php
не забывая поставить ссылку на саму категорию:
href="/catalog/category.php?code=< ? =$item['code']; ? >"

6 По тому же принципу выводим товары на странице категории
с учётом кода категории полученной из $_GET['code'];
Используем подготовленные запросы, так как есть данные запроса получаемые из вне нашей системы.

7 выводим детальную страницу товара

8 Вывод меню с активностью пунктов


Сессии и авторизация

1 Для запуска сессии в файле core.php самой первой строкой стартуем сессии:
session_start(['cookie_lifetime' => 86400]);
Длительность жизни составляет 1 день, можно сделать меньше на ваше усмотрение.

2 Перетаскиваем шаблоны страниц логина и регистрации

3 У форм выставляем метод POST и action - ставим на скрипт обработчик

4 В БД у поля password длину выставляем по длине хэша, в нашем случае - 60

5 Обработчики берём отсюда:
https://q-pax.ru/blog/erid/it/back/php/php_reg_autorise/

6 Логика обработчика - собрать ошибки в $error, в случае успеха заполняем $success и подключить страницу с формами

7 в случае успеха вместо формы выводим сообщение об успешной регистрации,
а у логина в случае успеха делаем редирект на страницу аккаунта

8 все ошибки выводим циклом перед формой

9 Создаём ссылку для выхода на скрипт /page/logout.php


Создаём админку

1 создаём шаблон для админки в /template/admin/

2 создаём папку для админки: /admin/

3 создаём страницы в /admin/: index.php, denied.php

4 создаём страницы в /admin/: crud_category.php, crud_user.php, crud_product.php.
на индексной странице выставляем ссылки на эти страницы

5 На каждой странице делаем ссылку на добавление новой записи

6 На каждой странице делаем выборку данных из соответствующей таблицы
для основной страницы каталога это будет таблица категорий
А для страницы категории и товара - таблица product
$query = 'SELECT * FROM category WHERE 1';
$result = $pdo->prepare($query);
$result->execute([]);
$data = $result->fetchAll(PDO::FETCH_ASSOC);

7 и размещаем данные в html таблицу,
так же как мы выводили эти данные на страницах каталога.
добавляем в строку записи ссылки на редактирование и удаление.

foreach ($data as $element) {
foreach ($element as $field) {
// тут выводим ячейку с данными
}
// сюда добавляем ячейку с ссылками на редактирование и удаление.
}


Пагинация

1 как создать пагинатор для страницы - читаем тут

2 используем пагинатор и в административной и в публичной части сайта.


Форма добавления и редактирования

1 описание работы с примерами кода смотрим тут

2 Нужно правильно выставить ссылки на форму на страницах crud

3 Выбрать структуру конкретной таблицы из information_schema.COLUMNS по параметру $_GET['table']

4 Создать разметку самой формы не забыв про параметр enctype="multipart/form-data" для передачи файлов

5 Написать обработку переданных данных

6 Создать модели для полей селектов и файлов

7 Вывести эти поля

8 написать для специальных полей обработчик. Например, копирование в нужную папку из временной, для загруженных файлов.


Корзина и заказы

1 добавляем на кнопку аттрибуты
href="/catalog/add_to_cart.php"
data-id="< ? =$item['id']; ? >"

2 пишем js отправляющий post запрос с id товара на указанный скрипт /catalog/add_to_cart.php

3 в скрипте пишем
require_once('../setting.php');
if ($_POST['id']) {
$_SESSION['cart'][$_POST['id']] = $_SESSION['cart'][$_POST['id']] ? $_SESSION['cart'][$_POST['id']] + 1: 1;
echo '< p class="btn btn-default" style="margin-bottom: 25px;" >Товар добавлен в корзину< / p>';
}

4 На странице корзины выводим товары с id указанными в
array_keys($_SESSION['cart'])

5 На кнопку Оформить заказ вешаем ссылку на скрипт в котором все данные из Сессии записываем в БД в таблицу заказов,
добавляя дату, телефон, стоимость по товарам и общую стоимость, так как цена может быть в будущем изменена - но это не должно сказываться на уже оформленных заказах.
И пользователя в поле заказа - если он авторизован.

6 на странице аккаунта - выводим список заказов конкретного пользователя и информацию по этим заказам.