私は Yii ベースのアプリケーションに取り組んできました。そして、私は奇妙なことに直面しました...
私がやろうとしているのは、input(type=file) をフォームに追加することです。フォームは、フォーム ビルダー(CForm
クラス)を介して作成されます。しかし、入力は表示されません。
私のコード。コントローラー/アクション:
$model=MyModel::model()->findByPk(700);
$model->scenario='my-scenario';
$form=new CForm('path.to.forms.my-form', $model);
$this->render('view', array('form'=>$form));
意見:
echo $form
フォーム構成:
return array(
'attributes' => array(
'enctype' => 'multipart/form-data',
),
'elements' => array(
'name' => array(
'type' => 'text',
),
'image' => array(
'type' => 'file',
),
),
'buttons' => array(
'save' => array(
'type' => 'submit',
'label' => 'Save',
),
),
);
モデル:
//.....
public $image;
// ....
public function rules()
{
return array(
//...
array('image', 'file', 'types'=>'png', 'on'=>'my-scenario'),
);
}
上記のコードでは、テキストとファイルの 2 つのフィールドが表示されると予想していました。ただし、テキスト 1 のみが表示されます。
file
バリデーターをたとえば-に変更するrequired
と動作しますが、ファイルバリデーターが必要です。
Yii バージョン 1.1.13 を使用しています。
最も興味深いのは、上記のコードが以前の Yii(1.1.9) で期待どおりに動作することです。これは新しいバージョンの既知のバグですか? はいの場合 - 解決策はありますか? または、以前のバージョンにロールバックする必要がありますか?
前もって感謝します。
アップデート:
2 つ目のバリデータ (ファイル用と必須用) を追加すると、機能しますか?
いいえ、そうではありません。理由がわかったと思います。下記をご覧ください。
CFormのこの行が原因のようです..
はい正解。昨日、デバッガーで武装して、私はより深く行きました:)
CFormElement::getVisible()
最終的にCModel::isAttributeSafe()
and を呼び出しますCModel::getSafeAttributeNames()
。
CForm::getSafeAttributeNames()
すべてのモデル バリデータを取得し、安全なものだけを残します。ご覧のとおり、CFileValidator は安全ではありません。
required
したがって、属性が割り当てられている安全なバリデーター (またはその他) の数は関係ありません。CForm::getSafeAttributeNames()
少なくとも 1 つの unsafe( file
) がある場合、ホワイトリストから削除します。1.1.12 バージョン以降、ファイル バリデータは安全ではありません。それが、1.1.9で私にとって完璧に機能した理由です:)
したがって、問題は CFileValidator (または少なくともそれに接続されている) にあり、CForm にはありません。
これまでのところ、安全とマークされた CFileValidator から拡張された独自のバリデーターを作成し、組み込みの代わりにそれを使用することが唯一の解決策です。安全ではありません)。
これが誰かの役に立てば幸いです。
更新 2
array('image', 'file', 'safe'=>true, 'types'=>'png', 'on'=>'my-scenario')
この検証規則 (明示的safe=true
) も機能します。