Не важно что является владельцем, товар ли, статья и прочее, важно формирование связей. Пусть товары, и в таблице их описывающей товары получают уникальный идентификатор - первичный ключ с автоинкрементом.
Прежде чем определять структуру таблицы содержащую информацию об изображениях товаров нужно определиться со структурой каталога хранящего эти изображения. Если товаров много и скинуть все их изображения в одну папку, то работать с такой папкой будет трудно - файловые операции медленные и чем больше загружена файлами директория, тем медленнее будут эти процессы.
То есть, если структура каталога хранящего изображения разбита например на категории товаров, то таблица описывающая изображения помимо ссылки на товар и его изображение, также должна ссылаться и на категорию товара.
Непосредственно ссылка на товар может быть числовым значением - первичным ключом с автоинкрементом, а может быть и именем. Во втором случае уникальность имени изображения и id товара должны быть обеспечены только в пределах категорий товаров - уникальным индексом будет составной индекс "id категории, id товара, имя изображения".
Пусть для простоты все хранится в куче и таблица изображений хранит id изображения формирующихся автоматически при записи в таблицу, и id товара.
Форма для добавления нового товара в базу и редактирования существующего в базе товара может быть одна и та же. Отличие форм только в наличии идентификатора - при добавлении товара он не передается формой, при редактировании присутствует в форме - скрытое поле.
Работа над ошибками
В процессе добавления/редактирования возможны ошибки как в данных так и в загружаемых файлах. Сервер обязан проверять данные поступающие извне и возвращать клиенту ошибки. Загрузка файлов на сервер, это и большой объем данных, и длительный процесс. При этом, если файлы загружены без ошибок, а данные формы имеют ошибки, то повторное отправление формы после устранения ошибок также будет производиться с повторной загрузкой файлов на сервер. Чтобы избежать повторной загрузки, загруженные без ошибок и обработанные без ошибок файлы (изменение размеров, обрезка и т.п.) можно сохранить в сессии. Клиенту возвращается отчет об ошибках, включая и ошибки о загрузке/обработке файлов, а поле/поля выбора файла сбрасываются. Клиент может повторить выбор и загрузку только тех файлов, которые были загружены или обработаны с ошибками.
После удачного добавления/обновления товара файлы из сессии перемещаются в каталог.
Добавление нового товара
После удачного добавления информации о товаре, в таблицу товаров делается запрос на получение ID последней записи - идентификатора присвоенного товару. Производится запись в базу загруженных изображений с одновременным их перемещением в каталог - процесс нужно начинать с перемещения изображения в каталог, а запись в базу производить при отсутствии ошибки перемещения. В случае именования/хранения в этой таблице имен изображений как уникальных идентификаторов, добавление изображений в базу можно производить только циклом, так как после каждого добавления потребуется запрос на получение ID добавленного фото.
Если в таблице изображений формируемый уникальный идентификатор является не именем изображения, а идентификатором записи (однозначно указывает на индекс "id категории, id товара, имя изображения"), то добавления изображений в таблицу можно произвести одним запросом много-строчной вставкой. Имена изображений при этом формируются при обработке и сохранения изображений, а получение ID записи не требуется. Запись в изображений в базу нужно производить после успешного перемещения изображений в каталог, соответственно с обработкой ошибок.
В таблицу пишется и ранее полученный идентификатор товара.
Поле для загрузки изображений именуется как name="name_field[0][]". Поле с множественным выбором.
Редактирование товара
Форма имеет скрытое поле содержащее идентификатор товара.
Можно одновременно редактировать имеющиеся изображения (удалять их, замещая новыми) и добавлять новые.
Как и в случае добавления товара новые изображения можно загружать полем name="name_field[0][]" с множественным выбором. Поля редактирования имеющихся изображений при этом именуются как name="name_field[ID]", где ID - идентификатор изображения/записи. Этим полем можно выбрать только один файл. Также такое поле можно добавлять в форму только по требованию.
Сервер при получении файлов руководствуется индексом ключа name_field - если 0, то добавление новых изображений, если отлично от нуля, то замена старого изображения на новое. При замещении старого изображения новым нужно получить имя этого изображения в базе и после удачного его удаления, и замещения новым, произвести запись нового в базу.
Все остальные принципы обновления в базе такие же как и при добавлении, отличаются только операции - при обновлении ID уже известен.
Вот такие общие принципы могут быть.
Последний раз редактировалось laimas, 22.01.2018 в 14:21.
|