13
respostas

Aula alterar produto!

Olá, não encontrei no curso a aula para efetuar a alteração no produto, temos adicionar, excluir, mostrar. Poderia encaminhar por favor?

13 respostas

Olá Leandro.

Não sei sobre a aula, mas posso mostrar um código genérico para você ter uma ideia:

//Controller
public function abrir(Request $r) {

    $item = Model::find($r->id);
    return view('suaview', $item);

}

public function editar(Request $r) {

    $item = Model::find($r->id);
    $item->descricao = $r->descricao;
    $item->save();

    return redirect('listagem');

}

//View

<form action="linkParaEditarItem" method="post">
    <input type="hidden" name="id" value="{{$item->id}}">
    <input type="text" name="descricao" value="{{$item->descricao}}">
    <button type="submit">Atualizar</button>
</form>

Qualquer dúvida pode perguntar aqui.

Abraços!

Puxa vida amigo, muito obrigado. Vou testar aqui! Valeu.

De nada Leandro! Boa sorte.

Amigo por favor me ajuda, como faço para chamar o editar que esta dentro de ProdutoController.php

    public function editar(ProdutoRequest $request) {

    $produto = Model::find($p->id);
    $produto->nome = $p->nome;
    $produto->valor = $p->valor;
    $produto->descricao = $p->descricao;
    $produto->quantidade = $p->quantidade;
    $produto->save();

    return redirect('/produto.listagem');

   }

Veja se o código está certo por favor. Abraço.

Leandro, para acessar esse método, você precisa mapea-lo no arquivo routes/web.php e acessar pelo navegador. Ou utilizar alguma ferramenta que realize requisições HTTP =)

Oi Leandro, apenas exemplificando o que o André disse, algo do tipo:

Route::post('/produtos/editar', ['as' => '/produtos/editar', 'uses' => 'ProdutoController@editar']);

E chame essa rota no seu form, usando a alias da rota:

<form action="{{route('/produtos/editar')}}" method="post">

Abraços.

Amigos se puderem ajudar, não está editando, segue os arquivos:

edita.blade.php

@extends('layout.principal')
@section('conteudo')

<h1>Edição do produto {{ $p->nome }}</h1>

<form action="{{route('/produtos/editar')}}" method="post">
     <input name="_token" type="hidden" value="{!! csrf_token() !!}" />
        <input type="hidden" name="id" value="{{ $p->id }}">
     <div class="form-group">
         <label>Nome</label>
         <input type="text" class="form-control" name="nome" value="{{ $p->nome}}">
     </div>
     <div class="form-group">
         <label>Valor</label>
         <input type="text" class="form-control" name="valor" value="{{ $p->valor }}">
     </div>
     <div class="form-group">
         <label>Descrição</label>
         <input type="text" class="form-control" name="descricao" value="{{ $p->descricao }}">
     </div>
     <div class="form-group">
         <label>Quantidade</label>
         <input type="text" class="form-control" name="quantidade" value="{{ $p->quantidade }}">
     </div>
         <button type="submit" class="btn btn-primary">Atualizar</button>
</form>

@stop

routes.php

<?php

Route::get('/', function(){
    return '<h1>Listagem de produtos</h1>';
});
Route::get('/produtos', 'ProdutoController@lista');
Route::get('/produtos/mostra/{id}', 'ProdutoController@mostra'); 
Route::get('/produtos/edita/{id}', 'ProdutoController@edita'); 
Route::post('/produtos/editar', ['as' => '/produtos/editar', 'uses' => 'ProdutoController@editar']);
Route::get('/produtos/remove/{id}', 'ProdutoController@remove'); 
Route::get('/produtos/novo', 'ProdutoController@novo'); 
Route::post('/produtos/adiciona', 'ProdutoController@adiciona'); 
Route::get('/login', 'LoginController@form');
Route::post('/login', 'LoginController@login');



Route::get('home', 'HomeController@index');

Route::controllers([
    'auth' => 'Auth\AuthController',
    'password' => 'Auth\PasswordController',
]);

