добавить выбранное название мультикатегории в URL с разделителем "-" автоматически Laravel - PullRequest
1 голос
/ 27 января 2020

Привет, мое приложение требует показа постов из нескольких категорий. когда пользователь проверяет флажок категории, страница публикаций обновляется и показывает сообщения, которые принадлежат к выбранной категории, а когда пользователь устанавливает флажок другой категории, страница обновляется и показывает сообщения, которые принадлежат к обеим выбранным категориям, в моем сценарии URL должен быть таким:

http://localhost: 8000 / posts? & Cat_Name = sport-economi c

Я получил URL и взорвался в массив с разделителем "-" и отлично работает, когда я добавляю Параметры cat_Name для URL вручную с "-". у меня вопрос, как это можно сделать автоматически, что означает, что когда я выбираю категории, автоматически добавляю имя выбранных категорий в параметр cat_Name с разделителем "-", как предыдущий URL? отношение между публикацией и категорией «многие ко многим»

Форма флажка в блейде:

<form action="{{ url('/posts-filter') }}" method="post">{{ csrf_field() }}
    <h3>categories</h3>
    <ul id="tree1">
        @foreach($categories as $category)
            @if(!empty($_GET['cat']))
                <?php $categoryArr = explode('-',$_GET['cat']) ?>
                @if(in_array($category,$categoryArr))
                    <?php $categorycheck="checked"; ?>
                @else
                    <?php $categorycheck=""; ?>
                @endif
            @else
                <?php $categorycheck=""; ?>
            @endif
            <li>
                <input name="categoryFilter[]" onchange="javascript:this.form.submit();" id="{{ $category->id }}" value="{{ $category->name }}" type="checkbox" {{ $categorycheck }}>&nbsp;&nbsp;<span class="products-colors">{{ $category->name }}</span>
                @if(count($category->childs) )
                    @include('news.cat',['childs' => $category->childs])
                @endif
            </li>
        @endforeach
    </ul>
</form>

Функция фильтра, которая выбирает запрос формы:

    public function filter(Request $request){

        $data = $request->all();
        $cat_Name="";
        if(!empty($data['categoryFilter'])){
            foreach($data['categoryFilter'] as $cat){
                if(empty($cat_Name)){
                    $cat_Name = "&cat_Name=".$cat;
                }else{
                    $cat_Name .= "-".$cat;
                }
            }
        }

        $finalUrl = "posts"."?".$cat_Name;
        return redirect::to($finalUrl);
    }

Функция сообщений:

public function posts(Request $request){
    $categories = Category::where([
        ['type', '=', 'post'],
        ['parent_id', '=', 0],
    ])->get();
    if(!empty($request->input('cat_Name'))){
        $categoryArray = explode('-', $request->input('cat_Name'));
        $news = News::whereHas('categories', function($q) use ($categoryArray) {
            return $q->whereIn('name', $categoryArray);
        })->get();

    }else{
        $posts = Post::where('status', 'published')->paginate(5);
    }

    return view('post.index',compact('posts','categories'));
}

Моя проблема с кодом состоит в отображении одной категории каждый раз в URL, а не в добавление к прошлому URL-адресу cat_Name с разделителем "-"

1 Ответ

0 голосов
/ 27 января 2020

Не используйте «-» в качестве разделителя, потому что вам нужно написать кучу кода, чтобы исправить поведение браузера / интерпретатора по умолчанию.

Если вы используете флажок, как в вашем примере (упрощенно):

<input type="checkbox" name="category[]" onchange="javascript:this.form.submit();" value="{{ $category->name }}"> {{ $category->name }}

После того, как вы измените одно из значений, оно должно сгенерировать URL-адрес следующим образом:

/posts?category[]=sport

/posts?category[]=sport&category[]=economic

На вашем Контроллер, к которому вы можете получить доступ, используя объект $request по умолчанию:

if ($categories = $request->category ) {
    $news = News::whereHas('categories', function ($q) use ($categories) {
        return $q->whereIn('name', $categories);
    })->get();
}

Если вы хотите использовать URL-адрес фильтра, дружественного к URL, вы можете взглянуть на Spat ie 's Laravel Query Builder и т. Д. пакет VUE API Query для создания более привлекательных URL. Тем не менее, это может быть довольно сложно быстро, поэтому я буду придерживаться значений по умолчанию, как предложено выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...