Commander Spuds
Commander Spuds

Reputation: 1

Undefined variable: user_id in Laravel view

The Routes Route::get('/adminContacts/{user_id}', 'AdminContactsController@index')->name('adminContacts.index')->middleware('is_admin'); Route::get('/adminContacts/{user_id}/create', 'AdminContactsController@create')->name('adminContacts.create')->middleware('is_admin');

adminContactController

public function index($user_id)
{
    // Confirm User exists
    User::findOrFail($user_id);

    $filter = request('filter', NULL);
    $contacts = NULL;

    if ($filter == NULL)
        $contacts = Contacts::query()->where('owner_id', $user_id)->sortable()->paginate(5);
    else
    $contacts = Contacts::query()->where('owner_id', $user_id)->where('name', 'like', '%'.$filter.'%')
                                 ->orWhere('number', 'like', '%'.$filter.'%')
                                 ->sortable()->paginate(5);

    return view('adminContacts.index')->withContacts($contacts)->withUserId($user_id);
}

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create($user_id)
{
    return view('adminContacts.create')->withUserId($user_id);
}

index.blade.php

<div class="container">
    <h1 class="jumbotron">Sample Phone Book</h1>

    <a href="{{ route('adminContacts.create', ['user_id' => $user_id] ) }}" class="btn btn-primary btn-block" style="margin-bottom: 5px">Add Contact</a>
</div>

<!--Search Field -->
<div class="container">
    <form method="GET" action="{{ route('adminContacts.index') }}">
        <input type="text" name='filter' class='input' placeholder='Search' value="{{ request('filter') }}">
            @if (request('filter'))
                <a class="btn btn-primary btn-sm" href="{{ route('adminContacts.index') }}">X</a>
            @endif
    </form>
</div>

<!-- Table -->
<div class="container">
    <div class="row" >
        <table class="table table-hover" id="contactsTable">
            <thead>
                <tr>
                    <th>#</th>
                    <th>@sortablelink('name', 'Contact Name')</th>
                    <th>@sortablelink('number', 'Phone Number')</th>
                    <th>
                        <button class="btn btn-primary btn-sm">Prepend</button>
                    </th>
                </tr>
            </thead>

        <!--Loop through all the cutomers and output them on the table-->
        @foreach($contacts as $contact)
            <tbody>
                <tr>
                    <td>{{ $contact->id }}</td>
                    <td>{{ $contact->name }}</td>
                    <td>{{ $contact->number }}</td> 
                    <td>
                        <a href="{{ route('adminContacts.edit', $contact->id) }}" class="btn btn-primary btn-sm">View</a>   
                    </td>
                </tr>
            </tbody>
        @endforeach
        </table>

        {!! $contacts->appends(\Request::except('page'))->render() !!}
    </div>  
</div>

The error is: Undefined variable: user_id (View: D:\laragon\www\SampleContacts\resources\views\adminContacts\index.blade.php)

Am I missing something? The idea is to pass the $user_id to the adminContact.create form where i can use it to set $contact->owner_id = $user_id; so the entered contact apears under that users table.

Upvotes: 0

Views: 1907

Answers (3)

Commander Spuds
Commander Spuds

Reputation: 1

Found the problem.

@extends('layouts.app')

@section('content')

<div class="container">
    <h1 class="jumbotron">Sample Phone Book</h1>

    <a href="{{ route('adminContacts.create', ['user_id' => $user_id] ) }}" class="btn btn-primary btn-block" style="margin-bottom: 5px">Add Contact</a>
</div>

<!--Search Field -->
<div class="container">
    <form method="GET" action="{{ route('adminContacts.index', $user_id) }}">
        <input type="text" name='filter' class='input' placeholder='Search' value="{{ request('filter') }}">
            @if (request('filter'))
                <a class="btn btn-primary btn-sm" href="{{ route('adminContacts.index',  $user_id) }}">X</a>
            @endif
    </form>
</div>

<!-- Table -->
<div class="container">
    <div class="row" >
        <table class="table table-hover" id="contactsTable">
            <thead>
                <tr>
                    <th>#</th>
                    <th>@sortablelink('name', 'Contact Name')</th>
                    <th>@sortablelink('number', 'Phone Number')</th>
                    <th>
                        <button class="btn btn-primary btn-sm">Prepend</button>
                    </th>
                </tr>
            </thead>

        <!--Loop through all the cutomers and output them on the table-->
        @foreach($contacts as $contact)
            <tbody>
                <tr>
                    <td>{{ $contact->id }}</td>
                    <td>{{ $contact->name }}</td>
                    <td>{{ $contact->number }}</td> 
                    <td>
                        <a href="{{ route('adminContacts.edit', $contact->id) }}" class="btn btn-primary btn-sm">View</a>   
                    </td>
                </tr>
            </tbody>
        @endforeach
        </table>

        {!! $contacts->appends(\Request::except('page'))->render() !!}
    </div>  
</div>

@endsection

Anywhere where there is a {{ route('adminContacts.index') }} it also needed the $user_id to be passed along with it because I'm also using it in the routes as '/adminContacts/{user_id}'

Thank you for all the help.

Upvotes: 0

Nick Dawes
Nick Dawes

Reputation: 2244

You could explicitly name the variable when passing it to the view, either this way

return view('adminContacts.index')->with('user_id', $user_id);

Or

return view('adminContract.index', compact('user_id'));

I'm not sure what the name of the variable becomes when passed to the view via withUserId, but I'm guessing this is the issue.

Upvotes: 1

rpm192
rpm192

Reputation: 2454

I don't think you can pass variables into your view like you're doing now.

In your controller, try changing this line:

return view('adminContacts.index')->withContacts($contacts)->withUserId($user_id);

To this:

return view('adminContacts.index')->with('contacts', $contacts)->with('user_id', $user_id);

Upvotes: 1

Related Questions