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 binding
zodat 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', 'ArticlesController@new_article_form');
Route::post('/add-new-article-record', 'ArticlesController@add_new_article');
Route::get('/edit-article/{id}', 'ArticlesController@edit_article_form');
Route::post('/update-article-record', 'ArticlesController@update_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' => 'UsersController@store', '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, ...]);