Не удается получить значение из текстового ввода ActiveForm в контроллере после отправки под Yii2

Я сделал пользовательскую модель, и это Upload Form который расширяется Model, Я сделал копию на основе документации yii2 о UploadedFile но до сих пор работает тот загруженный файл, когда он сохраняется в web/uploads, Я сделал публичную собственность под названием $storeList, Я ожидал после того, как я позвоню $model->load((Yii::$app->request->post()) значение внутри формы будет присвоено $model->storeList но переменная просто пуста. Может кто-нибудь сказать мне, где я делаю неправильно?

Структура идет так. index.php загружается первым и включает select_package.php которая имеет вкладку, которая делает upload.php,

index.php:

<div id="uploadStatusFrame" class="uploadStatusFrame">
<?php
include('layouts/select_package.php');
?>
</div>

<button id="uploadButton" class="btn btn-success"style='position:relative; left:10px; top: -44px'>Upload to Server</button>

<script>
$('#uploadButton').click(function(){
$("#submitButton").trigger("click");
});
</script>

select_package.php:

<?=
Tabs::widget([
'id' => 'dashboardTab',
'options' => ['id' => 'mainTab',
'class' => 'nav nav-tabs',
'style' => 'font-size: 14px; font-weight: bold;border-bottom: none;',
],
'items' => [
[
'label' => 'New Firmware',
'active' => true,
'style' => 'font-size: 14px; font-weight: bold',
'options' => ['id' => 'tab1',
'class' => 'nav nav-tabs',
'style' => 'width:1044px;margin:1px;background:#428bca;
height:453px;border:2px solid #428bca;'
],
'content' => $this->render('/upload-package/upload', [
'model' => $model,
]),
],
]);
?>

UploadPackageController.php:

class UploadPackageController extends Controller
{
public $layout = "default";

public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
];
}

/**
* Lists all SystemConfig models.
* @return mixed
*/
public function actionIndex()
{
$model = new UploadForm;

if ($model->load(Yii::$app->request->post())) {
$model->imageFile = UploadedFile::getInstance($model, 'imageFile');
$model->storeList = UploadedFile::getInstance($model, 'storeList');     // **<<-- How should I handle this?**

if ($model->upload()){
return $this->render('index', [
'model' => $model,
'storeList' => $model->storeList,
]);
}
}

return $this->render('index', [
'model' => $model,
'storeList' => 'NONE',
]);
}
}

UploadForm.php:

class UploadForm extends Model
{
/**
* @var UploadedFile
*/
public $imageFile;
public $storeList;

public function rules()
{
return [

];
}

public function upload()
{
if ($this->validate()) {
$this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension);
return true;
} else {
return false;
}
}
}

upload.php

    <?= $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data',
'id' => 'fileSenderForm',
'name' => 'fileSenderForm',
]]) ?>

<?= $form->field($model, 'imageFile')->fileInput(); ?>

<?= $form->field($model, 'storeList')->textInput(['value' => 'ANY_VALUE_HERE'])->label(); ?>

<?= Html::submitButton('Submit', ['id' => 'submitButton']); ?>

<?php ActiveForm::end() ?>

1

Решение

Ваша проблема и ее причина

Если вы ознакомитесь с содержанием вашего запроса, вы увидите, что ваше значение отправлено, но не назначено в модель. Причиной этого является функция безопасности Yii2. Что за load()-метод называется массивным назначением атрибутов модели. Поскольку это может быть потенциально опасно, Yii требует, чтобы все атрибуты, которым присвоено массовое значение, были

  • подтверждено
  • или объявлен как «безопасный» (который в действительности также является валидатором)

Решение

Итак … вам нужно добавить атрибуты, которые вы хотите получить массивными через $model->load(Yii::$app->request->post()) для валидаторов. В противном случае они будут пропущены. Также удалите UploadedFile::getInstance для этого поля, поскольку этот атрибут явно не о файле.

Вы можете использовать реальный валидатор или просто объявить их безопасными. Ваш метод правил может выглядеть так:

public function rules() {
return [
[['storeList'], 'string', 'max'=>64],
];
}

или если вы не хотите указывать «настоящий» валидатор, просто объявите атрибут как безопасный:

public function rules() {
return [
[['storeList'], 'safe'],
];
}

Читайте об этом

Вы можете прочитать все подробности об этом в официальном руководстве здесь:

http://www.yiiframework.com/doc-2.0/guide-structure-models.html#massive-assignment

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector