Некоторые пользователи и разработки Netcat замечали, что иногда файлы из объектов с полем множественная загрузка файлов исчезают без видимых причин. Объект и компонент не редактировались, а файлов нет, нет и записей о них в базе, нет их и в папке netcat_files.
Немного теории (для понимания сути процесса)
Множественная загрузка файлов (МЗФ) реализована следующим образом: при добавлении поля типа МЗФ в таблице messageXX создается поле, соответствующее полю компонента Netcat, при этом само поле в таблице всегда остается пустым, а информация о загруженных файлах записывается в таблицу Multifield.
В эту таблицу записываются следующие данные:
- ID - auto_increment уникальный номер файла;
- Field_ID – номер поля компонента из таблицы Field;
- Message_ID – номер объекта которому принадлежит файл;
- Priority – приоритет вывода файла в объект, в версии 4 не используется;
- Name – описание файла, т.е. не имя файла а то, что пишется в отдельное поле над файлом;
- Size - размер;
- Path – путь, куда сохраняется файл;
- Preview – путь для уменьшенного файла, используется только для картинок.
Как мы видим, невозможно посмотрев на строку из этой таблицы понять к какому объекту какого компонента принадлежит данный файл. Для этого нам нужно посмотреть в таблице Field соответствие Field_ID нашего файла и компонента.
Теперь страшный секрет Netcat: при удалении объектов из любого компонента скрипт делает запрос к таблице Multifield ищет там по полю Message_ID (!) записи и удаляет их, а также файлы, пути до которых берет из полей Path и Preview. Тем самым удаляются все файлы из поля типа МЗФ у объектов, которым "посчастливилось" иметь одинаковый ID с удаляемым в данный момент объектом совершенно другого компонента.
Приведем жизненный пример
На сайте некоторого фотографа есть всего два компонента:
- простая страница, в которой он в простой и непринужденной форме записывает свои мысли о фотографии и о жизни (при этом на каждую мысль он создает отдельный объект, чтобы не запутаться в них :));
- фотогалерея, в которую он также просто и непринужденно загружает свои работы на каждую тему создавая отдельный объект и загружая туда штук по сто фотографий.
И вот в один прекрасный день фотограф подумал, что мысль которую он записал в объект простой страницы с ID = 14 крамольна, после чего решил удалить этот самый объект, и удалил; а в след за ним удалились и все фотографии из объекта с ID = 14 в фотогалерее: и из базы, и с хостинга. А их там между прочем было целых 78 штук… Печально получилось.
Вернемся к технике.
Мы выяснили, что условия по поиску файлов, связанных с объектом, не достаточны и не однозначны. По этому их надо исправить!
А алгоритм таков:
- найти все номера полей типа МЗФ компонента, объект которого мы хотим удалить;
- cделать запрос к таблице Multifield с условием совпадения ID объекта и номеров полей (из прошлого пункта) и поля Field_ID;
- если мы получили результат, то удалить записи из Multifield и сами файлы
Вы сами можете реализовать это в файле message.php в папке /netcat/ (начало удаления файлов из поля МЗФ находится в районе 337 строчки) или, если вы используете версию 4.72, заменить этот файл на тот, который уже поправили мы (с обязательным сохранением оригинала на всякий случай):
message.php_472PhPh-edited.zip (скачиваний: 768)
Оставить комментарий