Повторная логика сортировки и страниц для нескольких компонентов Livewire. Livewire 3Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Повторная логика сортировки и страниц для нескольких компонентов Livewire. Livewire 3

Сообщение Anonymous »

Цель: создать многоразовую логику сортировки и страниц для нескольких компонентов LiveWire.

Код: Выделить всё

RecipeList.php
отвечает за фильтрацию рецептов на основе параметров URI, а также сортировка и их плюс. Каждый список рецептов должен иметь логику сортировки и страниц, и мне интересно: возможно ли повторно использовать логику сортировки и страниц, чтобы избежать повторения в этих трех компонентах? /> < /ul>
Что отличается от компонентов?

Код: Выделить всё

class RecipeList extends Component
{
public $sort = 'popularity';

public $dish_category = '';
public $dish_subcategory = '';
public $cuisine = '';
public $menu = '';

protected $queryString = [
'dish_category',
'dish_subcategory',
'cuisine',
'menu',
];

public function mount(RecipeFilterRequest $request): void
{
// mount component
}

public function render()
{
$recipes = $this->getFilteredRecipes();
return view('livewire.recipe-list', ['recipes' => $recipes]);
}

public function getFilteredRecipes(): LengthAwarePaginator
{
// Filter logic using URL parameters
$query = Recipe::with('...');

// Sort filtered recipes using $this->sort
if ($this->sort == 'popularity') {
$query->orderByDesc('likesCount');
} elseif {
// order logic for newest & oldest
// ...
}

return $query->paginate(3);
}
}
recipe-list.blade.php:[/b]

Код: Выделить всё

{{-- Dropdown filter --}}
Sort by:

By Popularity
Newest
Oldest


{{-- Pagination --}}

{{ $recipes->links(data: ['scrollTo' => false]) }}

{{-- Recipes--}}
@forelse($recipes as $recipe)
id }}">


@empty
empty
@endforelse
Что я попробовал:
Я создал черту hassortingandpagination.php :

Код: Выделить всё

trait HasSortingAndPagination
{
// Default sorting parameter
public string $sort = 'popularity';

// Sorting logic
public function applySorting(Builder $query): Builder
{
return match ($this->sort){
'popularity' => $query
->orderByDesc('savedCount')
->orderByDesc('likesCount')
->orderBy('dislikesCount')
->orderByDesc('created_at'),
'newest' => $query->orderByDesc('created_at'),
'oldest' => $query->orderBy('created_at'),
default => $query, // user types ?sort=foobar => error
};
}

// Pagination logic
public function paginateQuery(Builder $query, $perPage = 10): LengthAwarePaginator
{
return $query->paginate($perPage);
}
}
и реализовал эту черту в gateelist.php :

Код: Выделить всё

class RecipeList extends Component
{
use WithPagination;
use HasSortingAndPagination;

// public properties are the same

// protected $queryString also the same

public function mount(RecipeFilterRequest $request): void
{
// mount
}

public function render()
{
$recipes = $this->getFilteredRecipes();

return view('livewire.recipe-list', [
'recipes' => $recipes
]);
}

public function getFilteredRecipes(): \Illuminate\Pagination\LengthAwarePaginator
{
// Filter logic using URL parameters
$query = Recipe::with('...');

// Sort filtered recipes using $this->sort
$this->applySorting($query);

// Paginate
return $this->paginateQuery($query, 2);
}
}
Какие дополнительные варианты я могу использовать, чтобы не повторяться?>

Подробнее здесь: https://stackoverflow.com/questions/796 ... livewire-3
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»