Моя функция обновления не устанавливает нулевые значения после сохранения

Мне помогли решить, как удалить файлы, загруженные с помощью пакета загрузки Cakephp. Однако, похоже, есть проблема с тем, как я обновляю значения полей photo и dir. Используя unlink, я смог полностью удалить файлы, но, похоже, возникает проблема, когда я пытаюсь установить значения равными нулю. Я сделал функцию, чтобы проверить это:

public function deletePhoto2($id)
{
    // $this->request->allowMethod(['post']);
    if ($this->request->is(['patch', 'post', 'put'])) {

        $brigada = $this->Brigadas
                    ->findById($id)
                    ->firstOrFail();

        $brigada->dir = null;
        $brigada->photo = null;

        if ($this->Brigadas->save($brigada)) {
            $this->Flash->success(__('Your team data has been saved.'));
            return $this->redirect(['action' => 'edit', $brigada->id]);
        }

        $this->set('brigada', $brigada);
    }
}

Перед сохранением я обнаружил, что значения $brigada->photo и $brigada->dir равны нулю, но значения не сохраняются. У меня есть несколько возможностей, которые я хочу изучить, но мои знания PHP мешают:

  1. Может я неправильно обновляю. Ссылка на сайт
  2. Мне может понадобиться использовать deleteCallback, который задокументирован здесь, но я не знаю, как это сделать. Я подумал, что это будет с $this->Brigadas->deleteCallback() или чем-то подобным, но я хотел бы сначала понять пример, поэтому я и спрашиваю. Я не нашел использования этих обратных вызовов ни в одном примере в Интернете, и документация по событиям для меня все еще немного эзотерична.

Вот как BrigadasTable.php настраивается для загрузки файлов:

    // http://josediazgonzalez.com/2015/12/05/uploading-files-and-images/
    $this->addBehavior('Josegonzalez/Upload.Upload', [
        'photo' => [
            'fields' => [
                'dir' => 'dir',
                'size' => 'photo_size', // defaults to `size`
                'type' => 'photo_type', // defaults to `type`
            ],

            'nameCallback' => function ($table, $entity, $data, $field, $settings) {
                if ($entity->gvCode){
                    $array = explode(".", $data['name']);
                    return strtolower($entity->gvCode) . '_' . date("Ymd-hisa") . '.jpg';

                } else{
                    $array = explode(".", $data['name']);
                    $newArray = array_pop($array);
                    return strtolower(join('_', $array)) . '_' . date("Ymd-hisa") . '.jpg';
                }
            },

            'transformer' =>  function ($table, $entity, $data, $field, $settings) {

                $extension = pathinfo($data['name'], PATHINFO_EXTENSION);

                // Store the thumbnail in a temporary file
                $tmp = tempnam(sys_get_temp_dir(), 'upload') . '.' . $extension;

                // Use the Imagine library to DO THE THING
                $size = new \Imagine\Image\Box(640, 640);
                $mode = \Imagine\Image\ImageInterface::THUMBNAIL_INSET;
                $imagine = new \Imagine\Gd\Imagine();

                // Save that modified file to our temp file
                $imagine->open($data['tmp_name'])
                    ->thumbnail($size, $mode)
                    ->save($tmp);

                $filenameTmp = explode('.', $data['name']);
                array_pop($filenameTmp);
                $filenameTmp = join('_', $filenameTmp) . '.jpg';
                // return debug($filenameTmp);

                // Now return the original *and* the thumbnail
                return [
                    $data['tmp_name'] => $filenameTmp,
                    $tmp => 'thumbnail-' . $filenameTmp,
                ];
            },

            'deleteCallback' => function ($path, $entity, $field, $settings) {
                // When deleting the entity, both the original and the thumbnail will be removed
                // when keepFilesOnDelete is set to false

                $entity->{$field} = null;

                return [
                    $path . $entity->{$field},
                    $path . 'thumbnail-' . $entity->{$field}

                ];
            },
            'keepFilesOnDelete' => false
        ]
    ]);

Спасибо!

Там написано, что спасло, а на самом деле нет? Или сохранение не работает?

Greg Schmidt 01.03.2019 23:24

Прошу прощения, что не ответил раньше, @GregSchmidt. Это сказал, что это сохранено (я бы отладил, вернулся ли функция успешно). Это просто не обновило ничего вообще. Я думаю, что я все правильно собирал, так как он редактировал вызов перед сохранением, но сразу после сохранения ничего не возвращал. Мне любопытна причина этого.

E. Velis 21.03.2019 23:13

Не уверен, что вы подразумеваете под «он отредактировал вызов перед сохранением, но сразу после сохранения ничего не вернул», поэтому я не могу комментировать, что могло пойти не так.

Greg Schmidt 21.03.2019 23:40

Извините, позвольте мне попробовать еще раз. Когда я отлаживаю до if ($this->Brigadas->save($brigada)), я получаю dir и photo как нуль, но не после функции сохранения.

E. Velis 22.03.2019 01:30

О, может быть, поведение загрузки настраивает их даже в этом случае? Попробуйте удалить поведение из модели перед сохранением в этом экземпляре.

Greg Schmidt 22.03.2019 16:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

$query = $this->Brigadas->query();
$query->update()
    ->set([
            'dir' => null,
            'photo' => null,
         ])
    ->where(<condition>)
    ->execute();

Если какой-либо из ваших столбцов json,

$query = $this->Brigadas->query();
$query->update()
    ->set([
            'dir = null',
            'photo' => null,
         ])
    ->where(<condition>)
    ->execute();

Это работает! Я так счастлив, большое спасибо! Должен ли я поместить свой unlink в другую функцию в контроллере или есть способ сделать это без извлечения записи? Что вы порекомендуете?

E. Velis 21.03.2019 21:15

@E.Velis Сначала запустить unlink, а затем обновить базу данных, кажется, имеет больше смысла.

Shylajhaa 22.03.2019 06:05

Другие вопросы по теме