Yii2 удалить файл из папки
Добрый день @vova07
В документации нашел callback который срабатывает при удалении изображения:
imageDeleteCallback.
Скажите пожалуйста как ее вставить в такие конструкции:
Если есть уже готовая настройка которая удаляет фото из базы данных при удалении из редактора, скажите пожалуйста как ею пользоваться.
The text was updated successfully, but these errors were encountered:
sinergycode commented Mar 21, 2018
vova07 commented Mar 21, 2018
Чтобы подключить нужный вам обработчик надо использовать следующий код:
Спасибо за ответ.
Сегодня / завтра сделаю.
Succes!
vova07 commented Mar 21, 2018
Если надо будет можете повторно открыть этот репорт!
sinergycode commented Mar 22, 2018
@vova07 добрый день!
При попытке реализовать функционал, есть проблемы:
javascript file:
Скажите пожалуйста в чем может быть причина.
vova07 commented Mar 22, 2018
@sinergycode приветствую!
Причина в вашей функции: deleteimg где вы вместо DELETE запроса делаете POST вот тут:
Дефолтный экшен редактора принимает только DELETE запрос вот он и ругается что не может ничего обработать в вашем случае.
sinergycode commented Mar 22, 2018
Благодарю @vova07,
заработало,
Succes!
Появились 2 вопроса:
При удалении фото появляется в консоли следующяя ошибка:
The given range isn't in document. VM884:1
Есть Блог с постами.
Как при удалении поста, удалять на сервере и изображения поста ткоторые были загружены через imperavi редактор.
На данный момент пытаюсь решить следующим образом:
a). записать в базу данных название изображения, через событие:
но это событие не срабатывает
vova07 commented Mar 23, 2018
Несмотря на это я бы предложил бы идти более легким и разумным путем: загружайте лучше все файлы одно поста в подпапку в имени которого добавляйте его уникальный ИД чтобы при удалении поста можно было разом всю папку удалить. Делать это конечно тоже лучше на бэкенде а не в процессе работы с вашим фронтоном.
sinergycode commented Mar 23, 2018
Ошибка некритичная или лучше добавить jquery 3 если в этом причина?
Спасибо за совет - воспользуюсь Вашим методом.
vova07 commented Mar 23, 2018
- Это уже на ваше усмотрение. Плюс я не уверен до конца в чем проблема. Лично у меня я не смог это воспроизвести, но использовал я только 3-ю версию.
sinergycode commented Mar 23, 2018
- А как заполучить следующий id конкретной модели? Покопался в нете, но пока не нашел подходящего похода.
sinergycode commented Mar 23, 2018
Может кому-то понадобится.
vova07 commented Mar 23, 2018
Мне кажется вы выбрали не самый лучший путь.
Я лично сделал бы так:
- В момент заполнения нового поста все изображения я бы хранил в временной папке.
- Как только пользователь нажимает на кнопку сохранить я бы отправлял данные на сервер для сохранения.
- В момент сохранения поста после того как он был добавлен в БД я мы перенес временную папку в основную директорию с названием которое содержало бы уникальный идентификатор модели, или что угодно чтобы потом можно было найти эту папку. (Можно даже в БД сохранить её название.)
Удаление уже логично понятное из описанного процесса выше!
sinergycode commented Mar 23, 2018
На данный моент выжымают сроки. А поскольку админ будет только 1 человек, то ошибок не должно быть. Максимум что может быть это сохранение ненужных директорий с фотографиями в случае если админ при создании поста загрузил фото но не нажал сохранить.
В будущем сделаю вариант предложенный вами, СПАСИБО!
sinergycode commented Mar 26, 2018
Сменил версию jquery: jQuery JavaScript Library v3.2.1
The given range isn't in document. VM884:1 появляется тогда когда кликаю на изображение а потом удаляю ее.
Также когда пытаюсь работать с таблицей (добавить или удалить ряд) появляется ошибка:
Uncaught TypeError: $table.size is not a function
Код в форме для таблицы:
'plugins' => [
'table',
],
Видимо проблема именно в новой версии JQuery. Извиняюсь за конфуз.
Думаю вам лучше вернутся на прежний версию JQ чтобы избавить себя от лишних проблем.
Спасибо за коммент!
sinergycode commented Mar 26, 2018
a) Если сделаю изменения в vendor, какие будут последствия и что делать чтобы не случились эти последствия?
b) Можно ли подключать 2 jquery одновременно? Или подключить jquery меньше 3 версии только для редактора?
vova07 commented Mar 26, 2018
a) Как только новая версия редактора будет релизнута, то весь код будет перекрыть при апдейте. Чтобы это избежать есть один неудобный вариант: перекрыть основной Asset виджета и использовать файлы библиотеки из своего хранилища. Либо сделать ПР и смежить в мастер. :)
b) Я уже давно не работаю с Yii2 по этому точно не уверен, но нет ничего невозможного.
Хотя решение сомнительное в моем понимании.
a). При апдейте любого виджета, будет осуществлен и update imperavi?
b). Этот вариант убираю.
vova07 commented Mar 26, 2018
a) Только если вы будете использовать composer update . В случае уникального обновления пакета composer update vendor/repository другие расширения не затрагиваются.
sinergycode commented Mar 26, 2018
Благодарю за ответ!
sinergycode commented Mar 29, 2018
Добрый день @vova07 ,
скажите пожалуйста что вы имели ввиду под:
"сделать ПР и смежить в мастер" ?
vova07 commented Mar 29, 2018
Добрый день @sinergycode !
Я имел введу что вы можете открыть Pull Request и я сделаю мердж и релиз новой версии.
sinergycode commented Mar 29, 2018
К сожалению не очень понимаю что надо делать (знаю только основные команды в git console)
А как можно реализовать это вариант:
перекрыть основной Asset виджета и использовать файлы библиотеки из своего хранилища?
@vova07, Здравствуйте, а есть у вас рецепт, как удалять картинки из папки когда удаляешь полность пост со вставленными в него картинками
vova07 commented Feb 10, 2019
Здравствуйте @allcho !
К сожалению я уже очень давно не использую Yii2 в работе, по этому готовый код я предоставить не смогу.
Но самый базовый план могу описать.
Самый легкий путь это сохранять изображения постов в подпапках с названием ИД поста.
Дальше в момент удаления поста, вам нужно просто удалить папку по ИД и все. Сделать это можно например через beforeDelete метод.
Другой подход это сохранять ссылки на файлы в БД в отдельной таблице, и потом в beforeDelete пробегаться по ним и удалять файлы вместе с записями, но это требует больше кода и бизнес логики.
Надеюсь мой ответ будет вам полезен.
allcho commented Feb 10, 2019
Здравствуйте @allcho !
К сожалению я уже очень давно не использую Yii2 в работе, по этому готовый код я предоставить не смогу.
Но самый базовый план могу описать.
Самый легкий путь это сохранять изображения постов в подпапках с названием ИД поста.Для примера:
Дальше в момент удаления поста, вам нужно просто удалить папку по ИД и все. Сделать это можно например через beforeDelete метод.
Другой подход это сохранять ссылки на файлы в БД в отдельной таблице, и потом в beforeDelete пробегаться по ним и удалять файлы вместе с записями, но это требует больше кода и бизнес логики.
Надеюсь мой ответ будет вам полезен.
Удачи!
Способ конечно хороший, спасибо. Но я зашул в тупик. Картинки сохрянятся при их загрузке, до того как я добавил пост. И я зашел в тупик, как это сделать, создават с ID постом, когда поста еще нет?
Кнопка в админке
В админке на стадии создания/редактирования модели требуется прикрутить кнопку с JS скриптом - файл.
Как удалить копирайт Джумла в админке.
Подскажите пожалуйсто как удалить копирайт Джумла 1.5 в Админке?
Не работает кнопка "Import Image" в админке шаблона
Здравствуйте. Установил шаблон WP на локальную машину. Настраивал, изменял контент под свои.
Кнопка, открывающая предыдущую картинку из папки
Я читаю картинки из папки. Для того чтобы открыть следующую картинку у меня есть процедура : .
P.S. я в этом новичек, сможете если что объяснить?) worldandlife, Самый простой вариант - это делать на каждое действие отдельный action.
Как работает сам behavior. Сохранение картинки происходит таким образом
Т.е. если при сохранении сущности в поле image (которое мы указали в настройках подключения behavior 'attribute' => 'image',) содержится экземпляр класса UploadedFile, то он сохраняет этот файл, в БД записывая имя файла.
behavior сам делает присваивание $image->image = UploadedFile::getInstance($image, 'image'); на beforeValidate(). Естественно при удалении сущности PortfolioImage файл тоже удалится.
Но если вы хотите сделать это одной формой, чтоб потом нажал на кнопку и применились все изменения, то это немного сложнее. Нужно идти совсем другим путем. А именно применить другой архитектурный подход. Тут долго объяснять попытаюсь рассказать в кратце.
Нужно вынести логику самой операции в отдельный класс. И создать отдельный класс формы.
При таком подходе мы предполагаем, что картинок может быть немного, либо есть ограничение. Иначе лучше было бы делать все-таки отдельными action-ами. Добавил для примера еще одно поле $title в портфолио, для демонстрации.
Суть в том, что проект тесно завязан на одном вендоре, не выходит stable релизов. Нужно подключить данный компонент c этой папки(пример: app/название_вендора), сохранив старый namespace.Компонент подключается в config/web, в секции modules. Как это можно реализовать?
Ответы (1 шт):
Покажу на примере модуля kartik-v/yii2-widget-datepicker . Вынесем этот модуль из папки vendor в папку common/modules .
1) Удаляем строку из секции require в composer.json которая отвечает за модуль, который мы выносим. То есть, в нашем примере, удаляем строку "kartik-v/yii2-widget-datepicker": "@dev",
2) Открываем файл vendor/composer/autoload_psr4.php и находим внутри него строку, отвечающую за выносимый модуль (в нашем примере эта строка - 'kartik\\date\\' => array($vendorDir . '/kartik-v/yii2-widget-datepicker'), ).
3) Создаём внутри composer.json на одном уровне с секциями require и require-dev новую секцию autoload (если её нет). Внутри этой секции создаём ещё одну секцию psr-4 и уже внутрь неё помещаем только что найденную строку из файла vendor/composer/autoload_psr4.php с небольшими изменениями (нужно заменить $vendorDir на путь до папки где будет располагаться модуль и некоторые другие изменения).
Пример получившейся секции:
4) Открываем файл vendor/yiisoft/extensions.php и находим в нём блок с нашим модулем. В нашем случае блок выглядит так:
5) Открываем файл конфигурации ( common/config/main.php или config/web.php ). Внутрь файла на одном уровне с components и modules создаём новую секцию extensions и присоединяем внутри только что найденный блок массива (с небольшим изменением, схожим с шагом 3, то есть заменяем $vendorDir на путь до папки где будет располагаться модуль) к тому же файлу из которого мы его скопировали (так сразу слёту возможно непонятен этот шаг, но с опытом вынесения модулей придёт понимание).
Пример получившейся секции:
6) Делаем composer update и наслаждаемся результатом. Теперь этот модуль находится в нашем проекте, и мы можем изменять его код не волнуясь за то, что изменения слетят после обновления компосера.
Кнопка в админке
В админке на стадии создания/редактирования модели требуется прикрутить кнопку с JS скриптом - файл.
Как удалить копирайт Джумла в админке.
Подскажите пожалуйсто как удалить копирайт Джумла 1.5 в Админке?
Не работает кнопка "Import Image" в админке шаблона
Здравствуйте. Установил шаблон WP на локальную машину. Настраивал, изменял контент под свои.
Кнопка, открывающая предыдущую картинку из папки
Я читаю картинки из папки. Для того чтобы открыть следующую картинку у меня есть процедура : .
P.S. я в этом новичек, сможете если что объяснить?) worldandlife, Самый простой вариант - это делать на каждое действие отдельный action.
Как работает сам behavior. Сохранение картинки происходит таким образом
Т.е. если при сохранении сущности в поле image (которое мы указали в настройках подключения behavior 'attribute' => 'image',) содержится экземпляр класса UploadedFile, то он сохраняет этот файл, в БД записывая имя файла.
behavior сам делает присваивание $image->image = UploadedFile::getInstance($image, 'image'); на beforeValidate(). Естественно при удалении сущности PortfolioImage файл тоже удалится.
Но если вы хотите сделать это одной формой, чтоб потом нажал на кнопку и применились все изменения, то это немного сложнее. Нужно идти совсем другим путем. А именно применить другой архитектурный подход. Тут долго объяснять попытаюсь рассказать в кратце.
Нужно вынести логику самой операции в отдельный класс. И создать отдельный класс формы.
При таком подходе мы предполагаем, что картинок может быть немного, либо есть ограничение. Иначе лучше было бы делать все-таки отдельными action-ами. Добавил для примера еще одно поле $title в портфолио, для демонстрации.
Читайте также: