Использование Blade-файлов в качестве виджетов в Laravel - PullRequest
0 голосов
/ 07 июня 2018

У меня есть ситуация, когда у пользователя есть домашняя страница, которая будет заполнена виджетами, которые они могут добавлять или удалять, нажимая на них.

Каждый виджет, по сути, представляет собой просто файл блейда, хранящийся в 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 выглядит следующим образом:

enter image description here

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

/**
 * 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.

1 Ответ

0 голосов
/ 07 июня 2018

у вас может быть поле blade_name в базе данных, поэтому в этой форме, например, у вас есть «календарь» в записи этого виджета.так что вы можете добавить свои виджеты, как это

@foreach ($user->widgets as $widget) 
@include('widgets.'.$widget->blade_name)
@endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...