2

Laravel 4 とその組み込みのフォーム コンポーネントを使用しています。フォームにデフォルト値のセットを与えることができるように設定しようとしていますが、ユーザーが送信してバリデーターが失敗した場合、前の入力の値が使用されます。ただし、以下のコードは常に失敗します。セッション値 'threw_error' は、フォームがエラーをスローした場合でも、何らかの理由で常に true です。

すべてがセッションで行われているようです。そのため、フォームが使用する内部キーである __old_input を設定しています。私は何を間違っていますか?このように __old_input を使用する必要がありますか、またはこの目標を達成するためのより良い方法はありますか?

私は機知に富んだコントローラーを使用しているので、以下の index() は GET / で、store() は POST / です。

class Admin_DetailsController extends Admin_BaseController
{
    public function index()
    {           
        $details = Detail::all();

        // this is always true for some reason?
        if(!Session::get('threw_error', false))
        {
            Session::put('__old_input', $details);          
        }

        $data['message'] = Session::get('message');

        $this->layout->nest('content', 'admin.details.index', $data);
    }

    public function store()
    {
        $validator = $this->makeValidator();
        if($validator->fails())
        {
            return Redirect::to('/admin/details')->withErrors($validator)->withInput()->with('threw_error', 1);
        }

        // process normally
    }
}

// in view
{{ Form::text('some_field') }}

編集:このコードは多かれ少なかれ期待どおりに機能しますが、Session::flashInput($details) は手動で __old_input を呼び出すよりも優れています。フォーム内のいくつかのフィールドを削除して、そこに何かがあるかどうかを確認しようとしましたが、これは実際に機能しました. 言い換えれば、それは私のローカル バージョンの PHP か、何らかの構成か何かの問題であり、Laravel の問題ではないと思います。

4

1 に答える 1

7

Laravel 4以降、代わりにForm::model($model, array)を実行できますForm::open(array)

次に、フォーム ヘルパー メソッドに値を渡す必要はありません。モデルから値を取得しますが、最初に oldInput があるかどうかをチェックするので、値は古いものになります。

このメソッドをチェックしてください。小さな変更ですが、本当に賢い変更です:)

しかし、これが機能するには、入力でリダイレクトする必要があります

Redirect::back()->withInput();

そのようです:

public function createNew()
{
    $data = array(
        'model' => new Model();
    );

    $this->layout->nest('content', 'admin.details.form', $data);
}

public function store()
{
    $validator = $this->makeValidator();
    if($validator->fails())
    {
        return Redirect::back()
            ->withErrors($validator)
            ->withInput();
    }
}

// In the view
{{ Form::model($model, array(...)) }}

    // The first time it will be null
    // But if the validation fails, it will be the old value 
    {{ Form::text('some_field', 'Some fields title') }} 

{{ Form::close()}}

PSを使用する代わりに、使用Session::flashInput()できますInput::old()

于 2013-03-24T18:38:33.947 に答える