کنترلر
کنترلر SelectController کلاس پایه برای تامین دادههای کامپوننت x-select است.
در عمل، شما یک کنترلر فرزند میسازید و منطق داده را داخل آن پیادهسازی میکنید.
در کنترلر فرزند
،باید دقیقا یکی از دو متد data() یا query() را پیادهسازی کنید:
- اگر هیچکدام پیادهسازی نشوند، خطا برمیگردد.
- اگر هر دو پیادهسازی شوند، خطا برمیگردد.
این خطا با کد SELECT_INVALID_FILTER_CONFIGURATION برگردانده میشود.
انتخاب بین data() و query()
حالت data()
وقتی data() را پیادهسازی میکنید، میتوانید خروجی را به یکی از فرمهای زیر برگردانید:
arrayCollectionLengthAwarePaginator
این حالت برای زمانی مناسب است که:
- از قبل خروجی را در یک سرویس/ریپازیتوری آماده کردهاید.
- نیاز به کنترل کامل روی خروجی نهایی دارید.
حالت query()
وقتی query() را پیادهسازی میکنید، باید یک Eloquent Builder برگردانید. در این حالت، خود SelectController این کارها را انجام میدهد:
- اعمال ترتیب اولویت روی آیتمهای انتخابشده.
- صفحهبندی خروجی.
- تلاش برای تکمیل label آیتمهای selected از دیتابیس (در صورت نبود label در خروجی
selected()).
کانستنتهای صفحهبندی
در SelectController دو کانستنت وجود دارد که میتوانید در کنترلر فرزند override کنید:
PER_PAGE(پیشفرض:15)QUERY_RESULT_MODE(پیشفرض:'paginate')
مقادیر مجاز برای QUERY_RESULT_MODE:
'paginate'→ استفاده ازpaginate()لاراول'dorapi_paginate'→ استفاده ازdorapi()->dorapiPaginate()'get'→ دریافت خروجی باget()بدون صفحهبندی
مثال override
protected const int PER_PAGE = 30;
protected const string QUERY_RESULT_MODE = 'dorapi_paginate';
فرمت متد selected()
selected() میتواند یکی از این دو فرمت را برگرداند:
فقط شناسهها
public function selected(): array
{
return [5, 8, 12];
}
شناسه + label
public function selected(): array
{
return [
['id' => 5, 'label' => 'ملت'],
['id' => 8, 'label' => 'صادرات'],
];
}
اگر label را خودتان بدهید، کنترلر تلاش نمیکند همان label را دوباره از دادهها استخراج کند.
ادغام با $this->selectedItem و $this->selectedItems
مقادیر انتخابشدهای که از درخواست/سشن میآیند، قبل از اجرای نهایی با خروجی selected() ادغام میشوند.
- در حالت تکانتخابی، مقدار در
$this->selectedItemقرار میگیرد. - در حالت چندانتخابی، مقادیر در
$this->selectedItemsقرار میگیرند. - سپس این مقادیر با خروجی
selected()merge میشوند و لیست نهایی selected ساخته میشود.
این یعنی اگر در selected() مقدار اولیه برگردانید، انتخاب فعلی کاربر از request/session هم به آن اضافه میشود.
ستون label سفارشی (labelColumn)
ستون label بهصورت پیشفرض name است. اگر منبع دادهٔ شما label را با کلید دیگری (مثلاً title) برمیگرداند، پراپرتی labelColumn را در کنترلر فرزند مقداردهی کنید:
protected string $labelColumn = 'title';
متد selectedLabelColumn() حذف شده و fallback خودکار از name به title دیگر وجود ندارد. ستون label دقیقاً همان مقدار labelColumn است (پیشفرض: name) و وجود آن در همهٔ آیتمهای خروجی اجباری است؛ در غیر این صورت خطای زیر برمیگردد:
The label column 'name' does not exist in the returned data.