Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Metodo de alterar: Formulario base para adicionar e alterar

Como o código dos dois formulários, tanto de adicionar como o de alterar se repetem, isolei a parte que se repete em um único arquivo: formulario-base.blade.php O formulário base não está carregando dentro dos tipos adicionar e alterar. Só aparece o título e o botão submit. Alguém sabe como corrigir?

formulario-base.blade.php

@extends('produtos/altera')
@extends('produtos/formulario')
@section('conteudo')
<tr>
    <td>Nome:</td>
    <td><input class="form-control" type="text" name="nome" required value="{{$produto->nome}}"></td>
</tr>
<tr>
    <td>Valor:</td>
    <td><input class="form-control" type="number" step="0.10" name="valor" required value="{{$produto->valor}}"> </td>
</tr>
<tr>
    <td>Descrição:</td>
    <td><input class="form-control" type="text" name="descricao" required value="{{$produto->descricao}}"></td>
</tr>
<tr>
    <td>Quantidade:</td>
    <td><input class="form-control" type="number" name="quantidade" step="0" required value="{{$produto->quantidade}}"></td> <!-- if condicional -->
</tr>
<tr>
    <td>Situação:</td>
    <td><input type="checkbox" name="situacao" value="true" {{$produto->situacao}} >Ativo</td> 
</tr>
<tr>
    <td>Tamanho:</td>
    <td><input class="form-control" type="text" name="tamanho" required value="{{$produto->quantidade}}"></td>
</tr>
<tr>
    <td>Categoria:</td>
    <td>
        <select name="categoria" class="form-control">
            @foreach($categorias as $categ)
            <?php
                $essaEhACategoria = $produto->categoria == $categ->id;
                $selecao = $essaEhACategoria ? "selected= 'selected'" :"";
            ?>
                <option value="{{$categ->id}}" {{$selecao}}>
                    {{$categ->nome}}
                </option>
            @endforeach
        </select>
    </td>
</tr>
@stop

formulario.blade.php Adiciona

@extends('layout/principal')
@section('conteudo')
<div class="alert alert-danger">
    <ul>
        @foreach($errors->all() as $error)
            <li>{{$error}}</li>
        @endforeach
    </ul>
</div>

<section class="intro">
<div class="container">
    <div class="principal">
        <h1>Adiciona Produto</h1>
        <form action="/produtos/adiciona" method="post"> <!-- Passa os parametros atraves de blocos não pela URI(barra de navegação) -->
            <input value="{{ csrf_token()}}" type="hidden" name="_token">
            <table class="table">
                    @yield('conteudo')
                    <tr>
                        <td>
                        <button class="btn btn-primary" type="submit">Cadastrar</button>
                        </td>
                    </tr>
                </table>
            </form>
        </div>
    </div>
</section>
</form>

@stop

altera-produto.blade.php

@extends('layout/principal')
@section('conteudo')
<div class="alert alert-danger">
    <ul>
        @foreach($errors->all() as $error)
            <li>{{$error}}</li>
        @endforeach
    </ul>
</div>
<?php
    $selecao_usado = $produto->situacao ? "checked='checked'" : "";
    $produto->situacao = $selecao_usado;
?>

<section class="intro">
<div class="container">
    <div class="principal">
        <h1>Adiciona Produto</h1>
        <form action="/produtos/alterado" method="post"> <!-- Passa os parametros atraves de blocos não pela URI(barra de navegação) -->
            <input value="{{ csrf_token()}}" type="hidden" name="_token">
            <table class="table">
                    @yield('base')
                    <tr>
                        <td>
                        <button class="btn btn-primary" type="submit">Alterar</button>
                        </td>
                    </tr>
                </table>
            </form>
        </div>
    </div>
</section>
</form>

@stop

Controllers

    public function formulario(){
        $produto = new Produto();
        $produto->nome = "";
        $produto->valor = "";
        $produto->descricao = "";
        $produto->quantidade = "";
        $produto->categoria = 1;
        $produto->situacao = "";
        $produto->tamanho = "";
        $categorias = Categoria::all();
        return view('produto/formulario')->withCategorias($categorias)->withProduto($produto);
    }

    public function adiciona(ProdutoRequest $request){
        $produto = $request->all();
        if ($produto->situacao == "checked='checked'"){
            $produto->situacao = true;
        } else {
            $produto->situacao = false;
        }
        Produto::create($produto);
        /*$params = Request::all();
        $produto = new Produto($params);
        $produto->save();*/
        /*
        return redirect('/produtos')->withInput();
        return redirect('/produtos')->withInput(Request::except('senha'));
        return redirect()->action('ProdutoController@lista')->withInput(Request::only('nome'));
        */
        return redirect()->action('ProdutoController@lista')->withInput($request->only('nome'));
    }

    public function altera($id){
        $produto = Produto::find($id);
        $categorias = Categoria::all();
        return redirect()->action('ProdutoController@altera')->withProduto($produto)->withCategorias($categorias);
    }

    public function alterado(){
        $produto = Produto::findOrFail($id);
        $produto->update($request->all());
        return redirect()->action('ProdutosController@lista')->withInput($request->only('nome'));
    }

