Laravel gebruikt hetzelfde formulier voor maken en bewerken

Ik ben vrij nieuw voor Laravel en ik moet een formulier maken om te maken en een formulier om te bewerken. In mijn formulier heb ik nogal wat jQuery ajax-berichten. Ik vraag me af of Laravel me een gemakkelijke manier biedt om hetzelfde formulier voor mijn bewerking te gebruiken en te maken zonder dat ik heel veel logica in mijn code hoef toe te voegen. Ik wil niet elke keer controleren of ik in de bewerk- of maakmodus ben bij het toewijzen van waarden aan velden wanneer het formulier wordt geladen. Enig idee hoe ik dit kan bereiken met minimale codering?


Antwoord 1, autoriteit 100%

Ik gebruik graag formulier model bindingzodat ik gemakkelijk de velden van een formulier kan vullen met de bijbehorende waarde, dus ik volg deze benadering (bijvoorbeeld met behulp van een user-model):

@if(isset($user))
    {{ Form::model($user, ['route' => ['updateroute', $user->id], 'method' => 'patch']) }}
@else
    {{ Form::open(['route' => 'createroute']) }}
@endif
    {{ Form::text('fieldname1', Input::old('fieldname1')) }}
    {{ Form::text('fieldname2', Input::old('fieldname2')) }}
    {{ -- More fields... -- }}
    {{ Form::submit('Save', ['name' => 'submit']) }}
{{ Form::close() }}

Dus, bijvoorbeeld, van een controller, gebruik ik in principe hetzelfde formulier voor het maken en bijwerken, zoals:

// To create a new user
public function create()
{
    // Load user/createOrUpdate.blade.php view
    return View::make('user.createOrUpdate');
}
// To update an existing user (load to edit)
public function edit($id)
{
    $user = User::find($id);
    // Load user/createOrUpdate.blade.php view
    return View::make('user.createOrUpdate')->with('user', $user);
}

Antwoord 2, autoriteit 39%

Vrij eenvoudig in je controller doe je:

public function create()
{
    $user = new User;
    $action = URL::route('user.store');
    return View::('viewname')->with(compact('user', 'action'));
}
public function edit($id)
{
    $user = User::find($id);
    $action = URL::route('user.update', ['id' => $id]);
    return View::('viewname')->with(compact('user', 'action'));
}

En je hoeft het alleen maar op deze manier te gebruiken:

{{ Form::model($user, ['action' => $action]) }}
   {{ Form::input('email') }}
   {{ Form::input('first_name') }}
{{ Form::close() }}

Antwoord 3, autoriteit 30%

Voeg voor het maken een leeg object toe aan de weergave.

return view('admin.profiles.create', ['profile' => new Profile()]);

Oude functie heeft een tweede parameter, standaardwaarde, als je daar het veld van het object doorgeeft, kan de invoer opnieuw worden gebruikt.

<input class="input" type="text" name="name" value="{{old('name', $profile->name)}}">

Voor de formulieractie kunt u het juiste eindpunt gebruiken.

<form action="{{ $profile->id == null ? '/admin/profiles' :  '/admin/profiles/' . $profile->id }} " method="POST">

En voor de update moet je de PATCH-methode gebruiken.

@isset($profile->id)
 {{ method_field('PATCH')}}
@endisset

Antwoord 4, autoriteit 21%

Nog een schone methode met een kleine controller, twee weergaven en een gedeeltelijke weergave:

UsersController.php

public function create()
{
    return View::('create');
}    
public function edit($id)
{
    $user = User::find($id);
    return View::('edit')->with(compact('user'));
}

create.blade.php

{{ Form::open( array( 'route' => ['users.index'], 'role' => 'form' ) ) }}
    @include('_fields')
{{ Form::close() }}

edit.blade.php

{{ Form::model( $user, ['route' => ['users.update', $user->id], 'method' => 'put', 'role' => 'form'] ) }}
    @include('_fields')
{{ Form::close() }}

_fields.blade.php

{{ Form::text('fieldname1') }}
{{ Form::text('fieldname2') }}
{{ Form::button('Save', ['type' => 'submit']) }}

Antwoord 5, autoriteit 6%

Eenvoudig en schoon 🙂

UserController.php

public function create() {
    $user = new User();
    return View::make('user.edit', compact('user'));
}
public function edit($id) {
    $user = User::find($id);
    return View::make('user.edit', compact('user'));
}

