Laravel Widgets на нескольких страницах - PullRequest
0 голосов
/ 08 июня 2018

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

enter image description here

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

div class="col-xs-2">
    @if(Route::current()->uri() == 'welcome')

        <form action="{{ action('WidgetController@destroy', $widgetNo ) }}" method="post">
            @csrf @method('delete')
            <button type="submit" class="widget">
                <i class="fa fa-bars "></i>
            </button>
        </form>

    @elseif(Route::current()->uri() == 'widget-library') 

        @foreach($user->widgets as $widget) 
            @if($widget->widget_id == $widgetNo)

                <i class="fa fa-bars "></i>

                @else

                <form action="{{action('WidgetController@store')}}" method="POST">
                    @csrf
                    <input type="hidden" name="user_id" value="{{ $user->id }}">
                    <input type="hidden" name="widget_id" value="{{ $widgetNo }}">

                    <button type="submit" class="widget">
                        <i class="fa fa-plus "></i>
                    </button>
                </form>

            @endif 
        @endforeach 
    @endif
</div>

Когда в «Библиотеке виджетов» код проверяет, какие виджеты есть у пользователя, и ставит плюс или полосу(поскольку я хочу, чтобы пользователь не добавлял виджет, который у него уже есть).

Когда у вас есть только один виджет, он выглядит так:

enter image description here

Как видите, это работает.

Однако есть две проблемы.

  • Когда у пользователя более одногоВиджет цикла foreach многократно повторяется, создавая несколько кнопок.
  • Кроме того, когда у пользователя нет виджетов, значки не отображаются, поскольку они созданы в цикле foreach.

Сами виджеты являются просто HTML, поэтому для добавления уникального идентификатора я сделал следующее в моем WПредставление библиотеки idget.

@include('widgets.quick-search-full-width', ['widgetNo' => 1]) 
@include('widgets.calendar', ['widgetNo' => 2])
@include('widgets.suggestion', ['widgetNo' => 3])
@include('widgets.task', ['widgetNo' => 4])
@include('widgets.quick-search', ['widgetNo' => 5])
@include('widgets.message', ['widgetNo' => 6])
@include('widgets.find-expert', ['widgetNo' => 7])
@include('widgets.holiday', ['widgetNo' => 8])
@include('widgets.expenses', ['widgetNo' => 9])
@include('widgets.snap-pole', ['widgetNo' => 10])
@include('widgets.teams-cms', ['widgetNo' => 11])
@include('widgets.events-cms', ['widgetNo' => 12])
@include('widgets.team-cms', ['widgetNo' => 13]) 
@include('widgets.article-todo', ['widgetNo' => 14]) 
@include('widgets.article-cms', ['widgetNo' => 15]) 
@include('widgets.vacancies', ['widgetNo' => 16])
@include('widgets.yammer', ['widgetNo' => 17]) 
@include('widgets.poll-results', ['widgetNo' => 18])

Как вы можете видеть, я передаю идентификатор для каждого виджета.

Затем на главной странице у меня есть большой оператор switch, чтобы решить, какая частьдля рендеринга.

@foreach ($user->widgets as $widget) 

    @switch($widget->widget_id) 

        @case (1) 
            @include('widgets.quick-search-full-width', ['widgetNo' => 1]) 
            @break; 
        @case(2) 
            @include('widgets.calendar', ['widgetNo' => 2]) 
            @break; 
        @case (3) 
            @include('widgets.suggestion', ['widgetNo' => 3]) 
            @break; 
        @case (4) 
            @include('widgets.task', ['widgetNo' => 4])
            @break; 
        @case (5) 
            @include('widgets.quick-search', ['widgetNo' => 5]) 
            @break; 
        @case (6) 
            @include('widgets.message', ['widgetNo' => 6])
            @break; 
        @case(7) 
            @include('widgets.find-expert', ['widgetNo' => 7]) 
            @break; 
        @case (8) 
            @include('widgets.holiday', ['widgetNo' => 8]) 
            @break; 
        @case (9) 
            @include('widgets.expenses', ['widgetNo' => 9])
            @break; 
        @case (10) 
            @include('widgets.snap-pole', ['widgetNo' => 10]) 
            @break; 
        @case (11) 
            @include('widgets.teams-cms', ['widgetNo' => 11]) 
            @break; 
        @case (12)
            @include('widgets.events-cms', ['widgetNo' => 12]) 
            @break; 
        @case (13) 
            @include('widgets.team-cms', ['widgetNo' => 13]) 
            @break;  
        @case (14) 
            @include('widgets.article-todo', ['widgetNo' => 14]) 
            @break; 
        @case (15) 
            @include('widgets.article-cms', ['widgetNo' => 15]) 
            @break; 
        @case (16) 
            @include('widgets.vacancies', ['widgetNo' => 16]) 
            @break;
        @case(17) 
            @include('widgets.yammer', ['widgetNo' => 17]) 
            @break; 
        @case(18)
            @include('widgets.poll-results', ['widgetNo' => 18])
            @break
        @default
        <h3>You currently have no widgets</h3>
    @endswitch

@endforeach

Я думал, что смогу решить эту проблему простым разрывом цикла foreach, но это не сработало.

1 Ответ

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

Я хотел добавить еще одну версию ответа, чтобы учесть, как вы это делаете в данный момент.Надеюсь, я понимаю, как вы это делаете.

Внутри главного блейда, где отображаются все виджеты:

@php
$activeWidgets = $user->widgets->pluck('widget_id')->toArray();
@endphp

@include('widgets.quick-search-full-width', ['active' => in_array(1, $activeWidgets)]) 
@include('widgets.calendar', ['active' => in_array(2, $activeWidgets)])
@include('widgets.suggestion', ['active' => in_array(3, $activeWidgets)])
@include('widgets.task', ['active' => in_array(4, $activeWidgets)])
....
@include('widgets.poll-results', ['active' => in_array(18, $activeWidgets)])

Внутри каждого конкретного виджета, где отображаются кнопки:

<!-- Displaying the buttons -->
@if ($active)
<i class="fa fa-bars "></i>
@else
<form action="{{action('WidgetController@store')}}" method="POST">
    @csrf
    <input type="hidden" name="user_id" value="{{ $user->id }}">
    <input type="hidden" name="widget_id" value="{{ $widgetNo }}">

    <button type="submit" class="widget">
        <i class="fa fa-plus "></i>
    </button>
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...