# Views optimaliseren

### Inleiding

We hebben nu een werkende CRUD.

We gaan nog wat aanpassingen maken, maar we gaan eerst onze view een beetje herorganiseren.

We hebben nu drie views:

1. index
2. edit
3. update

Deze drie views lijken op elkaar en hebben allemaal een standaard HTML template. Eigenlijk is alleen de &lt;body&gt;&lt;/body&gt; anders.

En als we later een menu of banner willen maken dan zal die banner op alle drie de pagina's getoond moeten worden.

We gaan de template nu splitsen in een basis template en in een deel dat voor de views anders is.

### Basis (blade) template

Maak een nieuwe template in de *resources/view* folder en noem deze base.blade.php.

Plaatst de volgende code.

**<span style="color: #000000;">resources/view/base.blade.php</span>**

```PHP

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    <title>Stocks</title>
</head>
<body>
  <div class="container" style="margin:40px;">
    <h1 class="display-3">Stocks</h1>
    @yield('main')
  </div>
</body>
</html>
```

In de index.blade.php (in de stocks folder!) passen we de template aan.

**<span style="text-decoration: underline;">resources/view/stocks/index.blade.php</span>**

```PHP
@extends('base')
 
@section('content')
  <div>
    <a href="/stocks/create" class="btn btn-primary mb-3">Add Stock</a>
  </div>     

  <table class="table">
    <thead class="thead-light">
        <tr>
          <th>ID</th>
          <th>Stock Name</th>
          <th>Stock Ticket</th>
          <th>Stock Value</th>
          <th>Updated at</th>
          <th>Update</th>
          <th>Delete</th>
        </tr>
    </thead>
    <tbody>
        @foreach($stocks as $stock)
        <tr>
            <td>{{$stock->id}}</td>
            <td>{{$stock->stock_name}} </td>
            <td>{{$stock->ticket}}</td>
            <td>{{$stock->value}}</td>
            <td>{{$stock->updated_at}}</td>
            <td><a href="/stocks/edit/{{$stock->id}}" class="btn btn-primary">Edit</a></td>
            <td>
              <form action="/stocks/destroy/{{$stock->id}}" method="post">
                @csrf
                <button onclick="return confirm('Are you sure?')" class="btn btn-danger" type="submit">Delete</button>
              </form>
          </td>
        </tr>
        @endforeach
    </tbody>
  </table>
@endsection
```

Vanuit de controller wordt nog steeds de *index.blade.php* aangeroepen. Op regel 1 wordt de *base.blade.php* file als het ware included. De *base* view wordt als het ware op regel 1 ingevoegd.

In de base view staat (op regel 13) yield('content'). Dit zorgt ervoor dat alle code die in de index view tussen @section('content') en @endsection staat, wordt ingevoegd op regel 13 van de base view.

Lees dit nog een keer goed door, bekijk de templates en probeer te begrijpen wat er gebeurt.

### Opdracht

Verander de *create* en *update* view ook zodat deze ook gebruik maken van de base view.

Op regel 1 van de *create* en *update* view moet je dus `@extends('base')` plaatsen.

Er zijn nu drie pagina's die allemaal gebruik maken van de base view. Alle pagina's hebben dezelfde &lt;h1&gt;&lt;/h1&gt; title. Die gaan we aanpassen. De *create*, *update* en *index view* krijgen allemaal een eigen titel.

### Titel aanpassen

In de index.blade.php zetten we vlak voor de `@section('content')` de volgende regel code:

```PHP
@section('title', 'List of Stocks')
```

Dit is eigenlijk hetzelfde als:

```PHP
@section('title')
List of Stocks
@endsection
```

Er is dus nu een nieuwe sectie met allen de string "List of Stocks".

In de base view wordt de titel regel vervangen door:

```PHP
<h1 class="display-3">@yield('title')</h1>
```

Op deze manier wordt de section 'titel' in de &lt;h1&gt; tag geplaatst.

### Opdracht

Als dit werkt dan pas je op dezelfde manier de titel voor de *create* en *update* pagina aan.

<table border="1" id="bkmrk-view-titel-index-lis" style="border-collapse: collapse; width: 54.321%; height: 117.867px;"><tbody><tr style="height: 29.4667px;"><td style="width: 26.0708%; height: 29.4667px; background-color: #ced4d9;">**View**  
</td><td style="width: 73.888%; height: 29.4667px; background-color: #ced4d9;">**Titel**  
</td></tr><tr style="height: 29.4667px;"><td style="width: 26.0708%; height: 29.4667px;">index  
</td><td style="width: 73.888%; height: 29.4667px;">List of Stocks  
</td></tr><tr style="height: 29.4667px;"><td style="width: 26.0708%; height: 29.4667px;">create  
</td><td style="width: 73.888%; height: 29.4667px;">New Stock</td></tr><tr style="height: 29.4667px;"><td style="width: 26.0708%; height: 29.4667px;">update  
</td><td style="width: 73.888%; height: 29.4667px;">Update Stock  
</td></tr></tbody></table>

### Test

Controleer goed of alles werkt!

Als het goed is, dan zien de schermen er zo uit:

<table border="1" id="bkmrk-" style="border-collapse: collapse; width: 100%;"><tbody><tr><td style="width: 31.3825%;">[![image-1667149687521.png](https://www.roc.ovh/uploads/images/gallery/2022-10/scaled-1680-/image-1667149687521.png)](https://www.roc.ovh/uploads/images/gallery/2022-10/image-1667149687521.png)

</td><td style="width: 35.3391%;">[![image-1667149703560.png](https://www.roc.ovh/uploads/images/gallery/2022-10/scaled-1680-/image-1667149703560.png)](https://www.roc.ovh/uploads/images/gallery/2022-10/image-1667149703560.png)

</td><td style="width: 33.3608%;">[![image-1667149719155.png](https://www.roc.ovh/uploads/images/gallery/2022-10/scaled-1680-/image-1667149719155.png)](https://www.roc.ovh/uploads/images/gallery/2022-10/image-1667149719155.png)

</td></tr></tbody></table>

\--

</body></html>