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

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.

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 is variabel. Wat kan de button tekst worden en waar hangt dat van af?

Vraag 3, Wat gebeurt er 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 is nu 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:

Kijk met echo print_r wat de PHP functie compact() doet.

De edit.blade.php template lijkt erg op de create.blade.php:

@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

Deze template is opnieuw een wrapper om de links/form.blade.php template.

---