Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

При удалении картинки из редактора удалять ее из базы данных. #129

Closed
sinergycode opened this issue Mar 20, 2018 · 31 comments
Labels

Comments

@sinergycode
Copy link

sinergycode commented Mar 20, 2018

Добрый день @vova07
В документации нашел callback который срабатывает при удалении изображения:
imageDeleteCallback.
Скажите пожалуйста как ее вставить в такие конструкции:

<?= $form->field($model, 'text')->widget(Widget::className(), [
        'settings' => [
            'lang' => 'ro',
            'plugins' => [
                'imagemanager',
              ]
         ],
]); ?>

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

@vova07
Copy link
Owner

vova07 commented Mar 20, 2018

Здравствуйте @sinergycode !
Вы спросили про удаление из БД, но я не уверен что я понял вас правильно.
Имеется ли введу что изображение хранится в БД либо же только УРЛ на это изображение?
В документации есть пример как можно использовать менеджер изображений с возможностью удаление самого файла, но я не уверен что это то что вам нужно.

Просто есть несколько понятий удаления изображения:

  • Из списка менеджера изображений.
  • В момент удаления картинки из самого редактора при нажатии на бхкспэйс.

Если уточните вопрос, то попробую ответить более корректно.

@sinergycode
Copy link
Author

Спасибо за ответ!
В изображении более детальное объяснение вопроса:
default

@vova07
Copy link
Owner

vova07 commented Mar 21, 2018

Чтобы подключить нужный вам обработчик надо использовать следующий код:

<?= $form->field($model, 'text')->widget(Widget::className(), [
        'settings' => [
            'lang' => 'ro',
            'plugins' => [
                'imagemanager',
              ],
              'imageDeleteCallback' => new \yii\web\JsExpression('function (url, image) { alert("Image was deleted!"); }'),
         ],
]); ?>

Готового функционала специально под этот случай нету, но вы можете использовать например дефолтный экшен DeleteFileAction на который нужно отправить AJAX запрос с названием файла в указанном в настройках параметром который по дефолту fileName.

Succes!

@sinergycode
Copy link
Author

sinergycode commented Mar 21, 2018

Спасибо за ответ.
Сегодня / завтра сделаю.
Succes!

@vova07
Copy link
Owner

vova07 commented Mar 21, 2018

Если надо будет можете повторно открыть этот репорт!

@vova07 vova07 closed this as completed Mar 21, 2018
@sinergycode
Copy link
Author

@vova07 добрый день!
При попытке реализовать функционал, есть проблемы:
javascript file:

function deleteimg(url) {
      var fileName = url.substring(url.lastIndexOf('/')+1,url.length);
      $.ajax({
        type: 'POST', 
        url: '/admin/app-admin/file-delete', 
        data: { 
            fileName: fileName
        }, 
        dataType:'json',
        success: function(response) {
            console.log('ok');
            console.log(response);
        },
        error: function(e) {
            console.log('not sent');
            console.log(e.responseText); 
        }
      });
}

AppAdminController:

    public function actions()
    {
        return [
            'images-get' => [
                'class' => 'vova07\imperavi\actions\GetImagesAction',
                'url' => 'http://telita.md/web/upload/redactor/', // Directory URL address, where files are stored.
                'path' => '@app/web/upload/redactor/', // Or absolute path to directory where files are stored.
            ],
            'image-upload' => [
                'class' => 'vova07\imperavi\actions\UploadFileAction',
                'url' => 'http://telita.md/web/upload/redactor/', // Directory URL address, where files are stored.
                'path' => '@app/web/upload/redactor/', // Or absolute path to directory where files are stored.
            ],
            'file-delete' => [
                'class' => 'vova07\imperavi\actions\DeleteFileAction',
                'url' => 'http://telita.md/web/upload/redactor/', // Directory URL address, where files are stored.
                'path' => '@app/web/upload/redactor/', // Or absolute path to directory where files are stored.
            ],
        ];
    }

_form.php (вид):

            'plugins' => [
                'imagemanager',
                'table',
            ],
            'imageDeleteCallback' => new \yii\web\JsExpression(
                    'function(url) {deleteimg(url);}'
            ),