Rotas

<?php

Route::get('/theme', 'ProdutoController@theme');
Route::get('/', 'ProdutoController@dashboard');
Route::get('/produtos', 'ProdutoController@lista');
Route::get('/produtos/mostra/{id}', 'ProdutoController@mostra')->where('id','[0-9]+');
Route::get('/produtos/remove/{id}', 'ProdutoController@remove')->where('id','[0-9]+');
Route::get('/produtos/altera/{id}', 'ProdutoController@altera')->where('id','[0-9]+');
Route::get('/produtos/alterado', 'ProdutoController@alterado');
Route::get('/produtos/formulario', 'ProdutoController@formulario');
Route::post('/produtos/adiciona', 'ProdutoController@adiciona');
Route::get('/produtos/json', 'ProdutoController@listaJson');

Route::get('/login','LoginController@form');

Route::get('home', 'HomeController@index');
Route::controllers([
    'auth' => 'Auth\AuthController',
    'password' => 'Auth\PasswordController',
]);
3 respostas
solução!

Bastou tirar as sections do formulario base e chama-lo tanto no adiciona e no altera dessa forma:

@include('produto/formulario-base')

Tive a mesma dúvida que nosso colega Cleber

Esse include resolve o problema, mas será que é a boa pratica visto que o Laravel oferece o Blade?

Também demorei pra resolver isso , eu não precisei usar um include so criei outra section

ProdutoController

public function novo(){
        //$produto = new Produto();
        return view('produtos.novoformulario');
    }

    public function altera($id){
        $produto = Produto::find($id);
        return view('produtos.altera_produto_form')->with('produto',$produto);
    }

Meu Formulario.blade.php

@extends('layout.principal')

@section('conteudo')    
    <h2>Novo Produto</h2>

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

     <form action="/produtos/adiciona" method="post">
         <input  type="hidden" name="_token" value="{{ csrf_token() }}" />
         @yield('form')
        <button type="submit" class="btn btn-primary"> Adicionar</button>    
     </form>
@stop

O Formulário para produtos novos com o nome (novoformulario)

@extends('produtos.formulario')
@section ('form')
        <div class="form-group">
             <label>Nome</label>
             <input class="form-control" type="text" name="nome" value="{{old('nome')}}" />
         </div>
        <div class="form-group">
             <label>Valor</label>
             <input class="form-control" type="number" name="valor" value="{{old('valor')}}"/>
        </div>
        <div class="form-group">
             <label>Descrição</label>
             <textarea class="form-control" name="descricao">{{old('descricao')}}</textarea>
        </div>
        <div class="form-group">
             <label>Tamanho</label>
             <input class="form-control" type="text" name="tamanho" value="{{old('tamanho')}}"/>
        </div>
        <div class="form-group">
             <label>Quantidade</label>
            <input class="form-control" type="number" name="quantidade" value="{{old('quantidade')}}"/>
        </div>
@stop

e o formulário para atualização de produtos com nome (altera_produto_form)

@extends('produtos.formulario')
@section ('form')
        <div class="form-group">
             <label>Nome</label>
             <input class="form-control" type="text" name="nome" value="{{$produto->nome}}" />
         </div>
        <div class="form-group">
             <label>Valor</label>
             <input class="form-control" type="number" name="valor" value="{{$produto->valor}}"/>
        </div>
        <div class="form-group">
             <label>Descrição</label>
             <textarea class="form-control" name="descricao">{{$produto->descricao}}</textarea>
        </div>
        <div class="form-group">
             <label>Tamanho</label>
             <input class="form-control" type="text" name="tamanho" value="{{$produto->tamanho}}"/>
        </div>
        <div class="form-group">
             <label>Quantidade</label>
            <input class="form-control" type="number" name="quantidade" value="{{$produto->quantidade}}"/>
        </div>
@stop