[getTables] Компонент редактируемых таблиц на основе bootstrap и pdoTools
При написании компонентов для MODX много времени уходит на программирование редактируемых таблиц через extJs. У меня на это уходит каждый раз до 4 часов. Причем на совершенно однотипные таблицы. В конце концов мне это надоело и я решился написать свой компонент редактируемых таблиц на основе bootstrap и pdoTools— getTables! Сложность задачи я сильно недооценил и компонент сейчас выглядит и исполнен ужастно, но время на программирование таблиц с ним сократилось до 5 минут на простую и до часа на более сложную. Это сильно помогает и getTables я постоянно использую и потихоньку допиливаю. Сейчас на его основе сделано несколько компонентов, которые я хочу выложить в общий доступ. Ну и приходиться выкладывать и getTables, несмотря на не самую лучшую его реализацию.
Есть, конечно, замечательный компонент MIGX, но чтобы его использовать на фронте нужно вытаскивать на фронт extJs ради пары табличек. А bootstrap у меня везде используется.
Для примера вот реализация админки компонента вопросов-ответов gtsReview на getTables.

Код вызова [ [!getTabs? &config=`gtsreview_admin`]]. Инструкция config загружает gts-код табов и таблиц из системной настройки gtsreview_admin в JSON формате. Посмотреть код можно на GitHub
Основы gts-синтаксиса
Код самой простой таблицы выглядит так:

Инструкция loadModels говорит какую модель (базы) MODX загрузить. (Модель пока удобнее создавать через MIGX.)
В table задаются все параметры таблицы:
Более подробная справка Основы gts-синтаксиса
Ссылка на GitHub
https://modstore.pro/packages/utilities/gettables
UPD 01.02.2021
Судя по скачиваниям, getTables ставит еще кто-то кроме меня, но вопросов по его работе нет. Документация далеко не полная. Я думал пополнять ее по мере вопросов. Если кто getTables пользуется, отзовитесь, чтоб я продолжил работу над документацией :-).
Есть, конечно, замечательный компонент MIGX, но чтобы его использовать на фронте нужно вытаскивать на фронт extJs ради пары табличек. А bootstrap у меня везде используется.
Для примера вот реализация админки компонента вопросов-ответов gtsReview на getTables.

