UploadForm Yii2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Loving
Сообщения: 7
Зарегистрирован: 2017.04.27, 11:03

UploadForm Yii2

Сообщение Loving »

Встала задача сделать загрузчик файлов, но перед загрузкой на сервер нужно дать возможность пользователю менять тайтл (не назву файла). Я написал js скрипт который при выборке файлов добавляет инпут с тайтлами и эти тайтлы отправляю в модель uploadform вместе с файлами. Проблема в том, что в атрибут который я создал для этих тайтлов ничего не пишется, хотя в пост запросе они есть.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: UploadForm Yii2

Сообщение futbolim »

Что-то не понял, в чём проблема?
"атрибут который я создал для этих тайтлов" - о чём тут говорится? Какие атрибуты?
Goog1e
Сообщения: 97
Зарегистрирован: 2016.01.18, 20:02

Re: UploadForm Yii2

Сообщение Goog1e »

Колесо строится))) Дело мутится))
Что за назва?
Как делаете сохранение?
Код в студио
Loving
Сообщения: 7
Зарегистрирован: 2017.04.27, 11:03

Re: UploadForm Yii2

Сообщение Loving »

Ето форма в которую я загружаю файли:

Код: Выделить всё

{{ use('/app/widgets/Alert') }}

<div class="site-index">

    <div class="body-content">
        <div class="row">
            <div class="col-lg-12">
                <h2>Add new customer</h2>

                <div class="row">
                    <div class="col-lg-12">
                        {% set form = form_begin({
                        'id': 'addNewCustomerForm',
                        'options': {
                        'data-pjax': '',
                        'class': 'form-horizontal',
                        'enctype': 'multipart/form-data'
                        },
                        'fieldConfig': {
                        'template': '
                                    {label}
                                    <div class="col-lg-5">
                                        {input}
                                        {error}
                                    </div>',
                        'labelOptions': {'class': 'col-lg-2 control-label'},
                        }
                        }) | raw %}

                        <div class="panel panel-default">
                            <div class="panel-heading">Customer info</div>
                            <div class="panel-body">
                                {{ form.field(model, 'customerLogin') | raw }}
                                {% if showPartnersList == true %}
                                    {{ form.field(model, 'customerPartnerId').dropDownList(model.getPartnersArray()) | raw }}
                                {% endif %}
                                {{ form.field(model, 'customerLocationId').dropDownList(model.getLocationsArray()) | raw }}
                                {{ form.field(model, 'customerCategory').dropDownList(model.getCategoriesArray()) | raw }}
                                {{ form.field(model, 'customerPassword') | raw }}
                                {{ form.field(model, 'customerName') | raw }}
                                {{ form.field(model, 'customerEmail') | raw }}
                                {{ form.field(model, 'customerPhone') | raw }}
                                {{ form.field(model, 'customerStreet1') | raw }}
                                {{ form.field(model, 'customerZipCode') | raw }}
                                {{ form.field(model, 'customerCity') | raw }}

                                {{ form.field(model, 'customerDateAdd')
                                .widget(DatePicker.classname(), {
                                    'dateFormat': 'yyyy-MM-dd',
                                    'options': {
                                        'class': 'form-control'
                                    }
                                }) | raw }}
                            </div>
                        </div>

                        <div class="panel panel-default">
                            <div class="panel-heading">Service info</div>
                            <div class="panel-body">
                                {{ form.field(model, 'serviceTariffId').dropDownList(model.getInternetTariffsArray(), {
                                    'id': 'serviceTariffId',
                                    'prompt': 'Choose tariff...'
                                }) | raw }}

                                {{ form.field(model, 'serviceDescription').textInput({
                                    'id': 'serviceDescription'
                                }) | raw }}

                                {{ form.field(model, 'serviceQuantity') | raw }}
                                {{ form.field(model, 'serviceUnit') | raw }}

                                {{ form.field(model, 'serviceUnitPrice').textInput({
                                    'id': 'serviceUnitPrice'
                                }) | raw }}

                                {{ form.field(model, 'serviceDiscount').checkbox({
                                    'id': 'serviceDiscount',
                                    'template': '
                                        {label}
                                        <div class="col-lg-5">
                                            {input}
                                            {error}
                                        </div>'
                                }).label(model.getAttributeLabel('serviceDiscount'), {
                                    'class': 'col-lg-2 control-label'
                                }) | raw }}

                                {{ form.field(model, 'serviceDiscountPercent', {
                                    'options': {
                                        'class': 'discount form-group hide',
                                    }
                                }) | raw }}

                                {{ form.field(model, 'serviceDiscountStartDate', {
                                    'options': {
                                        'class': 'discount form-group hide'
                                    }
                                })
                                .widget(DatePicker.classname(), {
                                    'dateFormat': 'yyyy-MM-dd',
                                    'options': {
                                        'class': 'form-control'
                                    }
                                }) | raw }}

                                {{ form.field(model, 'serviceDiscountEndDate', {
                                    'options': {
                                        'class': 'discount form-group hide'
                                    }
                                })
                                .widget(DatePicker.classname(), {
                                    'dateFormat': 'yyyy-MM-dd',
                                    'options': {
                                        'class': 'form-control'
                                    }
                                }) | raw }}

                                {{ form.field(model, 'serviceDiscountText', {
                                    'options': {
                                        'class': 'discount form-group hide'
                                    }
                                }) | raw }}
                            </div>
                        </div>

                        <div class="panel panel-default">
                            <div class="panel-heading">Payment info</div>
                            <div class="panel-body">
                                {{ form.field(model, 'paymentAmount') | raw }}
                                {{ form.field(model, 'paymentComment') | raw }}
                            </div>
                        </div>
                        {{ form.field(files, 'names').textInput({
                            'value' : '123'
                        }) | raw }}
                        <div class="panel panel-default">
                            <div class="panel-heading">Attachments</div>
                            <div class="panel-body">
                                {{ form.field(files, 'files[]').fileInput({
                                    'multiple': true,
                                }) | raw }}
                                <small>5 files maximum.</small></br>
                                <div id="list" class="col-lg-4"></div>
                            </div>
                        </div>
                        <div>
                            {{ alert_widget() | raw }}
                        </div>

                        <div class="form-group">
                            <div class="col-lg-12 text-center">
                                {{ Html.submitButton('Add', {
                                    'class': 'btn btn-primary',
                                    'name': 'add-button'
                                }) | raw }}
                            </div>
                        </div>

                        {{ form_end() }}
                    </div>
                </div>

            </div>
        </div>
    </div>