Получаю следующую ошибку:
/admin/app-admin/file-delete 400 (Bad Request)
Bad Request (#400): Only DELETE AJAX request is allowed

Скажите пожалуйста в чем может быть причина.

@vova07
Copy link
Owner

vova07 commented Mar 22, 2018

@sinergycode приветствую!
Причина в вашей функции: deleteimg где вы вместо DELETE запроса делаете POST вот тут:

$.ajax({
    type: 'POST',
    ...

Дефолтный экшен редактора принимает только DELETE запрос вот он и ругается что не может ничего обработать в вашем случае.

@sinergycode
Copy link
Author

Благодарю @vova07,
заработало,
Succes!

@sinergycode
Copy link
Author

sinergycode commented Mar 22, 2018

@vova07 добрый день.

Появились 2 вопроса:

  1. При удалении фото появляется в консоли следующяя ошибка:
    The given range isn't in document. VM884:1

  2. Есть Блог с постами.
    Как при удалении поста, удалять на сервере и изображения поста ткоторые были загружены через imperavi редактор.
    На данный момент пытаюсь решить следующим образом:
    a). записать в базу данных название изображения, через событие:

            'imageUploadCallback ' => new \yii\web\JsExpression(
                    'function (image, json) { console.log(image, json); }'
            ),

но это событие не срабатывает

@vova07
Copy link
Owner

vova07 commented Mar 23, 2018

@sinergycode добрый день!

  1. Вероятнее всего это связанно с Jquery библиотекой: Range of document error #116
    Я не помню когда точно но кажется что та JS библиотека которая есть в моем виджете требует минимальную версию Jquery 3, надо будет проверить на днях.

  2. Раз вы делаете запись каждого изображения в БД то лучше делать это через экшен загрузки файла. Это значит что вам надо будет написать его самостоятельно по подобию этого файла: https://github.com/vova07/yii2-imperavi-widget/blob/2.0.3/src/actions/UploadFileAction.php#L62 и делать параллельно запись и в БД.

Несмотря на это я бы предложил бы идти более легким и разумным путем: загружайте лучше все файлы одно поста в подпапку в имени которого добавляйте его уникальный ИД чтобы при удалении поста можно было разом всю папку удалить. Делать это конечно тоже лучше на бэкенде а не в процессе работы с вашим фронтоном.

@sinergycode
Copy link
Author

  1. Ошибка некритичная или лучше добавить jquery 3 если в этом причина?

  2. Спасибо за совет - воспользуюсь Вашим методом.

@vova07
Copy link
Owner

vova07 commented Mar 23, 2018

  1. Это уже на ваше усмотрение. Плюс я не уверен до конца в чем проблема. Лично у меня я не смог это воспроизвести, но использовал я только 3-ю версию.

@sinergycode
Copy link
Author

Ок, спасибо!

@sinergycode
Copy link
Author

sinergycode commented Mar 23, 2018

  1. А как заполучить следующий id конкретной модели? Покопался в нете, но пока не нашел подходящего похода...

@sinergycode
Copy link
Author

Нашел отвтет:

<?php $lastModelId = Yii::$app->db->createCommand("
    SELECT `AUTO_INCREMENT`
    FROM  INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = DATABASE()
    AND   TABLE_NAME   = 'pages'
")->queryScalar();
    echo '<pre>' . print_r($lastModelId, true) . '</pre>';
    ?>

Может кому-то понадобится...

@vova07
Copy link
Owner

vova07 commented Mar 23, 2018

Мне кажется вы выбрали не самый лучший путь.

Я лично сделал бы так:

  • В момент заполнения нового поста все изображения я бы хранил в временной папке.
  • Как только пользователь нажимает на кнопку сохранить я бы отправлял данные на сервер для сохранения.
  • В момент сохранения поста после того как он был добавлен в БД я мы перенес временную папку в основную директорию с названием которое содержало бы уникальный идентификатор модели, или что угодно чтобы потом можно было найти эту папку. (Можно даже в БД сохранить её название.)

Удаление уже логично понятное из описанного процесса выше!

@sinergycode
Copy link
Author

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

В будущем сделаю вариант предложенный вами, СПАСИБО!

@sinergycode
Copy link
Author

@vova07 добрый день.

Сменил версию jquery: jQuery JavaScript Library v3.2.1

  1. The given range isn't in document. VM884:1 появляется тогда когда кликаю на изображение а потом удаляю ее.

  2. Также когда пытаюсь работать с таблицей (добавить или удалить ряд) появляется ошибка:
    Uncaught TypeError: $table.size is not a function
    Код в форме для таблицы:
    'plugins' => [
    'table',
    ],

@vova07
Copy link
Owner

vova07 commented Mar 26, 2018

Добрый день!

Видимо проблема именно в новой версии JQuery. Извиняюсь за конфуз.

  1. Я попробую на днях посмотреть эту ошибку, но тут конфликт именно у JS библиотеки поэтому я не уверен что смогу исправить.

  2. Подобный вопрос уже поднимали: Плагин "Table". Не работает редактирование таблицы. #121 там есть описанное решение проблемы.

Думаю вам лучше вернутся на прежний версию JQ чтобы избавить себя от лишних проблем.

Из-за того что библиотека JS сторонняя и уже устаревшая я не уверен что все ошибки можно будет исправить.

Спасибо за коммент!

@sinergycode
Copy link
Author

a) Если сделаю изменения в vendor, какие будут последствия и что делать чтобы не случились эти последствия?
b) Можно ли подключать 2 jquery одновременно? Или подключить jquery меньше 3 версии только для редактора?

@vova07
Copy link
Owner

vova07 commented Mar 26, 2018

a) Как только новая версия редактора будет релизнута, то весь код будет перекрыть при апдейте. Чтобы это избежать есть один неудобный вариант: перекрыть основной Asset виджета и использовать файлы библиотеки из своего хранилища. Либо сделать ПР и смежить в мастер. :)

