How do I keep the data already filled in <input> after submitting a form?

Asked

Viewed 4,963 times

6

I’m using the PHP language and the Laravel Framework 5. In the form validation, if it contains a blank field or an unaccepted character size, clicking save shows the validation message, but the fields that were filled are empty. How to keep the data in the form after clicking save when some field is incorrect? Code below the form to register a product.

Productocontroller.php

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\ProdutoRequest;
use App\Categoria;
use App\Produto;

class ProdutoController extends Controller
{
    public function index(){
        return view('produto', array('categorias' => Categoria::all(),
                                     'produtos' => Produto::all()));
    }

    public function enviar(ProdutoRequest $request){
        $produto = new Produto();
        $produto->nome = $request->get('nome');
        $produto->preco = $request->get('preco');
        $produto->descricao = $request->get('descricao');
        $produto->categoria_id = $request->get('categoria');
        $produto->save();
        return redirect('/produtos');
    }

    public function detalhe($id) {
        $produto = Produto::find($id);
        return view('produto_detalhe', array('produto' => $produto));
    }

    public function formEditar($id){
        $produto = Produto::find($id);
        $categorias = Categoria::all();
        return view('produto_editar', array('produto' => $produto, 'categorias' => $categorias));
    }

    public function editar(ProdutoRequest $request){
        $produto = Produto::find($request->get('id'));
        $produto->nome = $request->get('nome');
        $produto->preco = $request->get('preco');
        $produto->descricao = $request->get('descricao');
        $produto->categoria_id = $request->get('categoria');
        $produto->save();
        return redirect('/produtos');
    }

    public function excluir($id){
        Produto::destroy($id);
        return redirect('/produtos');
    }
}

Produtorequest.php

<?php

namespace App\Http\Requests;
use App\Http\Requests\Request;

class ProdutoRequest extends Request
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'nome' => 'min:3|max:100|required',
            'preco' => 'required',
            'descricao' => 'min:3|max:255|required',
            'categoria_id' => 'required',
        ];
    }

    public function messages()
    {
        return[
            'nome.required' => 'Preencha o nome',
            'nome.min' => 'O nome deve ter no mínimo 3 caracteres',
            'nome.max' => 'O nome deve ter no máximo 100 caracteres',
            'preco.required' => 'Preencha o preço',
            'descricao.required' => 'Preencha a descrição',
            'descricao.min' => 'A descrição deve ter no mínimo 3 caracteres',
            'descricao.max' => 'A descrição deve ter no máximo 255 caracteres',
            'categoria_id.required' => 'Escolha uma categoria',
        ];
    }
}

product.blade.php

<!DOCTYPE html>
<html>
<head>
    <title>Produtos</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
</head>

<body>
    <div class="container-fluid">
        <div class="jumbotron">
            <h1>Produtos</h1>
        </div>

    @if(count($errors) > 0)
        <div class="alert alert-danger">
            <ul>
                @foreach($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif

    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <form action="/produtos" method="POST">
                <input type="hidden" name="_token" value="{{ csrf_token() }}">
                <div class="form-group">
                    <label>Nome</label>
                    <input type="text" name="nome" class="form-control" id="nome">
                </div>
                <div class="form-group">
                    <label>Preço</label>
                    <input type="text" name="preco" class="form-control" id="preco">
                </div>              
                <div class="form-group">
                    <label>Descrição</label>
                    <textarea class="form-control" name="descricao" id="descricao"></textarea>
                </div>
                <div class="form-group">
                    <label>Categoria</label>
                    <select class="form-control" name="categoria" id="categoria">
                        <option value="null">Selecione uma categoria</option>
                        @foreach($categorias as $row)
                        <option value="{{ $row->id }}">
                            {{ $row->nome }}
                        </option>
                        @endforeach
                    </select>
                </div>
                <input type="submit" class="btn btn-primary" value="Salvar">
            </form>
        </div>
    </div>

    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <table class="table table-striped">
                <thead>
                    <tr>
                        <th>#</th>
                        <th>Nome</th>
                        <th>Preço</th>                        
                        <th>Categoria</th>
                        <th></th>
                    </tr>
                </thead>
                <tbody>
                    @foreach($produtos as $row)
                        <tr>
                            <th scope="row">{{ $row->id }}</th>
                            <td>{{ $row->nome }}</td>
                            <td>{{ $row->preco }}</td>                         
                            <td>{{ $row->categoria->nome }}</td>
                            <td><a class="btn btn-warning" href="/produtos/{{ $row->id }}/editar">Editar</a></td>
                            <td><button class="btn btn-danger btn-excluir" value="{{ $row->id }}">Excluir</button></td>                         
                            <td><a href="/produtos/{{ $row->id }}">Ver mais</a></td>
                        </tr>
                    @endforeach
                </tbody>
            </table>
        </div>
    </div>
    </div>

    <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="{{ URL::asset('js/scriptsProduto.js') }}"></script>

</body>
</html>
  • In my case this did not serve, so I created a class that saves in its attributes the request data, then in the method I return the instance of this class to the view and display the data in the inputs

2 answers

8


Use the helper old, example:

<input type="text" name="setor" value="{{old('setor')}}">

In value place old in parentheses the same name of the tag that in this case is sector. If there is validation and return will be loaded the last entered value.

In textarea would look like this:

<textarea name="texto">{{old('texto')}}</textarea>

In select thus:

<label>Categoria</label>
<select class="form-control" name="categoria" id="categoria">
    <option value="null">Selecione uma categoria</option>
    @foreach($categorias as $row)
    <option @if(old('categoria')==$row->id) {{'selected="selected"'}} @endif value="{{ $row->id }}">
       {{ $row->nome }}
    </option>
    @endforeach
</select>

For your studies and next forms html use this package it will help you mainly in select: laravelcollective/html.

  • 1

    Thank you very much, it worked!

  • Not at all @Grazianetavares

  • Can you tell me how to do this in the textarea and select option?

  • @Grazianetavares no textarea is that way, and in select have to check item by item to see if the id matches. Take a test look and give me a feedback.

  • In textarea and select option does not work that way and I only have an option because the values come straight from the database. Take a look at my question if you can http://answall.com/questions/131264/como-maintenanceos-dados-j%C3%A1-filled-no-textarea-e-no-select-option-ap%C3%B3s-submit

  • 1

    @graziane works that way maybe there is something not consistent in your code. Look at my edition...

  • textarea worked but select unfortunately not

Show 3 more comments

0

<select class="chosen" name="id_cidade" >
<option>Selecione</option>
@foreach ($cidade as $c)
    <option @if(old('id_cidade') == $c->id) selected @endif value="{{$c->id}}">{{$c->nome}}</option>
@endforeach

  • Where did this one come from id_cidade? The question refers to a register of products and not of addresses. Read [Answer]. Any doubt do our [tour].

Browser other questions tagged

You are not signed in. Login or sign up in order to post.