Файл Yii CFormInputElement не будет отображаться, если явно не указано "безопасный"
Я пытаюсь использовать Form Builder для создания простой подсказки загрузки файла. Я хочу указать правило для файла, чтобы быть похожим на
array('formFile', 'file', 'allowEmpty' => false, 'types' => 'html'),
но что-то не так. Элемент загрузки файла появляется только в том случае, если я явно помечаю элемент как 'safe'
(и удалите 'file'
правило). Что мне не хватает?
модели /UploadForm.php
class UploadForm extends CFormModel
{
public $year;
public $formFile;
public function rules ()
{
return array(
array('year', 'required'),
array('year', 'date', 'format'=>'yyyy'),
// array('formFile', 'safe'),
array('formFile', 'file', 'allowEmpty' => false, 'types' => 'html'),
);
}
static public function getYearOptions () {...}
}
просмотров / экстранет /uploadForm.php
return array(
'title' => 'Select year',
'method' => 'post',
'enctype' => 'multipart/form-data',
'elements' => array(
'year' => array(
'type' => 'dropdownlist',
'items' => UploadForm::getYearOptions(),
),
'formFile' => array(
'type' => 'file',
'label' => 'form source file',
),
),
'buttons' => array(
'upload' => array(
'type' => 'submit',
'label' => 'upload',
),
),
);
Контроллеры /ExtranetController.php
class ExtranetController extends CController
{
public function actionIndex ()
{
$form = new CForm('application.views.extranet.uploadForm', new UploadForm());
if ($form->submitted('upload') && $form->validate()) {...}
$this->render('index', array('form' => $form));
}
}
1 ответ
Причина этого очень проста.
Построитель форм отображает только те элементы ввода, которые считаются безопасными (в IE есть правило проверки). То, что вы сделали, прекрасно, за исключением того, что CFileValidator не является "безопасным" по умолчанию, тогда как другие валидаторы безопасны.
Самый быстрый способ решить эту проблему заключается в следующем:
// In your model::rules() function
return array(
array('formFile', 'file', 'allowEmpty' => false, 'types' => 'html', 'safe' => true),
);
Обратитесь к этим двум ссылкам для получения дополнительной информации: безопасной документации CFileValidator# и проблеме Github для проблемы, очень похожей на вашу.