Skip to main content

Create en Edit

We gaan de create en edit controls en bijbehorende templates maken voor onze links applicatie.

Create

Voor de create functie gaan we de routing, control en view opzetten.

Routing

Voor de routing verwijzen we naar de view create in de links directory, we plaatsen dus de code:

return view('links.create');

in de create control.

View

Wrapper

De view wordt weer een beetje complex, we maken namelijk één form die we gaan gebruiken voor create en voor edit. We maken voor create en voor edit een eigen template maar roepen vanuit deze template deze ene form-template aan. Dit wordt ook wel een wrapper genoemd. We verpakken de form template als het ware door een andere template. De verpakking (wrapper) bepaald wat het wordt (edit of create) maar de inhoud van de verpakking (wrapper) is gelijk omdat eht form voor edit en create namelijk hetzelfde zijn.

Edit

We plaatsten in de edit template de volgende code (dit is de wrapper voor edit).

@extends('layouts.app')

@section('content')

<div class="container">
    <form action="{{ url('/links/' . $link->id)  }}" method="POST" enctype="multipart/form-data">
        {{ csrf_field() }}
        {{ method_field('PATCH') }}
        @include('links.form', ['mode' => 'edit'])
    </form>
</div>

@endsection

Belangrijk hier is de @include, daar wordt de template links/form.blade.php included en er wordt een parameter (mode=edit) meegegven zodat het form links/form.blade.php 'weet' dat het aangeroepen is vanuit de create.

In het form.blade.php file beginnen we met:

{{ $mode == 'create' ? 'Create Link' : 'Modify Link' }} <br>

Dit is gewoon een soort if statement, je kunt dit herschrijven als volgt:

if ($mode=='create') {
	echo "Create Link";
}else{
	echo "Modify Link";
}

Onder de eerste regel in form.blade.php plaatsen we de voglende code:

<div class="form-group">
    <label for="title" class="control-label">{{'Title'}}</label>
    <input type="text" class="form-control" name="title" id="title" value="{{ isset($link->title) ? $link->title : '' }}">
</div>

<div class="form-group">
    <label for="url" class="control-label">{{'URL'}}</label>
    <input type="text" class="form-control" name="url" id="url" value="{{ isset($link->url) ? $link->url : '' }}">
</div>

<div class="form-group">
    <label for="description" class="control-label">{{'Description'}}</label>
    <textarea type="text" class="form-control" name="description" id="description">{{ isset($link->description) ? $link->description : '' }}</textarea>
</div>

<input type="submit" class="btn btn-success" value="{{ $mode == 'Create' ? 'Create' : 'Update' }}">

<a class="btn btn-primary" href="{{ url('links') }}">Cancel</a>

Vraag 1, de php functie isset wordt een paar gebruikt in deze template, wat doet deze en waarom is deze nodig?

Vraag 2, de button tekst (regel 16)  is variabel. Wat kan de button tekst worden en waar hangt dat van af?

VraagNu 3,gaan Watwe gebeurtnaar erde control kijken die wordt aangeroepen als we een nieuwe link aanmaken, probeer het en denk aan de routing tabel . Welke control moeten we maken om de create uit te voeren?

Als je het antwoord op vraag 3 hebt, dan kun je de juiste control opzoeken en daar de code inzetten die de nieuwe links bewaard:

Als het goed is heb je nu de create werkend. Test of alles goed werkt voordat je verder gaat.

Edit

De create en edit lijken veel op elkaar dus de edit isknop nuindrukken. een fluitje van een cent.

Control

In de tabel voor alle routing kun je zien dat de standaard url voor een edit is /link/ID/edit.  Zoek in de tabel weer op welke control er wordt aangeroepen. Ga naar deze control en plaats daar de volgende code:

Je kunt met de echo die in commentaar staat zien hoe dat werkt.

We hebben nu het juiste form en kunnen de rows van de link wijzigen, maar wat gebeurt er als je op Update drukt? In het form (de wrapper) staat iets bijzonders namelijk {{ method_field('PATCH') doet.}} Dit zorgt ervoor dat de action van het form geen POSTof GET is maar PATCH. Zoek in de tabel op welke method daarbij hoort in de controller.

Plaats dan deze code bij deze method:

//dd($request);
$modifiedLink = request()->except(['_token','_method']);
//dd($modifiedLink);
Link::where('id', '=', $id)->update($modifiedLink);
return redirect('links');

Met de regels die in commantaar staan kan je zelf uitzoeken wat er precies gebeurt.

Als het goed is heb je nu een werkende edit functie.

Create

De edit.blade.phpcreate templatecode hadden we al eens gemaakt en zag er als voglt uit:

Zoek in de tabel op waar deze code moet in de controller moet staan en plaats deze code. Let op dat als de code klaar is dat je weer terug wilt naar je overzichtpagina. Plaats hiervoor de juiste code op regel 6, dus na de sav().

We hoeven alleen nog maar een wrapper voor de create te maken, deze lijkt erg op de create.blade.php:wrapper voor de edit, maar is net iets anders:

@extends('layouts.app')

@section('content')

<div class="container">
    <form action="{{ url('/links/' . $link->id)links') }}" class="form-horizontal" method="POST"post" enctype="multipart/form-data">
        {{ csrf_field() }}
        {{ method_field('PATCH') }}
        @include('links.form', ['mode' => 'edit'create'])
    </form>
</div>

@endsection

Deze 

template

De verschillen met de wrapper van de edit zijn:

  1. de form action is opnieuwanders want er wordt geen ID meegegeven; een wrappernieuwe omentry heeft namelijk nog geen ID.
  2. de 'variabele' mode is anders zodat het form 'weet' dat het een create form en geen edit form is.

Opdracht

In het create form staat een button en de links/form.blade.phptekst template.is 'update'. Dit was niet de bedoeling, de tekst moest afhankelijk zijn van de wrapper die het form aanroept: bij een update zou de tekst Update moeten zijn en bij create zou de tekst Create moeten zijn. Kijk wat er fout is en los dit bugje op.

---