ProdutoController.php

<?php namespace senge\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Request;
use Validator;
use senge\Produto;
use senge\Categoria;
use senge\Http\Requests\ProdutoRequest;

class ProdutoController extends Controller {

//cria a autenticação!

       public function __construct()
    {
      //se quiser travar o acesso apenas para o adiciona e o remove
      //$this->middleware('auth', ['only' => ['adiciona', 'remove']]);
      $this->middleware('auth');
    }

    public function lista(){
       $produtos = Produto::all();
       return view('/produto.listagem')->with('produtos', $produtos);

    }
    public function mostra($id){
        $produto = Produto::find($id);
        return view('/produto.detalhes')->with('p', $produto);
    }

    public function edita($id){
        $produto = Produto::find($id);
        return view('/produto.edita')->with('p', $produto);
    }

    public function remove($id){
        $produto = Produto::find($id);
        $produto->delete();
        //redirecionamento de url mas indo para o método!
        return redirect()->action('ProdutoController@lista');
        //return redirect('/produtos');
    }

    public function novo(){
        return view('/produto.formulario')->with('categorias', Categoria::all());
    }
    //ADICIONAR PRODUTOS
    public function adiciona(ProdutoRequest $request){
        Produto::create($request->all());     
        return redirect ('/produtos')->withInput();
    }


    public function editar(ProdutoRequest $request) {

    $produto = Produto::find($id);
    $produto->nome = $p->nome;
    $produto->valor = $p->valor;
    $produto->descricao = $p->descricao;
    $produto->quantidade = $p->quantidade;
    $produto->save();

    return redirect('/produto.listagem');

   }

}

Troque

$produto = Produto::find($id);

Por:

$produto = Produto::find($request->id);

Assim deve funcionar!

Olá amigo, ele ainda não atualiza, não dá nenhum erro ao tentar alterar simplesmente recarrega a página de edição:

ProdutoController.php

    public function editar(ProdutoRequest $request) {
    $produto = Produto::find($request->id);
    $produto->nome = $p->nome;
    $produto->valor = $p->valor;
    $produto->descricao = $p->descricao;
    $produto->quantidade = $p->quantidade;
    $produto->save();
    return redirect('/produto.listagem');

   }

edita.blade.php

@extends('layout.principal')
@section('conteudo')

<h1>Edição do produto {{ $p->nome }}</h1>

<form action="{{route('/produtos/editar/')}}" method="post">
     <input name="_token" type="hidden" value="{!! csrf_token() !!}" />
        <input type="hidden" name="id" value="{{ $p->id }}">
     <div class="form-group">
         <label>Nome</label>
         <input type="text" class="form-control" name="nome" value="{{ $p->nome}}">
     </div>
     <div class="form-group">
         <label>Valor</label>
         <input type="text" class="form-control" name="valor" value="{{ $p->valor }}">
     </div>
     <div class="form-group">
         <label>Descrição</label>
         <input type="text" class="form-control" name="descricao" value="{{ $p->descricao }}">
     </div>
     <div class="form-group">
         <label>Quantidade</label>
         <input type="text" class="form-control" name="quantidade" value="{{ $p->quantidade }}">
     </div>
         <button type="submit" class="btn btn-primary">Atualizar</button>
</form>

@stop

Não precisaria enviar o id via action do form?

Faça o seguinte. Ponha um "dd($produto);" na função editar, após o find. E fale o que aparece.

Amigo, está certo dessa forma?

Assim, só recarregou e não atualizou.

  public function editar(ProdutoRequest $request) {
    $produto = Produto::find($request->id);
    dd($produto);
    $produto->nome = $p->nome;
    $produto->valor = $p->valor;
    $produto->descricao = $p->descricao;
    $produto->quantidade = $p->quantidade;
    $produto->save();
    return redirect('/produto.listagem');

Sim, dessa forma. Ele não mostrou nada depois da ação de editar?

Não mostrou nada, só da um refresh na página, sem nenhum erro!