Skip to content

Commit

Permalink
Режим массового редактирования для датагридов,
Browse files Browse the repository at this point in the history
коллбэки для трейта formItem,
исправление мелочей.
  • Loading branch information
fuzegit committed Mar 16, 2024
1 parent c67e542 commit aae9d6f
Show file tree
Hide file tree
Showing 16 changed files with 530 additions and 78 deletions.
67 changes: 56 additions & 11 deletions system/core/grid.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ class cmsGrid {
'is_toolbar' => true, // выводить тулбар
'is_draggable' => false, // строки могут меняться местами мышью
'drag_save_url' => '', // URL для сохранения при драг-эн-дроп
'save_action' => '', // URL для сохранения при инлайн редактировании
'is_selectable' => false, // Строки могут выделяться
/**
* select_actions - это массив действий над выделенными строками
Expand Down Expand Up @@ -74,6 +75,8 @@ class cmsGrid {
'renderer' => null, // Компонент vue поля редактирования, по умолчанию form-input
'items' => null, // Массив списка для селекта, если renderer form-select
'language_context' => false, // Если выключено, будет искать языковое поле для текущей локали
'id_field' => 'id', // Имя поля записи, по которому искать уникальное значение
'table' => null, // Таблица для сохранения
'save_action' => '', // URL для сохранения
'attributes' => [] // Атрибуты тега быстрого редактирования
]
Expand Down Expand Up @@ -142,6 +145,18 @@ class cmsGrid {
*/
private $is_loaded = false;

/**
* В гриде есть столбцы с инлайн редактированием
* @var array
*/
private $editable = false;

/**
* URI для режима редактирования
* @var string
*/
private $edit_url = '';

/**
* Текст ошибки при инициализации
* @var ?string
Expand Down Expand Up @@ -245,7 +260,7 @@ private function load() {
// Фильтр по умолчанию
$this->setDefaultFilter();

$this->grid = cmsEventsManager::hook('grid_' . $this->controller->name . '_' . $this->grid_name, $this->grid);
$this->grid = cmsEventsManager::hook('grid_' . $this->getGridFullName(), $this->grid);

if($this->grid['options']['select_actions']){
array_unshift($this->grid['options']['select_actions'], [
Expand All @@ -255,7 +270,7 @@ private function load() {
}

list($this->grid, $args) = cmsEventsManager::hook(
'grid_' . $this->controller->name . '_' . $this->grid_name . '_args',
'grid_' . $this->getGridFullName() . '_args',
[$this->grid, $args]
);

Expand All @@ -280,6 +295,24 @@ public function getGridValue($path) {
return array_value_recursive($path, $this->grid);
}

/**
* Возвращает имя грида с учётом контроллера
*
* @return string
*/
public function getGridFullName() {
return $this->controller->name . '_' . $this->grid_name;
}

/**
* Возвращает имя грида
*
* @return string
*/
public function getGridName() {
return $this->grid_name;
}

/**
* Валидация значения колонки
* аналогично как в формах
Expand Down Expand Up @@ -580,10 +613,12 @@ public function makeGridRows($dataset = false, $total = 0) {
'is_loading' => false,
'need_load' => $dataset === false,
'source_url' => $this->grid['source_url'] !== '' ? $this->grid['source_url'] : cmsCore::getInstance()->uri_absolute,
'edit_url' => $this->edit_url,
'options' => $this->grid['options'],
'filter' => $this->grid['filter'],
'rows' => $rows,
'total' => $total ? $total : count(($dataset ?: [])),
'editable' => $this->editable,
'switchable' => [
'title' => LANG_GRID_COLYMNS_SETTINGS,
'columns' => $this->getSwitchableColumns()
Expand Down Expand Up @@ -895,24 +930,26 @@ private function makeColumns() {

private function getEditableParams($row, $column, $field) {

if (!array_key_exists('editable', $column) || empty($row['id'])) {
$id_field = $column['editable']['id_field'] ?? 'id';

if (!array_key_exists('editable', $column) || empty($row[$id_field])) {
return false;
}

$save_action_query = [
'csrf_token' => cmsForm::getCSRFToken(),
'name' => $field,
'id' => $row['id']
];
$save_action_query = ['csrf_token' => cmsForm::getCSRFToken()];

// Экшен списка записей должен реализовывать и сохранение поля столбца
$save_action = $this->grid['source_url'];

// @deprecated Передача таблицы устарела
if (!empty($column['editable']['table'])) {
$save_action = href_to('admin', 'inline_save', [urlencode($column['editable']['table']), $row['id']]);
// Может быть указан для грида другой урл
if (!empty($this->grid['options']['save_action'])) {
$save_action = $this->grid['options']['save_action'];
}

// Сохраняем урл для режима редактирования
$this->edit_url = $save_action . '?' . http_build_query($save_action_query);

// Может быть указан для конкретной колонки урл
if (!empty($column['editable']['save_action'])) {
$save_action = string_replace_keys_values_extended($column['editable']['save_action'], $row);
}
Expand All @@ -933,12 +970,20 @@ private function getEditableParams($row, $column, $field) {
}
}

$this->editable = true;

// Добавляем ID строки
$save_action_query['id'] = $row[$id_field];

return [
'component' => $column['editable']['renderer'] ?? 'form-input',
'items' => $column['editable']['items'] ?? [],
'edit_icon' => html_svg_icon('solid', 'pen', 16, false),
'value' => $row[$field] ?? '',
'new_value' => null,
'has_error' => false,
'attributes' => $attributes,
'edit_mode' => false,
'lang_edit' => LANG_EDIT,
'lang_save' => LANG_SAVE,
'save_action' => $save_action . '?' . http_build_query($save_action_query)
Expand Down
4 changes: 2 additions & 2 deletions system/core/model.php
Original file line number Diff line number Diff line change
Expand Up @@ -2030,7 +2030,7 @@ public function getItem($table_name, $item_callback = false) {

if ($encoded_fields) {
foreach ($encoded_fields as $field) {
$item[$field] = base64_decode($item[$field]);
$item[$field] = $item[$field] ? base64_decode($item[$field]) : null;
unset($item['enc_' . $field]);
}
}
Expand Down Expand Up @@ -2228,7 +2228,7 @@ public function get($table_name, $item_callback = false, $key_field = 'id') {

if ($encoded_fields) {
foreach ($encoded_fields as $efield) {
$item[$efield] = base64_decode($item[$efield]);
$item[$efield] = $item[$efield] ? base64_decode($item[$efield]) : null;
unset($item['enc_' . $efield]);
}
}
Expand Down
1 change: 1 addition & 0 deletions system/languages/en/controllers/admin/admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
define('LANG_CP_SECTION_UPDATE', 'Updates');
define('LANG_CP_SELECTED_EDIT', 'Edit');
define('LANG_CP_SELECTED_DELETE', 'Delete');
define('LANG_CP_EDIT_MODE', 'Edit mode');
define('LANG_CP_CTYPES_ADD', 'Add Content Type');
define('LANG_CP_CTYPES_EDIT', 'Edit Content Type');
define('LANG_CP_CTYPE_CREATED', 'Content type «%s» created');
Expand Down
1 change: 1 addition & 0 deletions system/languages/ru/controllers/admin/admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@

define('LANG_CP_SELECTED_EDIT', 'Редактировать');
define('LANG_CP_SELECTED_DELETE', 'Удалить');
define('LANG_CP_EDIT_MODE', 'Режим редактирования');

define('LANG_CP_CTYPES_ADD', 'Создать тип контента');
define('LANG_CP_CTYPES_EDIT', 'Изменить тип контента');
Expand Down
17 changes: 16 additions & 1 deletion system/traits/controllers/actions/formItem.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,13 @@ trait formItem {
*/
protected $breadcrumbs = [];

/**
* Коллбэки после добавления/обновления записи
* @var ?callable
*/
protected $add_callback = null;
protected $update_callback = null;

public function run($id = null){

$data = [];
Expand Down Expand Up @@ -111,7 +118,7 @@ public function run($id = null){

if ($this->request->has('csrf_token')){

$data = $form->parse($this->request, true, $data);
$data = array_merge($data, $form->parse($this->request, true, $data));

$errors = $form->validate($this, $data);

Expand All @@ -121,9 +128,17 @@ public function run($id = null){

$id = call_user_func_array([$this->model, $this->form_add_method], [$this->table_name, $data]);

if ($this->add_callback) {
call_user_func_array($this->add_callback, [$id, $data]);
}

} else {

call_user_func_array([$this->model, $this->form_edit_method], [$this->table_name, $id, $data]);

if ($this->update_callback) {
call_user_func_array($this->update_callback, [$data]);
}
}

if($this->cache_key){
Expand Down
Loading

0 comments on commit aae9d6f

Please sign in to comment.