</div>
Loving
Сообщения: 7
Зарегистрирован: 2017.04.27, 11:03

Re: UploadForm Yii2

Сообщение Loving »

А ето форма обработчик

Код: Выделить всё

class UploadForm extends Model
{
    /**
     * @var UploadedFile[]
     */
    public $names;
    public $files;

    public function rules()
    {
        return [
            ['names', 'string'],
            [['files'], 'file', 'skipOnEmpty' => true, 'extensions' => 'png, jpg, doc, pdf, xls, docx, xlsx, txt', 'maxFiles' => 5],
        ];
    }

    public function upload()
    {
        if ($this->validate()) {
            foreach ($this->files as $file) {
                $file->saveAs(Yii::$app->getBasePath() . '/uploads/' . $file->baseName . '.' . $file->extension);
            }
            return true;
        } else {
            return false;
        }
    }

    public function uploadForCustomer($customer_id)
    {
        if ($this->validate()) {
            foreach ($this->files as $key => $file) {
                if (!empty($file)) {
                    $name = self::generateRandomString(16) . '.' . $file->extension;
                    $file->saveAs(Yii::$app->getBasePath() . '/uploads/' . $name);
                    $attachment = new CustomerAttachments();
                    $attachment->customer_id = $customer_id;
                    $attachment->file_title = $this->getTitle() . '.' . $file->extension;
                    $attachment->file_name = $name;
                    $attachment->date = date('Y-m-d');
                    $attachment->save();
                }
            }
            return true;
        } else {
            return false;
        }
    }

    public static function generateRandomString($length = 10)
    {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $charactersLength = strlen($characters);
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }
        return $randomString;
    }

    public function getTitle()
    {
        if (empty($this->names)) {
            return '321';
        } else {
            return $this->names;
        }
    }
}
Loving
Сообщения: 7
Зарегистрирован: 2017.04.27, 11:03

Re: UploadForm Yii2

Сообщение Loving »

Никто не знает в чем может быть проблема или я задал глупый вопрос?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: UploadForm Yii2

Сообщение Nex-Otaku »

Я так понял, поля из POST не загружаются в модель?
Чтобы они загружались в модель, их надо в "rules" для модели прописать, либо валидатором либо просто "safe".
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: UploadForm Yii2

Сообщение ElisDN »

Код: Выделить всё

if ($model->load(...)) {
    $model->files = UploadedFile::getInstances($model, 'files');
    if ($model->validate()) {
        ...
    }
}
Loving
Сообщения: 7
Зарегистрирован: 2017.04.27, 11:03

Re: UploadForm Yii2

Сообщение Loving »

ElisDn благодарю, 5 минут назад, понял где косяк.)
Ответить