edit.blade.php

{{ Form::model($user, ['url' => ['/user', $user->id]]) }}
   {{ Form::text('name') }}
   <button>save</button>
{{ Form::close() }}

Antwoord 6, autoriteit 4%

Bijvoorbeeld uw controller, gegevens ophalen en de weergave plaatsen

class ClassExampleController extends Controller
{
    public function index()
    {   
        $test = Test::first(1);
        return view('view-form',[
            'field' => $test,
        ]);
    }
}

Standaardwaarde in dezelfde vorm toevoegen, maken en bewerken, is heel eenvoudig

<!-- view-form file -->
<form action="{{ 
    isset($field) ? 
    @route('field.updated', $field->id) : 
    @route('field.store')
}}">
    <!-- Input case -->
    <input name="name_input" class="form-control" 
    value="{{ isset($field->name) ? $field->name : '' }}">
</form>

En weet je nog, voeg csrf_field toe, voor het geval dat een POST-methode erom vraagt. Herhaal daarom invoer en selecteer element, vergelijk elke optie

<select name="x_select">
@foreach($field as $subfield)
    @if ($subfield == $field->name)
        <option val="i" checked>
    @else
        <option val="i" >
    @endif
@endforeach
</select>

Antwoord 7, autoriteit 3%

In plaats van twee methoden te maken – één voor het maken van een nieuwe rij en één voor het bijwerken, moet u de methode findOrNew()gebruiken. Dus:

public function edit(Request $request, $id = 0)
{
    $user = User::findOrNew($id);
    $user->fill($request->all());
    $user->save();
}

Antwoord 8, autoriteit 3%

   Article is a model containing two fields - title and content 
    Create a view as pages/add-update-article.blade.php   
        @if(!isset($article->id))
            <form method = "post" action="add-new-article-record">
            @else
             <form method = "post" action="update-article-record">
            @endif
                {{ csrf_field() }} 
                <div class="form-group">
                    <label for="title">Title</label>            
                    <input type="text" class="form-control" id="title" placeholder="Enter title" name="title" value={{$article->title}}>
                    <span class="text-danger">{{ $errors->first('title') }}</span>
                </div>
                <div class="form-group">
                    <label for="content">Content</label>
                    <textarea class="form-control" rows="5" id="content" name="content">
                    {{$article->content}}
                    </textarea>
                    <span class="text-danger">{{ $errors->first('content') }}</span>
                </div>
                <input type="hidden" name="id" value="{{{ $article->id }}}"> 
                <button type="submit" class="btn btn-default">Submit</button>
            </form>
Route(web.php): Create routes to controller 
        Route::get('/add-new-article', '[email protected]_article_form');
        Route::post('/add-new-article-record', '[email protected]_new_article');
        Route::get('/edit-article/{id}', '[email protected]_article_form');
        Route::post('/update-article-record', '[email protected]_article_record');
Create ArticleController.php
       public function new_article_form(Request $request)
    {
        $article = new Articles();
        return view('pages/add-update-article', $article)->with('article', $article);
    }
    public function add_new_article(Request $request)
    {
        $this->validate($request, ['title' => 'required', 'content' => 'required']);
        Articles::create($request->all());
        return redirect('articles');
    }
    public function edit_article_form($id)
    {
        $article = Articles::find($id);
        return view('pages/add-update-article', $article)->with('article', $article);
    }
    public function update_article_record(Request $request)
    {
        $this->validate($request, ['title' => 'required', 'content' => 'required']);
        $article = Articles::find($request->id);
        $article->title = $request->title;
        $article->content = $request->content;
        $article->save();
        return redirect('articles');
    } 

Antwoord 9

In Rails heeft het form_for helper, dus we zouden een functie als form_for kunnen maken.

We kunnen een formuliermacro maken, bijvoorbeeld in resource/macro/html.php:

(als u niet weet hoe u een macro moet instellen, kunt u googlen op “laravel 5 Macro”)

Form::macro('start', function($record, $resource, $options = array()){
    if ((null === $record || !$record->exists()) ? 1 : 0) {
        $options['route'] = $resource .'.store';
        $options['method'] = 'POST';
        $str = Form::open($options);
    } else {
        $options['route'] = [$resource .'.update', $record->id];
        $options['method'] = 'PUT';
        $str = Form::model($record, $options);
    }
    return $str;
});

