Multiselect
ΠΠΎΠ»Π΅ Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ.
ΠΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΠ²ΡΠ·ΡΠΌΠΈ ΡΠ΅ΡΡΡΡΠ°, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΠΈ Π»ΡΠ±ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.
Π livewire ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ 2 ΠΏΠΎΠ»Ρ:
ΠΏΠΎΠ»Π΅ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² Π² multiselect
ΠΏΠΎΠ»Π΅ Ρ Π²ΡΠ±ΡΠ°Π½Π½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ
Multiselect Π±Π΅Π· ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π²ΡΠ²Π΅Π΄Π΅ΠΌ ΠΏΠΎΠ»Π΅ Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠ° ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ ΠΏΠΎΡΡΠ°.
posts
id - integer
title - string
categories
id - integer
title - string
post_category
post_id - integer
category_id - integer
ΠΠΎΠ΄ livewire ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°:
<?php
namespace App\Http\Livewire\Admin\Posts;
use App\Models\Category;
use App\Models\Post;
use WebVovan\RockCms\Http\Livewire\ResourceComponent;
class PostItem extends ResourceComponent
{
...
// Π‘ΠΏΠΈΡΠΎΠΊ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
public array $categories;
// Π‘ΠΏΠΈΡΠΎΠΊ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
public array $selectedCategories;
public function init()
{
...
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
$this->categories = Category::all()
->map(function($category) {
return [
'id' => $category->id,
'title' => $category->title,
];
})->toArray();
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π²ΡΠ±ΡΠ°Π½Π½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
$this->selectedCategories = $this->resource->categories
->pluck('id')
->toArray();
}
public function save()
{
...
// Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
$this->resource->categories()->sync($this->selectedCategories);
}
}
ΠΡΠ²ΠΎΠ΄ ΠΏΠΎΠ»Ρ Π² ΡΠ°Π±Π»ΠΎΠ½Π΅:
<x-rock-cms::fields.multiselect
:items="$categories"
:selectedItems="$selectedCategories"
itemsField="categories"
selectedItemsField="selectedCategories"
title="ΠΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ"
/>
ΠΠΏΡΠΈΠΈ:
items - ΠΌΠ°ΡΡΠΈΠ² Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠ°ΠΌΠΈ
selectedItems - ΠΌΠ°ΡΡΠΈΠ² Ρ Π²ΡΠ±ΡΠ°Π½Π½ΡΠΌΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠ°ΠΌΠΈ
itemsField - Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Ρ Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠ°ΠΌΠΈ
selectedItemsField - Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Ρ Ρ Π²ΡΠ±ΡΠ°Π½Π½ΡΠΌΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠ°ΠΌΠΈ

Multiselect Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ
ΠΠ»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΡΠ°Π±Π»ΠΈΡΡ post_category ΠΏΠΎΠ»Π΅ order.
posts
id - integer
title - string
categories
id - integer
title - string
post_category
post_id - integer
category_id - integer
order - integer
Π ΠΊΠΎΠ΄Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠΌ ΡΡΠ΅ΠΉΡΡ HasSortable ΠΈ HasMultiselect.
<?php
namespace App\Http\Livewire\Admin\Posts;
use App\Models\Category;
use App\Models\Post;
use WebVovan\RockCms\Http\Livewire\ResourceComponent;
use WebVovan\RockCms\Traits\Livewire\HasMultiselect;
use WebVovan\RockCms\Traits\Livewire\HasSortable;
class PostItem extends ResourceComponent
{
use HasSortable;
use HasMultiselect;
// Π‘ΠΏΠΈΡΠΎΠΊ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
public array $categories;
// Π‘ΠΏΠΈΡΠΎΠΊ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
public array $selectedCategories;
public function init()
{
...
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
$this->categories = Category::all()
->map(function($category) {
return [
'id' => $category->id,
'title' => $category->title,
];
})->toArray();
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π²ΡΠ±ΡΠ°Π½Π½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
$this->selectedCategories = $this->resource->categories
->map(function ($category) {
return [
'id' => $category->id,
'title' => $category->title,
];
})->toArray();
}
public function save()
{
...
// Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
$this->resource->categories()->sync(
collect($this->selectedCategories)->reduce(function($acc, $item, $key) {
$acc[$item['id']] = ['order' => $key];
return $acc;
}, [])
);
}
}
ΠΠ»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π² ΡΠ°Π±Π»ΠΎΠ½Π΅ Π²ΡΠ²ΠΎΠ΄Π° Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠΏΡΠΈΡ sortable:
<x-rock-cms::fields.multiselect
:items="$categories"
:selectedItems="$selectedCategories"
itemsField="categories"
selectedItemsField="selectedCategories"
sortable
title="ΠΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ"
/>

ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠΎΠΈΡΠΊ
ΠΡΠ»ΠΈ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° Π² multiselect ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡ, Π° ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈΡΠΊΠ°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ.
ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠΎΠΈΡΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ.
Π ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΠΌΠ΅ΡΠΎΠ΄ searchCategories() Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅.
<?php
namespace App\Http\Livewire\Admin\Posts;
use App\Models\Category;
use App\Models\Post;
use WebVovan\RockCms\Http\Livewire\ResourceComponent;
use WebVovan\RockCms\Traits\Livewire\HasMultiselect;
use WebVovan\RockCms\Traits\Livewire\HasSortable;
class PostItem extends ResourceComponent
{
use HasSortable;
use HasMultiselect;
// Π‘ΠΏΠΈΡΠΎΠΊ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
public array $categories;
// Π‘ΠΏΠΈΡΠΎΠΊ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
public array $selectedCategories;
/**
* ΠΠΎΠΈΡΠΊ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ Π΄Π»Ρ multiselect
*
* @param string $word
*/
public function searchCategories(string $word)
{
$this->categories = Category::where('title', 'like', '%' . $word . '%')
->limit(5)
->get()
->map(function($item) {
return [
'id' => $item->id,
'title' => $item->title,
];
})->toArray();
}
public function init()
{
...
// ΠΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² multiselect ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ 5 ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
$this->categories = Category::limit(5)
->orderByDesc('id')
->get()
->map(function($category) {
return [
'id' => $category->id,
'title' => $category->title,
];
})->toArray();
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π²ΡΠ±ΡΠ°Π½Π½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
$this->selectedCategories = $this->resource->categories
->map(function ($category) {
return [
'id' => $category->id,
'title' => $category->title,
];
})->toArray();
}
public function save()
{
...
// Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ
ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ
$this->resource->categories()->sync(
collect($this->selectedCategories)->reduce(function($acc, $item, $key) {
$acc[$item['id']] = ['order' => $key];
return $acc;
}, [])
);
}
}
ΠΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ ΠΏΠΎΠ»Ρ Π² ΡΠ°Π±Π»ΠΎΠ½Π΅ Π² ΡΠ²ΠΎΠΉΡΡΠ²Π΅ liveSearch ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ Π΄Π»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ°:
<x-rock-cms::fields.multiselect
:items="$categories"
:selectedItems="$selectedCategories"
itemsField="categories"
selectedItemsField="selectedCategories"
liveSearch="searchCategories"
sortable
title="ΠΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ"
/>

Last updated