LaravelRUS / SleepingOwlAdmin

🦉 Administrative interface builder for Laravel (Laravel admin)
http://sleepingowladmin.ru/
MIT License
800 stars 216 forks source link

Не работает фильтрация по колонке AdminColumn::custom #623

Closed dessl closed 7 years ago

dessl commented 7 years ago

Использую AdminDisplay::datatablesAsync()

Для булева поля в базе использую следующую конструкцию: Поле:

AdminColumn::custom(trans('labels.news.active'), function(Model $model) {
    $icon = (!$model->hidden) ? '<i class="fa fa-check"></i>' : '<i class="fa fa-minus"></i>';
    return '<p class="text-left">' . $icon . '</p>';
})

Фильтр:

AdminColumnFilter::select()->setOptions([
    0 => trans('labels.general.no'),
    1 => trans('labels.general.yes'), 
])->setPlaceholder('')->setColumnName('hidden')

Сортировка не работает!

Если поле указать как:

AdminColumn::text('hidden')->setLabel(trans('labels.news.active'))

работать будет, но отображать будет 0 и 1

ghost commented 7 years ago

По кастомам логика из коробки работать не будет никогда. Для этих целей был придуман setFilterCallback

dessl commented 7 years ago

Да setFilterCallback отличная штука, только она реализована в NamedColumn и многие контролы наследуются от нее, но только не AdminColumn::custom, он наследуется от TableColumn, где нет метода setFilterCallback. Хотя как раз в AdminColumn::custom он очень нужен.

ghost commented 7 years ago

@dessl понятно. Исправим - сегодня.

ghost commented 7 years ago

@dessl прошу бегло пробежаться по функционалу. И добро пожаловать к нам в чатик https://gitter.im/LaravelRUS/SleepingOwlAdmin

dessl commented 7 years ago

Добавил

AdminColumn::custom(trans('labels.news.active'), function(Model $model) {
    $icon = (!$model->hidden) ? '<i class="fa fa-check"></i>' : '<i class="fa fa-minus"></i>';
    return '<p class="text-left">' . $icon . '</p>';
})->setFilterCallback(function($column, $query, $search) {
    dd($column, $query, $search);
})

Выдал ошибку:

Type error: Argument 1 passed to SleepingOwl\Admin\Display\Column\Filter\BaseColumnFilter::apply() must implement interface SleepingOwl\Admin\Contracts\Display\NamedColumnInterface, instance of SleepingOwl\Admin\Display\Column\Custom given, called in C:\OpenServer\domains\AltynAlma\vendor\laravelrus\sleepingowl\src\Display\Extension\ColumnFilters.php on line 216

dessl commented 7 years ago

Хотя теперь вообще нигде не работает async, везде идет эта ошибка, независимо от набора полей.

ghost commented 7 years ago

Мде... ясненько. тогда вечером разберусь.

ghost commented 7 years ago

@dessl Нащальнике, я сделяль.

dessl commented 7 years ago

@aios спасибо заработало, только как в примере не получается

$query->where($column->getName(), 'like', "%$search%");

у AdminColumn::custom нет метода getName(). По сути конечно не критично, т.к. поле фильтрации можно указать жестко.

ghost commented 7 years ago

@dessl собственно и саму логику фильтрации можно указывать любую - не обязательно относительно колонки. У тебя в кастоме может юзаться достаточно разная логика включающая в себя кучу колонок. так что это не проблема.