Skip to content

Latest commit

 

History

History
495 lines (354 loc) · 18.6 KB

columns.md

File metadata and controls

495 lines (354 loc) · 18.6 KB

Колонки таблицы

Расширение для класса отображения данных

Введение

Данные классы предназначены для добавления колонок в таблицу, а также вывод информации из модели в форме редактирования.

Пример использования

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');

API

Методы доступные во всех элементах

В классах колонок используется трейт

  • HtmlAttributes, с помощью которого для них можно настраивать HTML атрибуты.
  • Assets, с помощью которого для них можно подключать ассеты.

setLabel

Установка заголовка колонки

SleepingOwl\Admin\Display\TableColumn::setLabel(string $title): return self

setName

Установка ключа элемента

SleepingOwl\Admin\Contracts\NamedColumnInterface::setName(string $name): return self

setWidth

Установка ширины колонки

SleepingOwl\Admin\Display\TableColumn::setWidth(string $width): return self

setView

Установки view

SleepingOwl\Admin\Display\TableColumn::setView(string|\Illuminate\View\View $view): return self

append

SleepingOwl\Admin\Display\TableColumn::append(\SleepingOwl\Admin\Contracts\ColumnInterface $append): return self

setOrderable

Указание правила сортировки колонки таблицы. По умочалчанию все колонки сортируются ->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())
]);

Action

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');

setTitle

Установка названия кнопки

SleepingOwl\Admin\Display\Column\Action::setTitle(string $title): return self

setAction

Установка ссылки, на которую будет отправлен запрос с выбранными элементами

SleepingOwl\Admin\Display\Column\Action::setAction(string $action): return self

setMethod

Установка типа отправляемого запроса [POST, GET, ...]

SleepingOwl\Admin\Display\Column\Action::setMethod(string $method): return self

useGet

Использовать GET запрос

SleepingOwl\Admin\Display\Column\Action::useGet(): return self

usePost

Использовать POST запрос

SleepingOwl\Admin\Display\Column\Action::usePost(): return self

usePut

Использовать PUT запрос

SleepingOwl\Admin\Display\Column\Action::usePut(): return self

useDelete

Использовать DELETE запрос

SleepingOwl\Admin\Display\Column\Action::useDelete(): return self

setIcon

Установка иконки для кнопки

SleepingOwl\Admin\Display\Column\Action::setIcon(string $icon): return self

Checkbox

SleepingOwl\Admin\Display\Column\Checkbox

Данный элемент предназначен для вывода чекбокса в таблице для выбора значений. Подробнее Action

AdminColumn::checkbox(),

Custom

SleepingOwl\Admin\Display\Column\Custom

Данный элемент используется для добавления кастомного кода в качестве колонки таблицы

AdminColumn::custom($title, function(\Illuminate\Database\Eloquent\Model $model) {
    return $model->id;
})->setWidth('150px'),

setCallback

Установка анонимной функции, которая будет вызвана для каждого элемента таблицы, с передачей в качестве аргумента объекта Illuminate\Database\Eloquent\Model

SleepingOwl\Admin\Display\Column\Custom::setCallback(\Closure $callback): return self

DateTime

SleepingOwl\Admin\Display\Column\DateTime

Данный элемент предназначен для вывода даты с указанием формата

AdminColumn::datetime('date', 'Date')->setFormat('d.m.Y')->setWidth('150px'),

setFormat

Указание формата даты

SleepingOwl\Admin\Display\Column\DateTime::setFormat(string $format): return self

Link

SleepingOwl\Admin\Display\Column\Link

Данный элемент предназначен для вывода данных модели в виде ссылки на текущий документ

AdminColumn::link('title', 'Title')->setLinkAttributes(['target' => '_blank']),

setLinkAttributes

Установка атрибутов для ссылки

SleepingOwl\Admin\Display\Column\Link::setLinkAttributes(array $linkAttributes): return self

RelatedLink

SleepingOwl\Admin\Display\Column\RelatedLink

Данный элемент предназначен для вывода данных модели в виде ссылки на документ связанного раздела

AdminColumn::relatedLink('author.name', 'Author')

setLinkAttributes

Установка атрибутов для ссылки

SleepingOwl\Admin\Display\Column\Link::setLinkAttributes(array $linkAttributes): return self

URL

SleepingOwl\Admin\Display\Column\Url

Данный элемент предназначен для вывода значения поля в виде ссылки

AdminColumn::url('title', 'Title'),

setLinkAttributes

Установка атрибутов для ссылки

SleepingOwl\Admin\Display\Column\Url::setLinkAttributes(array $linkAttributes): return self

Text

SleepingOwl\Admin\Display\Column\Text

Данный элемент предназначен для вывода значения поля в виде обычного текста

AdminColumn::text('title', 'Title'),

Count

SleepingOwl\Admin\Display\Column\Count

Данный элемент предназначен для подсчета и вывода кол-ва элементов. Подсчет значений производится функцией count, т.е. передаваемое поле должно содержать массив элементов либо элемент с отношением *Many

AdminColumn::count('list', 'Total'),

Email

SleepingOwl\Admin\Display\Column\Email

Данный элемент предназначен для вывода полей содержащих email адрес в виде ссылкы <a href="mailto:"></a>

AdminColumn::email('email', 'Email'),

Image

SleepingOwl\Admin\Display\Column\Image

Данный элемент предназначен для вывода изображений

AdminColumn::image('avatar', 'Avatar'),

setImageWidth

Указание ширины изображения

SleepingOwl\Admin\Display\Image::setImageWidth(string $width): return self

Lists

SleepingOwl\Admin\Display\Column\Lists

Данный элемент предназначен для вывода списка значений поля содержащего массив элементов, либо связь с отношением *Many

AdminColumn::lists('roles.title', 'Roles') // Вывод списка ролей из связанной таблицы

// or

AdminColumn::lists('tags', 'Tags') // Вывод списка тегов из поля содержащего массив тегов

Order

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')

Control

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

Работа с Relation данными

Большинство колонок могут использовать связи модели.

Допустим у вас есть модель 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 данными достаточно проста, главное правильно настроить связи в моделях.