Сохранение множества картинок в yii2

341
10 июня 2021, 22:30

Вообщем такое дело, решил потренироваться в traits и заодно избавится от одного расширения для сохранения картинок и в итоге написал такой код:

trait UploadFilesTrait {
public function upload($model_name, $field, $path_to_file = 'undefined', $oldFile = '') {
    if ($model_name->validate()) {
        $name_image = $model_name->$field->baseName . '.' . $model_name->$field->extension;
        $new_name_image = 'upload/temp_files/' . time() . '.' . $model_name->$field->extension;
        $path = 'upload/' . $path_to_file . '/' . $name_image;
        shell_exec('convert ' . $new_name_image . ' -auto-orient -quality 90 ' . $path);
        $model_name->$field->saveAs($path);
        @unlink($new_name_image);
        if ($oldFile != '') {
            @unlink($oldFile);
        }
        return true;
    } else {
        return false;
    }
}
public function uploadGallery($model_name, $field, $path_to_file = 'undefined') {
    if ($model_name->validate()) {
        foreach ($model_name->$field as $file) {
            $randTempNameFile = time() . '_' . $file->baseName;
            $name_image = $file->baseName . '.' . $file->extension;
            $new_name_image = 'upload/temp_files/' . $randTempNameFile . '.' . $file->extension;
            $path = 'upload/' . $path_to_file . '/' . $name_image;
            shell_exec('convert ' . $new_name_image . ' -auto-orient -quality 90 ' . $path);
            $file->saveAs($path);
            @unlink($new_name_image);
        }
        return true;
    } else {
        return false;
    }
}
}

Использую его в контроллере так:

$newTicketText = new TicketsText();
    if ($newTicketText->load(Yii::$app->request->post())) {
        $newTicketText->ticketsFiles = UploadedFile::getInstances($newTicketText, 'ticketsFiles');
        if ($newTicketText->ticketsFiles) {
            $this->uploadGallery($newTicketText, 'ticketsFiles','tickets');
        }
        $newTicketText->date_time = date('Y-m-d H:i:s');
        $newTicketText->user_type = TicketsText::TYPE_USER_NORMAL;
        $newTicketText->save(false);
        $newTextFiles = new TicketsFiles();
        foreach ($newTicketText->ticketsFiles as $ticketFile) {
            $newTextFiles->ticket_id = $newTicketText->ticket_id;
            $newTextFiles->ticket_text_id = $newTicketText->id;
            $newTextFiles->file = 'upload/tickets/' . $ticketFile;
            $newTextFiles->save(false);
        }
        return $this->refresh();
    }

Суть проблемы в том, что при попытке сохранение 2 или 3 картинок, сохраняется только одна последняя, при этом она есть только в базе физически она не сохраняется. Поэтому прошу помощи. Ну и часть кода где я цепляю картинки:

<div class="attach">
    <div class="attach__wrapp-label">
        <label class="attach__label" id="label-file1" for="file1">
            <?= Html::activeFileInput($newTicketText, 'ticketsFiles[]', ['multiple' => true, 'class' => 'left clip-input1 attach__input', 'id' => 'file1']); ?>
                <span class="attach__icon s-di-vertical-m"></span>
                <span class="attach__text s-di-vertical-m clip-input-txt1">Прикрепить файл</span>
            </label>
            <?= Html::error($newTicketText, 'ticketsFiles[]', ['class' => 'help-block']); ?>
        </div>
    </div>
Answer 1

Создавайте модель($newTextFiles = new TicketsFiles();) внутри цикла, то есть просто передвинте эту строчку на одну строчку вниз.

Answer 2

Ну вообще после нескольких десяток попыток я нашел в чем проблема и она не только в том, что я модель создавал вне цикла. Вообщем вот код:

if ($newTicket->load(Yii::$app->request->post())) {
    $newTicket->status = Tickets::STATUS_OPEN_TICKET;
    $newTicket->new_text = false;
    $newTicket->ticketFiles = UploadedFile::getInstances($newTicket, 'ticketFiles');
    $newTicket->save(false);
    $newTextTicket = new TicketsText();
    $newTextTicket->ticket_id = $newTicket->id;
    $date_time = new DateTime('now', new DateTimeZone("UTC"));
    $newTextTicket->date_time = $date_time->format('Y-m-d H:i:s');
    $newTextTicket->text = $newTicket->tickets_text;
    $newTextTicket->user_type = TicketsText::TYPE_USER_NORMAL;
    $newTextTicket->save(false);
    if ($newTicket->ticketFiles) {
        $manyFile = $this->uploadGallery($newTicket, 'ticketFiles','tickets');
        foreach ($manyFile as $ticketFile) {
            $newTextFiles = new TicketsFiles();
            $newTextFiles->ticket_id = $newTicket->id;
            $newTextFiles->ticket_text_id = $newTextTicket->id;
            $newTextFiles->type_file = $ticketFile['type'];
            $newTextFiles->file = $ticketFile['path'];
            $newTextFiles->name_file = $ticketFile['name'];
            $newTextFiles->save(false);
        }
    }
    return $this->refresh();
}

Правда тут еще данные добавились, но суть ясна.

READ ALSO
html_entity_decode возвращает строку в &lt;p&gt;

html_entity_decode возвращает строку в <p>

html_entity_decode возвращает строку в p, а мне нужно чтобы она не была обернута в тэг pКак можно это сделать? Потому как хочу на этот

81
Генератор в рекурсивной функции

Генератор в рекурсивной функции

Рекурсивная функция возвращает все папки из директории C:\Test, кроме вложенныхЧто необходимо изменить, чтобы генератор yield возвращал все папки,...

99
Не работает форма на спйте

Не работает форма на спйте

хотел бы узнать почему не работает форма на сайте, есть сайт http://vialusocom/product/wordpress-pennant При клике на купить в 1 клик вылезает модальное окно, хотел...

132
Как заставить nginx передать OPTIONS запрос в PHP?

Как заставить nginx передать OPTIONS запрос в PHP?

По какой то причине nginx отвечает на запросы OPTIONS кодом 405 и стандартной страницей ошибки nginxКак заставить nginx передать запрос в php?

93