Yii2 расширение для редактирования данных в GridView
Выполните
$ composer require kosv/yii2-grid-roweditable:1.0.*
или добавьте "kosv/yii2-grid-rowEditable": "1.0.*"
в composer.json
YourGridView - для использования данного расширения вам нужно иметь/создать дочерний класс от GridView
,
поэтому такой класс мы будем называть YourGridView
.
YourSaveForm - вам нужно будет создать форму в которой будет выолняться валидация и сохранение данных.
В даннной документации такая форма будет называться YourSaveForm
.
- Нужно подключить данное расширение к
YourGridView
. - Нужно реализовать
YourSaveForm
. В этом классе будет выполняться процесс валидации и сохранения данных. - В экшене вашего контроллера создать объект
YourSaveForm
и реализовать логику для сохранения данных формы. - Нужно вывести
YourGridView
в вашем View и указать обязательные общие параметры редактирования. - В список столбцов добавить
Kosv\Yii2Grid\RowEditable\Select\CheckboxColumn
. Это столбец чекбоксов, который позволяет выбирать строки. - Вывести кнопку сохранения изменений.
Если у вас нет дочернего класса от GridView
,
то создайте его в любом месте вашего приложения
namespace app\widgets;
use yii\grid\GridView as YiiGridView;
class YourGridView extends YiiGridView
{
}
К YourGridView
подключите интерфейс Kosv\Yii2Grid\RowEditable\EditableGridInterface
,
и трейт Kosv\Yii2Grid\RowEditable\EditableGridTrait
namespace app\widgets;
use Kosv\Yii2Grid\RowEditable\EditableGridInterface;
use Kosv\Yii2Grid\RowEditable\EditableGridTrait;
use yii\grid\GridView as YiiGridView;
class YourGridView extends YiiGridView implements EditableGridInterface
{
use EditableGridTrait;
}
Создайте класс формы и унаследуйти его от yii\base\Model
(или от любого другого потомка yii\base\Model
)
namespace app\models;
use yii\base\Model;
/**
* @property array $editingRows
*/
class YourSaveForm extends Model
{
}
К YourSaveForm
подключите итерфейс Kosv\Yii2Grid\RowEditable\Form\SaveFormInterface
и трейт Kosv\Yii2Grid\RowEditable\Form\SaveFormTrait
namespace app\models;
use Kosv\Yii2Grid\RowEditable\Form\SaveFormInterface;
use Kosv\Yii2Grid\RowEditable\Form\SaveFormTrait;
use yii\base\Model;
/**
* @property array $editingRows
*/
class YourSaveForm extends Model implements SaveFormInterface
{
use SaveFormTrait;
}
В YourSaveForm
реализуйте методы: validateEditableRows
(отвечает за валидацию данных) и saveEditableRows
(отвечает за сохранение данных).
По умолчанию, данные методы не имеют реализации, поэтому вы должы сами позаботиться о том, как будут валидироваться и сохраняться ваши данные.
namespace app\models;
use Kosv\Yii2Grid\RowEditable\Form\SaveFormInterface;
use Kosv\Yii2Grid\RowEditable\Form\SaveFormTrait;
use yii\base\Model;
/**
* @property array $editingRows
*/
class YourSaveForm extends Model implements SaveFormInterface
{
use SaveFormTrait;
/**
* @return bool
*/
public function validateEditableRows()
{
// TODO: Ваша логика валидации данных из массива $this->editingRows
}
/**
* @return bool
*/
public function saveEditableRows()
{
// TODO: Ваша логика сохранения данных из массива $this->editingRows
}
}
public function actionIndex()
{
$gridSaveForm = new app\models\YourSaveForm();
if ($gridSaveForm->load(Yii::$app->request->post()) &&
$gridSaveForm->validate() &&
$gridSaveForm->validateEditableRows()) {
$gridSaveForm->saveEditableRows();
}
return $this->render('index', [
'gridSaveForm' => $gridSaveForm,
]);
}
Выведите YourGridView
в представлении и укажите обязательный параметр form
<?php
/** @var $gridSaveForm app\models\YourSaveForm */
use app\widgets\YourGridView;
echo YourGridView::widget([
...
'commonEditParams' => [
'form' => $gridSaveForm,
...
],
])
В массив колонок добавьте Kosv\Yii2Grid\RowEditable\Select\CheckboxColumn
<?php
/** @var $gridSaveForm app\models\YourSaveForm */
use Kosv\Yii2Grid\RowEditable\Select\CheckboxColumn;
use app\widgets\YourGridView;
echo YourGridView::widget([
...
'commonEditParams' => [
'form' => $modelOfSaveForm,
...
],
'columns' => [
...
['class' => CheckboxColumn::class],
],
])
В любом месте страницы выведите кнопку для сохранения данных
<?php echo Html::button('Save', [
'class' => \Kosv\Yii2Grid\RowEditable\Config\EditConfigInterface::DEFAULT_CLASS_SAVE_BTN
]) ?>
Данное расширение можно конфигурировать как для отдельных столбцов, так и использовать общии парметры конфигурации.
Более подробную информации о всех праметрах можно получить в разделе описания параметров конфигурации
Данный вид парметров задаётся в commonEditParams
:
echo YourGridView::widget([
...
'commonEditParams' => [
// Общие параметры
'form' => $saveForm,
],
])
Если в массиве columns вашего YourGridView
есть столбцы без явно указанного типа (задаётся через поле class
),
то по умолчанию будет использоваться столбец с типом Kosv\Yii2Grid\RowEditable\EditableRowColumn
.
Все столбцы типа Kosv\Yii2Grid\RowEditable\EditableRowColumn
можно конфигурируются точно также как и commonEditParams
,
только параметры кофигурации задаются через поле editParams
echo YourGridView::widget([
...
'commonEditParams' => [
// Общие параметры редактирования
'form' => $saveForm,
'input' => \Kosv\Yii2Grid\RowEditable\Input\Input::class
...
],
'columns' => [
[
...
'editParams' => [
// Параметры редактирования столбца
'input' => \Kosv\Yii2Grid\RowEditable\Input\DropDownList::class
...
],
],
],
])
Список параметров из commonEditParams
, которые нельзя предопределить в столбце:
prefix
, gridCssClass
, selectMode
, saveAction
, saveMethod
, saveButton
.
# Модель формы в которой выполняется валидация и сохранение данных.
# - Обязательный параметр
# - Тип yii\base\Model
# - Нельзя предопределить в столбце
'form' => $saveFrom,
# Атрибут формы в который будут загружатся данные в виде массива.
# - Необязательный параметр
# - Тип string
# - Значение по умолчанию 'editingRows'
# - Нельзя предопределить в столбце
'formAttribute' => 'editingRows',
# Вклчить режим редактирования
# - Необязательный параметр
# - Тип boolean
# - Значение по умолчанию true
# - Можно предопределить в столбце
'enable' => true
# CSS класс для RowEditable. Будет добавлен к виджету GridView
# - Необязательный параметр
# - Тип string
# - Значение по умолчанию 'gre-grid-view'
# - Нельзя предопределить в столбце
'gridCssClass' => 'gre-grid-view',
# Html input для редактирования значений столбца
# - Необязательный параметр
#
# - Тип \Closure. Функция должна возвращать строку с Html
# - Тип array. В массиве должна быть представлена кофигурация реализации Kosv\Yii2Grid\RowEditable\Input\InputInterface
# - Тип string. Строка дожна быть именем класса, который реализует Kosv\Yii2Grid\RowEditable\Input\InputInterface
#
# - Значение по умолчанию Kosv\Yii2Grid\RowEditable\Input\Input::class
# - Можно предопределить в столбце
'input' => Kosv\Yii2Grid\RowEditable\Input\Input::class,
# Html класс для блока с input'ом
# - Необязательный параметр
# - Тип string
# - Значение по умолчанию 'input-wrap'
# - Можно предопределить в столбце
'inputWrapHtmlClass' => 'input-wrap',
# Html тег для блока с input'ом
# - Необязательный параметр
# - Тип string
# - Значение по умолчанию 'div'
# - Можно предопределить в столбце
'inputWrapHtmlTag' => 'div',
# Префикс плагина. Будет добавлятся к html data-атрибутам
# - Необязательный параметр
# - Тип string
# - Значение по умолчанию 'gre'
# - Нельзя предопределить в столбце
'prefix' => 'gre',
# Экшен для формы сохранения данных
# - Необязательный параметр
# - Тип string
# - Значение по умолчанию ''
# - Нельзя предопределить в столбце
'saveAction' => '',
# Кнопка для формы сохранения данных
# - Необязательный параметр
# - Тип string. jQuery селектор кнопки
# - Значение по умолчанию '.gre-save-btn'
# - Нельзя предопределить в столбце
'saveButton' => '.gre-save-btn',
# HTTP метод с помощью которого будет выполнятся сохранение формы
# - Необязательный параметр
# - Тип string
# - Значение по умолчанию 'POST'
# - Нельзя предопределить в столбце
'saveMethod' => 'POST',
# Битовый флаг режима выбора строк.
#
# В текущей версии поддерживается только EditConfigInterface::SELECT_MODE_CHECKBOX.
# Если включён EditConfigInterface::SELECT_MODE_CHECKBOX, то YourGridView
# должен содержать столбец Kosv\Yii2Grid\RowEditable\Select\CheckboxColumn
# или любой другой столбец с реализацией Kosv\Yii2Grid\RowEditable\Select\CheckboxColumnInterface.
#
# - Необязательный параметр
# - Тип integer
# - Значение по умолчанию EditConfigInterface::SELECT_MODE_CHECKBOX
# - Нельзя предопределить в столбце
'selectMode' => Kosv\Yii2Grid\RowEditable\Config\EditConfigInterface::SELECT_MODE_CHECKBOX,
# Html класс для блока с выводимыми данными в grid-ячейке
# - Необязательный параметр
# - Тип string
# - Значение по умолчанию 'output-wrap'
# - Можно предопределить в столбце
'outputWrapHtmlClass' => 'output-wrap',
# Html тег для блока с выводимыми данными в grid-ячейке
# - Необязательный параметр
# - Тип string
# - Значение по умолчанию 'div'
# - Можно предопределить в столбце
'outputWrapHtmlTag' => 'div',
# Html шаблон текста ошибки. Выводится при неудачной валидации, под input'ом
# - Необязательный параметр
# - Тип string
# - Значение по умолчанию '<p>{error}</p>'
# - Можно предопределить в столбце
'validationErrorLayout' => '<p>{error}</p>'