Показать сообщение отдельно
  #6 (permalink)  
Старый 22.01.2018, 13:58
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

Прежде чем определять структуру таблицы содержащую информацию об изображениях товаров нужно определиться со структурой каталога хранящего эти изображения. Если товаров много и скинуть все их изображения в одну папку, то работать с такой папкой будет трудно - файловые операции медленные и чем больше загружена файлами директория, тем медленнее будут эти процессы.

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

Непосредственно ссылка на товар может быть числовым значением - первичным ключом с автоинкрементом, а может быть и именем. Во втором случае уникальность имени изображения и 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.
Ответить с цитированием