kriszpchicken's avatar

Display original values in edit form for checkbox and select

I made an edit function for my application, and when I click on it I can get the old values for the text inputs, but not for the select and checkbox ones. I am not sure how I should do it. Could you give me some suggestions please?

@extends('layout')

@section('title')
<title>Buch bearbeiten</title>
@section('stylesheets')
<script src="http://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/select2.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/select2.min.css" rel="stylesheet" />


@endsection
@section('content')
<style>
  .uper {
    margin-top: 40px;
  }
</style>

<div class="card uper">
    <div class="card-header">
        Buch bearbeiten
    </div>
    <div class="card-body">
        <form method="post" action="{{ route('books.update', $book->id) }}">
            <div class="form-group">
                @csrf
                @method('PATCH')
                <label for="title">Titel:</label>
                <input type="text" class="form-control" name="title" value="{{ $book->title }}" />
                @error('title')
                <div class="alert alert-danger">{{ $message }}</div>
                @enderror
            </div>
            <div class="form-group">
                <label for="author_id">Author(en):</label>
                <select name="author_id[]" multiple class="form-control select2-multi <!-- @error('author_id') is-invalid @enderror -->">
                    @foreach ($authors as $author)
                    <option value="{{ $author->id }}">{{ $author->name }}</option>
                    @endforeach
                </select>
                @error('authors')
                <div class="alert alert-danger">{{ $message }}</div>
                @enderror
            </div>
            <div class="form-group">
                <label for="year">Jahr:</label>
                <input type="text" class="form-control" name="year" value="{{ $book->year }}" />
                @error('year')
                <div class="alert alert-danger">{{ $message }}</div>
                @enderror
            </div>
            <div class="form-group">
                <label for="publishers">Verlag(e):</label>
                <select name="publishers[]" multiple class="form-control select2-multi <!-- @error('publishers') is-invalid @enderror -->">
                    @foreach ($publishers as $publisher)
                    <option value="{{ $publisher->id }}">{{ $publisher->name }}</option>
                    @endforeach
                </select>
                @error('publishers')
                <div class="alert alert-danger">{{ $message }}</div>
                @enderror
            </div>

            <div class="form-group">
                <label for="genres">Genre(s):</label>
                @foreach($genres as $genre)
                <input type="checkbox" name="genres[]" value="{{ $genre->id }}">{{ $genre->name }}
                @endforeach
                </select>
                @error('genre_id')
                <div class="alert alert-danger">{{ $message }}</div>
                @enderror
            </div>

            <div class="form-group">
                <label for="language_id">Sprache:</label>
                <select name="language_id" class="form-control @error('language_id') is-invalid @enderror">
                    <option value="{{ old('language_id')}}">-- {{ __('Spache auswählen') }} --</option>
                    @foreach ($languages as $language)
                    <option value="{{ $language->id }}">{{ $language->name }}</option>
                    @endforeach
                </select>
                @error('language_id')
                <div class="alert alert-danger">{{ $message }}</div>
                @enderror
            </div>
            
            <div class="form-group">
                <label for="isbn">ISBN:</label>
                <input type="text" class="form-control" name="isbn" value="{{ $book->isbn }}" />
                @error('isbn')
                <div class="alert alert-danger">{{ $message }}</div>
                @enderror
            </div>
            <div class="form-group">
                <label for="pages">Seitenzahl:</label>
                <input type="text" class="form-control" name="pages" value="{{ $book->pages }}" />
                @error('pages')
                <div class="alert alert-danger">{{ $message }}</div>
                @enderror
            </div>
            <button type="submit" class="btn btn-primary">Hinzufügen</button>
        </form>
    </div>
</div>
<script type="text/javascript">
        $(".select2-multi").select2();
	</script>
@endsection
0 likes
6 replies
kriszpchicken's avatar

Yes, I'm just not really sure how to do that, that's why I asked again. Could you please explain?

piljac1's avatar

For selects

<div class="form-group">
    <label for="language_id">Sprache:</label>
    <select name="language_id" class="form-control @error('language_id') is-invalid @enderror">
        <option value="">-- {{ __('Spache auswählen') }} --</option>
        @foreach ($languages as $language)
            <option value="{{ $language->id }}"{{ old('language_id') == $language->id ? ' selected' : '' }}>{{ $language->name }}</option>
        @endforeach
    </select>
    @error('language_id')
        <div class="alert alert-danger">{{ $message }}</div>
    @enderror
</div>

For checkbox arrays

<div class="form-group">
    <label for="genres">Genre(s):</label>
    @foreach($genres as $genre)
        <input type="checkbox" name="genres[]" value="{{ $genre->id }}"{{ is_array(old('genres')) && in_array($genre->id, old('genres')) ? ' checked' : '' }}>{{ $genre->name }}
    @endforeach
    @error('genre_id')
        <div class="alert alert-danger">{{ $message }}</div>
    @enderror
</div>
kriszpchicken's avatar

Thank you! However, these only work when I am trying to send a form, which then gets validated and if I have an error these values will be input already. If I open an item that was created before and I want to edit it I can't see these values.

piljac1's avatar
piljac1
Best Answer
Level 28

Oh ! Try this then. The old function accepts a second parameter which is the fallback value if the old value isn't set.

P.S. For the select example, I'm using the optional helper because I don't know if a book can have no associated language in your database.

For selects

<div class="form-group">
    <label for="language_id">Sprache:</label>
    <select name="language_id" class="form-control @error('language_id') is-invalid @enderror">
        <option value="">-- {{ __('Spache auswählen') }} --</option>
        @foreach ($languages as $language)
            <option value="{{ $language->id }}"{{ old('language_id', optional($book->language)->id) == $language->id ? ' selected' : '' }}>{{ $language->name }}</option>
        @endforeach
    </select>
    @error('language_id')
        <div class="alert alert-danger">{{ $message }}</div>
    @enderror
</div>

For checkbox arrays

@php
    // Instead of doing this logic here, I suggest you create an attribute which does the following logic
    $genreIds = $book->genres()->pluck('id')->all();
@endphp
<div class="form-group">
    <label for="genres">Genre(s):</label>
    @foreach($genres as $genre)
        <input type="checkbox" name="genres[]" value="{{ $genre->id }}"{{ is_array(old('genres', $genreIds)) && in_array($genre->id, old('genres', $genreIds)) ? ' checked' : '' }}>{{ $genre->name }}
    @endforeach
    @error('genre_id')
        <div class="alert alert-danger">{{ $message }}</div>
    @enderror
</div>

Please or to participate in this conversation.