Расширение для класса отображения данных
Данные классы предназначены для добавления колонок в таблицу, а также вывод информации из модели в форме редактирования.
Пример использования
AdminDisplay::table()
->setColumns([
AdminColumn::link('title')->setLabel('Title'),
AdminColumn::datetime('date')->setLabel('Date')->setFormat('d.m.Y')->setWidth('150px')
])
AdminForm::panel()
->addBody([
AdminColumn::datetime('date')->setLabel('Date')->setFormat('d.m.Y')
])
Класс SleepingOwl\Admin\Display\TableColumn
, от которого наследуются
все столбцы, реализует интерфейсы Illuminate\Contracts\Support\Arrayable
,
Illuminate\Contracts\Support\Renderable
и SleepingOwl\Admin\Contracts\Initializable
.
AdminColumn::text($name, $label = null)
AdminColumn::datetime($name, $label = null)
AdminColumn::link($name, $label = null)
AdminColumn::relatedLink($name, $label = null)
AdminColumn::count($name, $label = null)
AdminColumn::custom($label = null, \Closure $callback = null)
AdminColumn::image($name, $label = null)
AdminColumn::email($name, $label = null)
AdminColumn::lists($name, $label = null)
AdminColumn::url($name, $label = null)
AdminColumn::action($name)
AdminColumn::checkbox($label = null)
AdminColumn::control($label = null)
AdminColumn::filter($name, $label = null)
AdminColumn::order()
AdminColumn::treeControl()
Каждый столбец таблицы имеет заголовок и хранится в виде отдельного класса
SleepingOwl\Admin\Contracts\Display\TableHeaderColumnInterface
.
Пример работы с заголовком
...
->setColumns([
...
AdminColumn::link('title')->setLabel('Title')->setOrderable(false),
...
]);
Или работая напрямую с класом заголовка
...
->setColumns([
...
$link = AdminColumn::link('title')
...
]);
$link->getHeader()
->setTitle('Title')
->setOrderable(false)
->setHtmlAttribute('class', 'bg-success text-center')
->setHtmlAttribute('data-tooltip', 'Test tooltip');
В классах колонок используется трейт
- HtmlAttributes, с помощью которого для них можно настраивать HTML атрибуты.
- Assets, с помощью которого для них можно подключать ассеты.
Установка заголовка колонки
SleepingOwl\Admin\Display\TableColumn::setLabel(string $title): return self
Установка ключа элемента
SleepingOwl\Admin\Contracts\NamedColumnInterface::setName(string $name): return self
Установка ширины колонки
SleepingOwl\Admin\Display\TableColumn::setWidth(string $width): return self
Установки view
SleepingOwl\Admin\Display\TableColumn::setView(string|\Illuminate\View\View $view): return self
SleepingOwl\Admin\Display\TableColumn::append(\SleepingOwl\Admin\Contracts\ColumnInterface $append): return self
Указание правила сортировки колонки таблицы. По умочалчанию все колонки сортируются ->orderBy(column, direction)
SleepingOwl\Admin\Display\TableColumn::setOrderable(false|SleepingOwl\Admin\Contracts\Display\OrderByClauseInterface|Closure|string $orderable): return self
В случае необходимости вы можете изменить правила сортировки столбца (Например для столбца с типом custom
)
$display->setColumns([
AdminColumn::custom(function($model)
return $model->first_name.' '.$model->last_name;
})->setOrderable(function($query, $direction) {
$query->orderBy('last_name', $direction);
})
// Или просто передать ключ поля
->setOrderable('last_name')
// Или с помощью класса реализующего интерфейс SleepingOwl\Admin\Contracts\Display\OrderByClauseInterface
->setOrderable(new CustomOrderByClause())
]);
SleepingOwl\Admin\Display\Column\Action
Данный элемент используется для добавления Кнопки совершения какого либо действия с данными таблицы.
Для работы элемента необходимо наличие поля checkbox
в таблице
$table = AdminDisplay::table()
->setActions([
AdminColumn::action('export', 'Export')->setIcon('fa fa-share')->setAction(route('news.export')),
])
->setColumns([
AdminColumn::checkbox(),
...
]);
// Изменить расположение кнопок на странице
$table->getActions()
->setPlacement('panel.buttons')
->setHtmlAttribute('class', 'pull-right');
Установка названия кнопки
SleepingOwl\Admin\Display\Column\Action::setTitle(string $title): return self
Установка ссылки, на которую будет отправлен запрос с выбранными элементами
SleepingOwl\Admin\Display\Column\Action::setAction(string $action): return self
Установка типа отправляемого запроса [POST, GET, ...]
SleepingOwl\Admin\Display\Column\Action::setMethod(string $method): return self
Использовать GET запрос
SleepingOwl\Admin\Display\Column\Action::useGet(): return self
Использовать POST запрос
SleepingOwl\Admin\Display\Column\Action::usePost(): return self
Использовать PUT запрос
SleepingOwl\Admin\Display\Column\Action::usePut(): return self
Использовать DELETE запрос
SleepingOwl\Admin\Display\Column\Action::useDelete(): return self
Установка иконки для кнопки
SleepingOwl\Admin\Display\Column\Action::setIcon(string $icon): return self
SleepingOwl\Admin\Display\Column\Checkbox
Данный элемент предназначен для вывода чекбокса в таблице для выбора значений. Подробнее Action
AdminColumn::checkbox(),
SleepingOwl\Admin\Display\Column\Custom
Данный элемент используется для добавления кастомного кода в качестве колонки таблицы
AdminColumn::custom($title, function(\Illuminate\Database\Eloquent\Model $model) {
return $model->id;
})->setWidth('150px'),
Установка анонимной функции, которая будет вызвана для каждого элемента таблицы, с передачей в качестве аргумента объекта Illuminate\Database\Eloquent\Model
SleepingOwl\Admin\Display\Column\Custom::setCallback(\Closure $callback): return self
SleepingOwl\Admin\Display\Column\DateTime
Данный элемент предназначен для вывода даты с указанием формата
AdminColumn::datetime('date', 'Date')->setFormat('d.m.Y')->setWidth('150px'),
Указание формата даты
SleepingOwl\Admin\Display\Column\DateTime::setFormat(string $format): return self
SleepingOwl\Admin\Display\Column\Link
Данный элемент предназначен для вывода данных модели в виде ссылки на текущий документ
AdminColumn::link('title', 'Title')->setLinkAttributes(['target' => '_blank']),
Установка атрибутов для ссылки
SleepingOwl\Admin\Display\Column\Link::setLinkAttributes(array $linkAttributes): return self
SleepingOwl\Admin\Display\Column\RelatedLink
Данный элемент предназначен для вывода данных модели в виде ссылки на документ связанного раздела
AdminColumn::relatedLink('author.name', 'Author')
Установка атрибутов для ссылки
SleepingOwl\Admin\Display\Column\Link::setLinkAttributes(array $linkAttributes): return self
SleepingOwl\Admin\Display\Column\Url
Данный элемент предназначен для вывода значения поля в виде ссылки
AdminColumn::url('title', 'Title'),
Установка атрибутов для ссылки
SleepingOwl\Admin\Display\Column\Url::setLinkAttributes(array $linkAttributes): return self
SleepingOwl\Admin\Display\Column\Text
Данный элемент предназначен для вывода значения поля в виде обычного текста
AdminColumn::text('title', 'Title'),
SleepingOwl\Admin\Display\Column\Count
Данный элемент предназначен для подсчета и вывода кол-ва элементов. Подсчет значений производится функцией count
, т.е. передаваемое поле должно содержать массив элементов либо элемент с отношением *Many
AdminColumn::count('list', 'Total'),
SleepingOwl\Admin\Display\Column\Email
Данный элемент предназначен для вывода полей содержащих email адрес в виде ссылкы <a href="mailto:"></a>
AdminColumn::email('email', 'Email'),
SleepingOwl\Admin\Display\Column\Image
Данный элемент предназначен для вывода изображений
AdminColumn::image('avatar', 'Avatar'),
Указание ширины изображения
SleepingOwl\Admin\Display\Image::setImageWidth(string $width): return self
SleepingOwl\Admin\Display\Column\Lists
Данный элемент предназначен для вывода списка значений поля содержащего массив элементов, либо связь с отношением *Many
AdminColumn::lists('roles.title', 'Roles') // Вывод списка ролей из связанной таблицы
// or
AdminColumn::lists('tags', 'Tags') // Вывод списка тегов из поля содержащего массив тегов
SleepingOwl\Admin\Display\Column\Order
Данный элемент предназначен для сортировки элементов таблицы. Модель к которой применяется это поле должна содержать трейт SleepingOwl\Admin\Traits\OrderableModel
. По умолчанию, поле по которому производится сортировка - order
. Для указания альтернативного ключа необходимо в модели добавить метод:
class Users extend Model {
use \SleepingOwl\Admin\Traits\OrderableModel;
...
/**
* Get order field name.
* @return string
*/
public function getOrderField()
{
return 'custom_order_field_name';
}
}
Также для корректности отображения записей в таблице не забывайте при выводе сортировать записи по этому полю ->orderBy('order', 'asc')
SleepingOwl\Admin\Display\Column\Control
Данный элемент используется в табличном выводе для отображения кнопок действий связанных с элементом таблицы. Данный элемент добавляется автоматически ко всем элементам таблицы и предоставляет следующие дейтсвия
- Редактирование элемента
- Удаление
- Восстановление
Получение доступа к данном элементу
$display = AdminDisplay::table()->...;
$display->getColumns()->getControlColumn(); // return SleepingOwl\Admin\Display\Column\Control
При необходимости вы можете добавлять в таблицу ндополнительные действия над элементом:
$control = $display->getColumns()->getControlColumn();
$link = new \SleepingOwl\Admin\Display\ControlLink(function (\Illuminate\Database\Eloquent\Model $model) {
return 'http://localhost/'.$model->getKey(); // Генерация ссылки
}, 'Button text', 50);
$control->addButton($link);
$button = new \SleepingOwl\Admin\Display\ControlButton(function (\Illuminate\Database\Eloquent\Model $model) {
return 'http://localhost/delete/'.$model->getKey(); // Генерация ссылки
}, 'Button text', 50);
// Изменение метода сабмита формы кнопки
$button->setMethod('delete');
// Скрытие текста из кнопки
$button->hideText();
// Добавление иконки
$button->setIcon('fa fa-trash');
// Дополнительные HTML атрибуты для кнопки
$button->setHtmlAttribute('class', 'btn-danger btn-delete');
//Добавление атрибутов по условию
//Атрибуты установленные в этом методе перекрывают атрибуты
//установленные методами setHtmlAttribute/setHtmlAttributes
$link->setAttributeCondition(function(Model $model) {
if (isset($model->id)) {
return ['class' => "btn-id-{$model->id}"];
}
return ['class' => 'btn-danger'];
});
// Условие видимости кнопки (не обязательно)
$button->setCondition(function(\Illuminate\Database\Eloquent\Model $model) {
return auth()->user()->can('delete', $model);
});
$control->addButton($button);
На данный момент существует два класса кнопок
SleepingOwl\Admin\Display\ControlButton
- кнопка внутри формы для сабмитаSleepingOwl\Admin\Display\ControlLink
- кнопка ссылка
Также вы можете добавлять свои классы кнопок, реализовав инттерфейс SleepingOwl\Admin\Contracts\Display\ControlButtonInterface
Большинство колонок могут использовать связи модели.
Допустим у вас есть модель App\User
и у данной модели есть связь многие ко многим App\Role
и свять один к одному App\Department
, т.е. пользователь может иметь несколько ролей и принадлежать отделу.
Прежде всего для моделей необходимо настроить связи
Для получения списка названия ролей нам необходимо выполнить что-то вроде $user->roles->pluck('title')
, что равноценно для получения данных в колонке (roles.title
), т.е. когда класс попытается получить значение по данному ключу, он разобъет данный ключ на массив по знаку .
и сделает следующее:
// Попытается получить данные по первому сегменту
$roles = $user->getAttribute('roles'); // Вернет список ролей (коллекцию Collection моделей App\Role)
$value = $roles->pluck('title');
Для получения названия департамента нам необходимо выполнить что-то $user->department->title
, что равноценно получению данных в колонке (department.title
), т.е. когда класс попытается получить значение по данному ключу, он разобъет данный ключ на массив по знаку .
и сделает следующее:
// Попытается получить данные по первому сегменту
$department = $user->getAttribute('department'); // Вернет объект App\Department
$value = $department->getAttribute('title');
Как мы видим работа с Relation данными достаточно проста, главное правильно настроить связи в моделях.