Я получил 2 просмотра, и иногда второй должен использовать контент, который уже присутствует в первом, и наоборот.Как получить этот контент? - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть 2 очень похожих представления, которые отображаются, когда пользователь просматривает следующие URL-адреса:

www.example.com/admin/categories
www.example.com/admin/users

Первое представление:

<div class="admin-tabs">
    <p class='admin-tab' data-tab='categories'>Categories</p>
    <p class='admin-tab' data-tab='users'>Users</p>
</div>
<div class="admin-container">
    @foreach($categories as $category)
        <p>$category->name</p>
    @endforeach
</div>

Второе представление:

<div class="admin-tabs">
    <p class='admin-tab' data-tab='categories'>Categories</p>
    <p class='admin-tab' data-tab='users'>Users</p>
</div>
<div class="admin-container">
    @foreach($users as $user)
        <p>$user->username</p>
    @endforeach
</div>

Я успешно реализовал вызов AJAX, который срабатывает, когда администратор щелкает по любому из элементов <p> с классом admin-tab.Этот вызов AJAX определяет, по какому элементу <p> был выполнен щелчок, на основе вкладки данных и обновляет HTML-содержимое div с классом admin-container.

Вот что я не могу понять:

Если я нахожусь на URL www.example.com/admin/categories, я хочу обновить div-контейнер admin с тем, что находится внутри div-контейнера adminвторое представление.

И наоборот, если я нахожусь на URL www.example.com/admin/users, я хочу обновить div-контейнер admin с тем, что находится внутри div-контейнера admin первого изображения.

Я мог бы сделать это, создав 2 представления, которые содержат:

Первое представление:

@foreach($categories as $category)
    <p>$category->name</p>
@endforeach

Второе представление:

@foreach($users as $user)
    <p>$user->username</p>
@endforeach

А затем просто вернуть одно изоднако эти 2 представления, таким образом, я буду создавать дополнительные представления с повторяющимся кодом, который у меня уже есть где-то еще.Есть ли способ избежать этого, получив код из уже существующих представлений?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Одна идея состоит в том, чтобы переместить генерацию контента <p> в класс.

Похоже, у вас есть массивы с объектами в них.Я хотел бы предложить создать контейнерный класс (вы можете заставить его работать как массив), смысл в том, чтобы иметь метод render, который может выводить содержимое <p>.Он может действовать как массив для вашей коллекции объектов с интерфейсом ArrayAccess.

Если вы можете сделать это, тогда ваши шаблоны станут такими:

<div class="admin-tabs">
   <p class='admin-tab' data-tab='categories'>Categories</p>
   <p class='admin-tab' data-tab='users'>Users</p>
</div>
<div class="admin-container">
    $categories->render()
</div>

И

<div class="admin-tabs">
   <p class='admin-tab' data-tab='categories'>Categories</p>
   <p class='admin-tab' data-tab='users'>Users</p>
</div>
<div class="admin-container">
    $users->render()
</div>

Теперь должно быть достаточно ясно, почему я хотел это сделать.Но если нет, то, как вы можете видеть, шаблоны практически идентичны.Вы можете заменить $user и $categories на $obj, и они будут.

Так что теперь, изменяя, какой контейнер использует представление, вы можете контролировать то, что выводится.Для класса не лишено смысла контролировать его вывод.

Надеюсь, это поможет

0 голосов
/ 23 декабря 2018

Если вы находитесь в категории (URL), может быть, вы знаете, в контроллере это категории.Так что, если это параметр маршрута, вы можете использовать динамическое представление.У меня в гостях у вас есть:

Route::get('/admin/{slug}','MyController@myFunction');

Так что в вашем контроллере у вас будет

 function myFunction (Request $request, $slug) {
    if($slug == 'categories'){
       $categories = []; //get categories
       return view('categories',compact('categories'));
    }
    if($slug == 'uesrs'){
       $users = []; get users
       return view('users',compact('users'));
    }
 }

другой способ, который вы можете использовать, это вызов через ajax и получение html-рендера непосредственно и замена содержимого.ваш # admin-container

Попробуйте и дайте мне знать, как это работает.:)

...