b) Я уже давно не работаю с Yii2 по этому точно не уверен, но нет ничего невозможного.
Хотя решение сомнительное в моем понимании.

@sinergycode
Copy link
Author

sinergycode commented Mar 26, 2018

a). При апдейте любого виджета, будет осуществлен и update imperavi?
b). Этот вариант убираю.

@vova07
Copy link
Owner

vova07 commented Mar 26, 2018

a) Только если вы будете использовать composer update. В случае уникального обновления пакета composer update vendor/repository другие расширения не затрагиваются.

@sinergycode
Copy link
Author

Благодарю за ответ!

Удачи!

@sinergycode
Copy link
Author

Добрый день @vova07 ,
скажите пожалуйста что вы имели ввиду под:
"сделать ПР и смежить в мастер" ?

@vova07
Copy link
Owner

vova07 commented Mar 29, 2018

Добрый день @sinergycode !
Я имел введу что вы можете открыть Pull Request и я сделаю мердж и релиз новой версии.

@sinergycode
Copy link
Author

К сожалению не очень понимаю что надо делать (знаю только основные команды в git console)

А как можно реализовать это вариант:
перекрыть основной Asset виджета и использовать файлы библиотеки из своего хранилища?

@allcho
Copy link

allcho commented Feb 8, 2019

@vova07, Здравствуйте, а есть у вас рецепт, как удалять картинки из папки когда удаляешь полность пост со вставленными в него картинками

@vova07
Copy link
Owner

vova07 commented Feb 10, 2019

Здравствуйте @allcho !
К сожалению я уже очень давно не использую Yii2 в работе, по этому готовый код я предоставить не смогу.
Но самый базовый план могу описать.
Самый легкий путь это сохранять изображения постов в подпапках с названием ИД поста.

Для примера:

Posts:
1: Post 1
2: Post 2

Folders:
- files
-- 1
--- Image 1 for Post 1.jpg
--- Image 2 for Post 1.jpg
-- 2
--- Image 1 for Post 2.jpg
--- Image 2 for Post 2.jpg

Дальше в момент удаления поста, вам нужно просто удалить папку по ИД и все. Сделать это можно например через beforeDelete метод.

Другой подход это сохранять ссылки на файлы в БД в отдельной таблице, и потом в beforeDelete пробегаться по ним и удалять файлы вместе с записями, но это требует больше кода и бизнес логики.

Надеюсь мой ответ будет вам полезен.

Удачи!

@allcho
Copy link

allcho commented Feb 10, 2019

Здравствуйте @allcho !
К сожалению я уже очень давно не использую Yii2 в работе, по этому готовый код я предоставить не смогу.
Но самый базовый план могу описать.
Самый легкий путь это сохранять изображения постов в подпапках с названием ИД поста.

Для примера:

Posts:
1: Post 1
2: Post 2

Folders:
- files
-- 1
--- Image 1 for Post 1.jpg
--- Image 2 for Post 1.jpg
-- 2
--- Image 1 for Post 2.jpg
--- Image 2 for Post 2.jpg

Дальше в момент удаления поста, вам нужно просто удалить папку по ИД и все. Сделать это можно например через beforeDelete метод.

Другой подход это сохранять ссылки на файлы в БД в отдельной таблице, и потом в beforeDelete пробегаться по ним и удалять файлы вместе с записями, но это требует больше кода и бизнес логики.

Надеюсь мой ответ будет вам полезен.

Удачи!

Способ конечно хороший, спасибо. Но я зашул в тупик. Картинки сохрянятся при их загрузке, до того как я добавил пост. И я зашел в тупик, как это сделать, создават с ID постом, когда поста еще нет?

@vova07
Copy link
Owner

vova07 commented Feb 11, 2019

@allcho прочтите пожалуйста этот комментарий: #129 (comment)
Думаю он должен вам помочь!
Если не будет понятно, то я попробую перефразировать.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants