2

私は 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) も機能します。

4

2 に答える 2

1

2 つ目のバリデータ (ファイル用と必須用) を追加すると、機能しますか? 私は最近これに遭遇しました。

CForm の次の行が原因のようです:

if($element->getVisible())
{
    ...
}

getVisible は、この現在のモデル シナリオのアクティブなバリデータをチェックし、現在のバリデータ ルールで使用されていない入力を除外します。私たちのシステムのカスタム CForm モデルでコメントアウトすることになりましたが、より適切に機能するものを見つけたらお知らせください。

于 2013-02-06T20:12:57.730 に答える
1

問題は github に投稿されました

https://github.com/yiisoft/yii/issues/2089

于 2013-02-12T09:51:39.450 に答える