Значений из разных таблиц в один шаблон Laravel 5.4 + json

760
28 июля 2017, 03:03

Доброе время суток.

Есть вопрос: как с контролера создать переменную не, привязную к шаблону. То есть, у нас есть, скажем, 3 таблицы из базы:

public function index(Request $request)
    {
        $country = new Country();
        $city = new City;
        $items = Clients::orderby('id', 'ASC')->paginate(50);
        return response()->json($items);
    }

Одна из них выводиться через json. Как вывести все остальные в шаблон ?

Для большего понимания выложил часть кода вывода:

Контроллер:

public function manageItemAjax()
    {
        return view('manage-item-ajax');
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $items = Clients::orderby('id', 'ASC')->paginate(50);
        return response()->json($items);
    }

index.blade.php:

<table data-role="table" id="movie-table-custom" data-mode="reflow" class="movie-list table-stroke table table-bordered table-hover tblSearch" cellspacing="0">
        <thead>
        <tr>
            <th>ID</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Email</th>
            <th>Address</th>
            <th>City</th>
            <th>Country</th>
            <th>Edit/Delete</th>
        </tr>
        </thead>
        <tbody>
            {{--Body of all clients--}}
        </tbody>
</table>

и наш js:

var page = 1;
var current_page = 1;
var total_page = 0;
var is_ajax_fire = 0;
manageData();
/* Manage data list */
function manageData() {
    jQuery.ajax({
        dataType: 'json',
        url: url,
        data: {page: page}
    }).done(function (data) {
        total_page = data.last_page;
        current_page = data.current_page;
        jQuery('#pagination').twbsPagination({
            totalPages: total_page,
            visiblePages: current_page,
            onPageClick: function (event, pageL) {
                page = pageL;
                if (is_ajax_fire != 0) {
                    getPageData();
                }
            }
        });
        manageRow(data.data);
        is_ajax_fire = 1;
    });
}
jQuery.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': jQuery('meta[name="csrf-token"]').attr('content')
    }
});
/* Get Page Data*/
function getPageData() {
    jQuery.ajax({
        dataType: 'json',
        url: url,
        data: {page: page}
    }).done(function (data) {
        manageRow(data.data);
    });
}
/* Add new Item table row */
function manageRow(data) {
    var rows = '';
    jQuery.each(data, function (key, value) {
        rows += '<tr class="clients' + value.id + '">' +
            '<td><b>ID: </b><span>' + value.id + '</span></td>' +
            '<td class="firstnameAdd"><b>First Name: </b><span>' + value.firstname + '</span></td>' +
            '<td class="lastnameAdd"><b>Last Name: </b><span>' + value.lastname + '</span></td>' +
            '<td class="emailAdd"><b>Email: </b><span>' + value.email + '</span></td>' +
            '<td class="addressAdd"><b>Address: </b><span>' + value.address + '</span></td>' +
            '<td class="cityAdd"><b>City: </b><span>' + value.city + '</span></td>' +
            '<td class="countryAdd"><b>Country: </b><span>' + value.country + '</span></td>' +
            '<td data-id="' + value.id + '">' +
            '<button data-toggle="modal" data-target="#edit-item" class="btn btn-primary edit-item" title="edit"><i class="fa fa-pencil" aria-hidden="true"></i></button>' +
            '<button data-toggle="modal" data-target="#delete-item" class="btn btn-danger delete-item" title="delete"><i class="fa fa-trash" aria-hidden="true"></i></button>' +
            '</td>' +
            '</tr>';
    });
    jQuery("tbody").html(rows);
}
Answer 1

Просто передай значения вторым аргументом

public function index(Request $request)
{
    $country = new Country();
    $city = new City;
    $items = response()->json(Clients::orderby('id', 'ASC')->paginate(50));
    return view('путь.к.шаблону', [
        'country' => $country,
        'city' => $city,
        'items' => $items
    ]);
}

http://laravel.su/docs/5.3/blade

Answer 2

Создавай готовый html на сервере и отдавай на клиент:

Контроллер:

public function index(Request $request)
{
    $country = new Country();
    $city = new City;
    $items = response()->json(Clients::orderby('id', 'ASC')->paginate(50));
    return response([
        'country' => $country,
        'city' => $city,
        'html' => view('parts._part', compact('items'))->render(),
    ]);
}

Клиент получит 3 переменные: country, city и html - здесь уже готовый html который нужно впихнуть в таблицу.

Создай views/parts/_part.blade.php:

@foreach($items as $item)
<tr>
    <tr>{{ $item->id }}</tr>
    ...
</tr>
@endforeach

В js файле, в фунции manageRow() вместо этого кошмара просто:

/* Add new Item table row */
function manageRow(data) {
    jQuery("tbody").html(data);
}

Здесь:

/* Get Page Data*/
function getPageData() {
    jQuery.ajax({
        dataType: 'json',
        url: url,
        data: {page: page}
    }).done(function (data) {
       // Здесь data.country, data.city, data.html
        manageRow(data.html);
    });
}
READ ALSO
Не вставляется json в базу

Не вставляется json в базу

ПриветПочему-то не вставляется JSON в базу

156
Html преобразуется в текст

Html преобразуется в текст

Кодом не вставляет, не могу понятьКак убрать это форматирование html на текст

190