De controller:

public function create()
{
    $category = null;
    return view('admin.category.create', compact('category'));
}
public function edit($id)
{
    $category = Category.find($id);
    return view('admin.category.edit', compact('category'));
}

Vervolgens in de weergave _form.blade.php:

{!! Form::start($category, 'admin.categories', ['class' => 'definewidth m20']) !!}
// here the Form fields
{{!! Form::close() !!}}

Bekijk vervolgens create.blade.php:

@include '_form'

Bekijk dan edit.blade.php:

@include '_form'

Antwoord 10

Je kunt formulierbinding en 3 methoden gebruiken in je Controller. Dit is wat ik doe

class ActivitiesController extends BaseController {
    public function getAdd() {
        return $this->form();
    }
    public function getEdit($id) {
        return $this->form($id);
    }
    protected function form($id = null) {
        $activity = ! is_null($id) ? Activity::findOrFail($id) : new Activity;
        //
        // Your logic here
        //
        $form = View::make('path.to.form')
            ->with('activity', $activity);
        return $form->render(); 
    }
}

En naar mijn mening heb ik

{{ Form::model($activity, array('url' => "/admin/activities/form/{$activity->id}", 'method' => 'post')) }}
{{ Form::close() }}

Antwoord 11

UserController.php

use View;
public function create()
{
    return View::make('user.manage', compact('user'));
}
public function edit($id)
{
    $user = User::find($id);
    return View::make('user.manage', compact('user'));
}

gebruiker.blade.php

@if(isset($user))
    {{ Form::model($user, ['route' => ['user.update', $user->id], 'method' => 'PUT']) }}
@else
    {{ Form::open(['route' => 'user.store', 'method' => 'POST']) }}
@endif
// fields
{{ Form::close() }}

Antwoord 12

Ik hoop dat dit je zal helpen!!

form.blade.php

@php
$name         = $user->name ?? null;
$email        = $user->email ?? null;
$info         = $user->info ?? null;
$role         = $user->role ?? null;
@endphp
<div class="form-group">
        {!! Form::label('name', 'Name') !!}
        {!! Form::text('name', $name, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
        {!! Form::label('email', 'Email') !!}
        {!! Form::email('email', $email, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
        {!! Form::label('role', 'Função') !!}
        {!! Form::text('role', $role, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
        {!! Form::label('info', 'Informações') !!}
        {!! Form::textarea('info', $info, ['class' => 'form-control']) !!}
</div>
<a class="btn btn-danger float-right" href="{{ route('users.index') }}">CANCELAR</a>

create.blade.php

@extends('layouts.app')
@section('title', 'Criar usuário')
@section('content')
        {!! Form::open(['action' => '[email protected]', 'method' => 'POST'])  !!}
            @include('users.form')
            <div class="form-group">
                {!! Form::label('password', 'Senha') !!}
                {!! Form::password('password', ['class' => 'form-control']) !!}
            </div>
            <div class="form-group">
                {!! Form::label('password', 'Confirmação de senha') !!}
                {!! Form::password('password_confirmation', ['class' => 'form-control']) !!}
            </div>
            {!! Form::submit('ADICIONAR', array('class' => 'btn btn-primary')) !!}
        {!! Form::close() !!}
@endsection

edit.blade.php

@extends('layouts.app')
@section('title', 'Editar usuário')
@section('content')
        {!! Form::model($user, ['route' => ['users.update', $user->id], 'method' => 'PUT']) !!}
            @include('users.form', compact('user'))
            {!! Form::submit('EDITAR', ['class' => 'btn btn-primary']) !!}
        {!! Form::close() !!}
        <a href="{{route('users.editPassword', $user->id)}}">Editar senha</a>
@endsection

UsersController.php

use App\User;
Class UsersController extends Controller {
  #... 
    public function create()
    {
        return view('users.create';
    }
    public function edit($id)
    {
        $user  = User::findOrFail($id);
        return view('users.edit', compact('user');
    }
}

Antwoord 13

gebruik elkein de route

Route::any('cr', [CreateContent::class, 'create_content'])
->name('create_resource');

in controllergebruik

User::UpdateOrCreate([id=>$user->id], ['field_name'=>value, ...]);

Other episodes