Код вызова [ [!getTabs? &config=`gtsreview_admin`]]. Инструкция config загружает gts-код табов и таблиц из системной настройки gtsreview_admin в JSON формате. Посмотреть код можно на GitHub
Основы gts-синтаксиса
Код самой простой таблицы выглядит так:
{'getTable' | snippet : [
'loadModels'=>'raschets',
'table'=>[
'class'=>'raschetsMatClass',
'actions'=>[
'create'=>[
],
'update'=>[
],
],
'pdoTools'=>[
'class'=>'raschetsMatClass',
'limit'=>0,
],
'checkbox'=>0,
'autosave'=>1,
'row'=>[
'id'=>[
],
'label'=>[
'label'=>'Имя',
'filter'=>1
],
],
],
]}
Инструкция loadModels говорит какую модель (базы) MODX загрузить. (Модель пока удобнее создавать через MIGX.)
В table задаются все параметры таблицы:
- class — класс таблицы.
- actions — что можно сделать с таблицей. Для того, чтобы в таблице можно было удалять строки достаточно добавить в action инструкцию ‘remove’=>[],.
- pdoTools — данные в таблицу из базы подготавливает pdoTools. И здесь можно использовать все его параметры.
- checkbox — включить выбор строк чекбоксами.
- autosave — инлайн редактирование данных таблицы. (Для autosave нужно чтоб action update было включено.)
- row — здесь задаются колонки таблицы, которые показываются и редактируются.
Более подробная справка Основы gts-синтаксиса
Ссылка на GitHub
https://modstore.pro/packages/utilities/gettables
UPD 01.02.2021
Судя по скачиваниям, getTables ставит еще кто-то кроме меня, но вопросов по его работе нет. Документация далеко не полная. Я думал пополнять ее по мере вопросов. Если кто getTables пользуется, отзовитесь, чтоб я продолжил работу над документацией :-).
Комментарии: 136
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
|id|content|tv_1|tv_2|действия|
Только надо иметь ввиду, что таблица пишет в тв даже если к этой странице не привязанно такое TV.
А для 'class'=>'TV',
getTables преобразует в
where_field используется если для поля включен фильтр.
По class и search_fields определяется в какую таблицу базы в какую строку писать изменения.
Эти инструкции можно самим писать. Кажется так:
И вызываем getTable
Наверно позже 1 сниппет сделаю, чтоб табы или таблица сам из инструкций определял.
Но по прежнему — Нет конфига tabs!
Jgrowl мне пришлось отключить, так как использую замену sweetalert, поэтому скорее всего сильно нагрузка выросла — там мол постоянно был цикличный запрос на этот файл, что повлекло нагрузку на аккаунт
там же просто
То нужно еще прописывать поля: pagetitle,parent,template. И лучше наверно через процессор создавать ресурсы
А можно как совместить getTable с компонентом quickview? Или же он тут не ляжет, и надо только обстилить, чтобы модалка заработала?
Вообще попробуйте затестить и отпишитесь что как :-).
Вот думаю, как их объединить…
— gettables update выводит ругать в консоль, а именно сам вывод в феном, сейчас думаю объединить с quickview, но с update, что-то я не так делаю, возможно там не надо указывать параметров?
да и не разобрался ещё какой чанк отвечает за actions
Класс добавился, а вот другие данные нет
Без него работает.
для actions я чанк сперва не сделал. думал потом сделаю, а потом возникла проблема как код перевести в чанк и снова отложилось.
Если gettables_frontend_framework_style=bootstrap_v3 по умолчанию грузятся чанки заданные в наборе параметров getTables_bootstrap_v3 yadi.sk/i/Mio_2Fxn2r79jg
Если gettables_frontend_framework_style=bootstrap_v4, то набор параметров getTables_bootstrap_v4, а если gettables_frontend_framework_style=test, то будет пробовать найти набор параметров getTables_test
чтоб грузило css и js надо включить соответствующие gettables_load_frontend_framework_style. Включение загрузки задается в gettables_load_что-то-там
и все что вам надо в attr запихать.
Только не понятно зачем вам quickview? И я под quickview компонент не планировал и не понятно как data-data-id=«1» в кнопку запихать. У меня все data-id в дата атрибутах строки запиханы. yadi.sk/i/0bBau5HI-TkEmA. На action кнопках данные строки не подставляются.
Вы еще можете вместо добавления кнопки в колонку действия, запихать кнопку в отдельную колонку.
код примерный
получилось окно вывести, но проблема в том, что окно в окне получилось и на выходе пусто
Вот мой конфиг:
только в custom всетаки ошибка забыл кавычки поставить. Ладно попробую сегодня новую версию getTables выпустить.
Но все таки зачем вам quickview что вы в нем хотите сделать? может это по другому решать надо?
generateData чтобы каким-то образом брал данные из mFilter2. Возможно еще потребуется изменить addFilterTable и в core\components\gettables\core\getmodal.class.php generateEditsData и в core\components\gettables\core\gettableprocessor.class.php check_rows.
По топорному можно добавить в таблицу фильтр с 'where_field'=>'`modResource`.`id`:IN',
mFilter2 заставить выдавать только ids и на mse_load (точно не помню) забивать в этот фильтр ids и обновлять таблицу getTables.sendData.$GtsApp = $('.get-table');getTables.Table.refresh();
(Здесь только для getTables надо пару строк добавить чтоб :IN коректно отрабатывало)
И не сохранились значения, а напрямую в таблице всё сохраняется и сохранялось без проблем
1.5.3-alpha
==============
— Чанк для action.
— Попровлена ошибка проверки существования строки в таблице перед записью.
— Добавлены описания для системных параметров.
Во все action теперь можно добавить произвольные атрибуты через attr.
Проверил
Процессор resource/update требует чтобы поле alias было.
автоматом выбрать редактор не понятно по какому признаку можно :-(.
Может лучше к модалке редакторы цеплять? yadi.sk/i/9UrYl9rYeDbZrA сюда?
И редакторы тудаже тогда запихаю
Окно открылось, но getTable сниппет отдаёт 'не найдено', хоть и в сервис quickview подключил getTable.
Определяет, что запрос по ajax и не пускает в метод fetch.
А по ajax пускать в fetch опасно. Можно тогда произвольный конфиг туда передать и вытащить любую любую таблицу modx :-(.
Можно сделать сниппет такой getTableFetch
==============
— Добавлены редакторы для textarea: ace и ckeditor.
Включение ace:
В системных настройках включить gettables_load_frontend_ace
В конфиге edit поля таблицы прописать 'editor'=>'ace':
Включение ckeditor:
В системных настройках включить gettables_load_frontend_ckeditor
В конфиге edit поля таблицы прописать 'editor'=>'ckeditor':
ace с параметром readonly не получилось совместить :-(
У тебя еще
тоже применил, но снова редактировать дает и ничего не видно все brown покрашено.
Ну а в модульном всё сохраняет))
из-за этого авто сохранение почему-то перестаёт работать
Если добавить класс к textarea[data-editor] в assets/components/gettables/js/gettables.js
То вообще row не выводится
По сути мне всего то надо в уже имеющейся таблице, которую вывожу на mFilter2 — сделать ячейку или поле +price доступным для быстрого редактирования (событие doubleClick например), так как цены часто меняются и всё, вот думаю если товаров больше 100k как это сделать? И я понимаю, что это реально сделать, но с процессором MODX ещё не доводилось иметь дело, думаю вскором проработать этот вопрос, если есть решение буду очень благодарен
Возможно 100k проще редактировать через excel и потом только выгружать в модкс. Но вот чтобы менеджеры сами 100k товаров редактировали я с таким не сталкивался. Обычно есть прайсы поставщиков и берем их цены умножаем на коофициент и загружаем. У вас не прайсы? Именно вручную 100k товаров редактировать надо?
в чанке вывода результатов mfilter2 для поля price пишем:
На страницу или в отдельный файл пишем скрипт
Создаем файл /assets/components/autosave/action.php
надо Проверяйте!
В начале /assets/components/autosave/action.php напишите
чтоб ошибки показывал
И alert вылетает
Пустой ответ это либо (int)$_POST['product_id'] == 0
Либо продукт не найден.
даже код проверил. У меня вот пост yadi.sk/i/BXVEFzq5aFPfpQ
вместо price value почемуто поставил.
У меня кэшировался mFilter2, от туда и непонятки были, но в уведомление data всё ровно не пишется :(
Но я тебе основы подсказал. Дальнейший обвес сам сделаешь. Ок?
В чанке вывода mFilter2
А в action.php
И причем тут success?
Ещё заметил, что при GetTableFetch в quickview, что некоторые id дублируются аж по 8 штук,
Наверно в pdoTools к 1 id leftJoin нескольких строк есть
в GetTableFetch Замени строку $log .= $response['log']; на
и посмотри sql запрос, что pdoTools сформировал.
https://datatables.net/
Из того, что у них особенно понравилось — хорошо оптимизирован поиск и сортировка. Неплохо выгребает даже на 200к записей.
В общем, фильтры getTables обращаются сразу к базе, а datatables скорее всего уже по выведенной на страницу таблице ищет. В getTables главное редактирование таблиц делал, а datatables — это чисто отображение. Хорошо бы на getTables сделать красивое отображение, но я в стилях не шарю. А накатывать datatables поверх скорее всего разметка полей, которые внутри ячеек таблицы, поедет. И лишний код тащить на страницу.
Думаю datatables и getTables не стоит совмещать. Если уж идти от datatables то это идти от его ajax и pdoTools, но это уже будет какой-то другой новый компонент.
Подскажите пожалуйста, как использовать вывод и запись в таблицу через MIGX? Как я понял нужно создать таблицу с помощью MIGX? Тогда какой класс использовать в этом случае?
Есть таблица в базе mysql. Есль классы в MODX для связи с таблицей в базе. Таблицу и классы проще создать через MIGX.
Компонент getTables чтобы вывести таблицу пользователю чтоб он мог редактировать в ней данные. Это аналог MIGX, только без ExtJs. Использовать можно и на фронте и в админке.
Надеюсь понятно. Можно по скайпу связаться если не понятно.
Объясню в двух словах, возможно вы посоветуете общее направление куда копать.
Есть задача сделать простой менеджер проектов на фронте. Т.е. пользователь создает проект, (ресурс modx), внутри автоматом генерятся основные разделы общие для всех проектов (вводная инфа по проекту, этап1, этап2, этап3, сдача проекта). А вот внутри этих разделов может быть любое количество разных задач. Задачи это to-do листы. Список чекбоксов. По сути та же редактируемая таблица, что может создавать ваш компонент. Через него очень удобно редактировать название задачи, менять и сохранять ее статус. Вот думаю как бы меньшими силами это воплотить. MIGX удобен готовым механизмом хранения и обработки табличных данных, но, как вы и говорите, вытаскивать ExtJs на фронт тяжко. По сути нужен удобный типTV.
Спасибо за оперативный ответ.
Только для вашей задачи было бы хорошо если геттаблес еще дерево мог строить, но он этого пока не умеет. Времени не хватает сделать. А подгружать subtable на 3 уровня не очень хорошая идея. А так бы все можно было бы на компоненте сделать.
Несколько вопросов есть:
1) «основные разделы общие для всех проектов» — то есть могут создаваться и другие разделы?
2) Создавать проект через ajax или перезагрузка таблицы?
3) открывать to-do лист по ajax или можно ссылку на отделную страницу?
Можно связаться по скайп. Мой скайп touols
Пример вывода для таблицы https://www.tale.by/assets/docs/default.schema.xml из из статьи Товары из отдельной таблицы (migxdb:
Примерный сокращенный код. Не проверял его работу. Если разместить его на какой-либо странице и зайти на неё с get или post параметром resource_id=15, то покажет покажет CustomPages прикрепленные к ресурсу с id=15.
Новые записи в таблицу геттаблес не создает, ругается на пустое значение resource_id. Это и понятно, ведь мы его не передаем в сниппет. Так? Уже созданные записи в бд отлично редактируются и в геттаблес. Просто сказка! Осталось исправить ошибку с созданием новых записей.
надо добавить строчку value=$_modx->resource.id
Все работает. Записи создаются. Спасибо. Изучаю дальше.
Вообще можно:
или
default записывает, если записываемое значение пустое. А force всегда перезаписывает значение чтобы юзер не написал.
Можно в компонентах вывести несколько таблицу или несколько таблиц в табах.
Только здесь конфиг надо в системных настройках MODX в формате JSON прописывать.
Например системная настройка gtsreview_admin. В ней код 2 табов с таблицами в них:
Для подключения в админке делаем меню, где прописываем Действие: home Параметры: &config=gtsreview_admin Пространство имён: gettables
Получиться вот:
В конфиге записать 2 параметра toJSON и showLog и в логе будет массив в json.
toFenom преобразует json массив в fenom массив
Подскажите пожалуйста, как вывести таблицу с пользователями. Пробую так:
Но кроме id ничего не выводится. Хотелось бы вывести пользователей из определенной группы, поля из профиля и доп. поля extended.
Я extended полями не пользуюсь. Просто если надо поля доп таблицу завожу какую надо.
Приджойнил modUser и таблицы минишопа, выборка работает, но выводится только один пользователь с ссумарными параметрами остальных пользователей. Не понятно почему.
Подозреваю что как то не так обратился к modUser
И надо вам добавить groupby
и сортировка не понятная 'sortdir'=>'DESC',
'sortby'=>'',
значит id пишется с modUser.id. 'class'=>'modUserGroupMember', Значит, по умолчанию, пытается найти строку в таблице modUserGroupMember с этим id и ничего не находит. Для того, чтобы компонент нашел нужную строку нужно в инструкциях поля указать нужную таблицу 'class'=>'modUserProfile', и прописать правило как из data атрибутов строки найти строку.
Здесь в sql запрос попадает update modUserProfile set fullname='что ввел' where internalKey = 5, если < tr data-id=«5»
У тебя редактируется несколько таблиц сразу. И так компонент сделан, что найти основную таблицу все равно надо. Я переделал код для этого. Смотри:
Только у меня на тестовом сайте минишопа нет и я убрал запросы к его таблицам при тестировании. Кстати в modUser ничего кроме username нету такого что можно вывести и тебе присоединять modUser и не надо.
На поле internalKey надо 'data'=>1, чтобы по нему записи в search_field искать
extended поля получается даже вывести нельзя?
кто-то реализовал там select из произвольных данных в фильтре?
т.е. по факту мне нужен список из 2 слов(например: такойто и такое)
в таблице значение так и хранится словом
Тогда примерно так: