Файл 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 для проблемы, очень похожей на вашу.

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