У меня есть ситуация, когда у пользователя есть домашняя страница, которая будет заполнена виджетами, которые они могут добавлять или удалять, нажимая на них.
Каждый виджет, по сути, представляет собой просто файл блейда, хранящийся в resources/views/widgets
Пример:
@php
$widgetNo = 15;
$exist = false;
@endphp
@hasanyrole('News Contributor|News Approver')
<div class="grid-item element-item">
<section class="widget" id="articles-cms">
<div class="form-box widget light_blue">
<div class="row header">
<div class="col-xs-10">
<div class="heading">
<h2>News articles</h2>
</div>
</div>
<div class="col-xs-2 AddWidget">
@if(Route::current()->uri() == 'welcome')
<i class="fa fa-bars "></i>
@elseif(Route::current()->uri() == 'widget-library')
<form action="{{action('WidgetController@store')}}" method="POST">
@csrf
<input type="hidden" name="user_id" value="{{$user->id}}">
<input type="hidden" name="widgets" value="12">
<button type="submit">
<i class="fa fa-plus "></i>
</button>
</form>
@else @endif
</div>
</div>
<div class="row">
<div class="form-group col-xs-12 col-md-12">
<p class="info">Create and edit News and updates</p>
<a href="/editable/news-and-updates" class="btn btn-filled-navy btn-full-width no-margin">Click Here</a>
</div>
</div>
</div>
</section>
</div>
@endrole
Причина PHP вначало в том, что у каждого виджета есть идентификатор, с которым я могу работать, поскольку вы можете видеть, что каждый виджет также имеет форму для сохранения и уничтожения в зависимости от того, где они находятся в приложении.
Конструктивно у меня есть две таблицы: users
и widgets
Таблица widgets
выглядит следующим образом:
В моей модели пользователя у меня есть один длямногие отношения с виджетами, которые выглядят так:
/**
* A user may have many Widgets
*
* @return void
*/
public function widgets()
{
return $this->hasMany(Widget::class, 'user_id', 'id')->orderBy('position', 'asc');
}
Имея это место, я могу использовать отношение в представлении.
У меня также есть эти два метода в модели виджетов.
/**
* Get the user that has this Widget
*/
public function user()
{
return $this->belongsTo(User::class, 'user_id', 'id');
}
/**
* Check whether a given user has this Widget
*/
public function getIsSelected()
{
$selected = $this->user()->whereUserId(Auth::user()->id)->first();
return (!is_null($selected)) ? true : false;
}
Это так, чтобы я мог проверить, был ли выбран виджет пользователем.
На данный момент на моей домашней странице просто есть оператор switch.
@foreach ($user->widgets as $widget)
@switch($widget->widget_id)
@case (1)
@include('widgets.quick-search-full-width')
@break;
@case(2)
@include('widgets.calendar')
@break;
@case (3)
@include('widgets.suggestion')
@break;
@case (4)
@include('widgets.task')
@break;
@case (5)
@include('widgets.quick-search')
@break;
@case (6)
@include('widgets.message')
@break;
@case(7)
@include('widgets.find-expert')
@break;
@case (8)
@include('widgets.holiday')
@break;
@case (9)
@include('widgets.expenses')
@break;
@case (10)
@include('widgets.snap-pole')
@break;
@case (11)
@include('widgets.teams-cms')
@break;
@case (12)
@include('widgets.events-cms')
@break;
@case (13)
@include('widgets.team-cms')
@break;
@case (14)
@include('widgets.article-todo')
@break;
@case (15)
@include('widgets.article-cms')
@break;
@case (16)
@include('widgets.vacancies')
@break;
@case(17)
@include('widgets.yammer')
@break;
@default
<h3>You currently have no widgets</h3>
@endswitch
@endforeach
У меня вопрос, есть ли лучший способ вытащить или использовать эти виджеты, как, очевидно, на данный момент, отображение Widget полностью зависит от наличия идентификатора в виджете с использованием ванильного PHP.