[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-синтаксиса
Код самой простой таблицы выглядит так:
{'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 — здесь задаются колонки таблицы, которые показываются и редактируются.
Таких простых простых таблиц за полгода я уже насоздавал штук 40. Делать их все через extJs было бы очень долго.

Более подробная справка Основы gts-синтаксиса

Ссылка на GitHub
https://modstore.pro/packages/utilities/gettables

UPD 27.09.2020
Рад что сообщество положительно оценило этот компонент. Для дальнейшего его развития хотелось бы получить обратную связь от тех кто его будет использовать. Пишите, что не хватает и что было бы полезно.
Например, мне недавно не хватило, что полю пока нельзя выставить значение по умолчанию. Причем значение по умолчанию сделал для даты и пользователя MODX, а просто число или строку воткнуть не сделал :-).
Директор у меня просит, чтобы фильтры были в заголовках таблицы, как у excel и не хватает действия скопировать строку.
Пока в приоритете другие задачи, но в каком-то обозримом будущем, в течении месяцев 2 эти задачки сделаю.
Александр
19 сентября 2020, 06:10
modx.pro
1
1 227
+14
Поблагодарить автора Отправить деньги

Комментарии: 97

Артем
25 сентября 2020, 23:21
+1
Это очень крутое и нужное дополнение!
Александр
27 сентября 2020, 00:30
0
Кто-нибудь уже начал компонент использовать тестить? Как впечатления?
    R2m0x94 (Vasily)
    04 октября 2020, 02:04
    0
    Попробовал. getTable работает! СУПЕР-круто. Спасибо! :)
    R2m0x94 (Vasily)
    01 октября 2020, 15:40
    0
    А как вывести content товаров и два tv-поля, через &element=`` или через LeftJoin?
    |id|content|tv_1|tv_2|действия|
      Александр
      01 октября 2020, 17:41
      +1
      Сейчас вспоминал. Вот что получилось:
      {'getTable' | snippet : [
          'table'=>[
              'class'=>'modResource',
              'actions'=>[
                  'create'=>[
                  ],
                  'update'=>[
                      
                  ],
              ],
              'pdoTools'=>[
                   'class'=>'modResource',
                   'parents'=>258,
                   'includeTVs'=>'icon,price',
              ],
              'checkbox'=>0,
              'autosave'=>1,
              'row'=>[
                      'id'=>[
                          ],
                      'content'=>[
                          ],
                      'icon'=>[
                          'class'=>'TV',
                          ],
                      'price'=>[
                          'class'=>'TV',
                          ],
                  ],
          ],
      ]}


      Только надо иметь ввиду, что таблица пишет в тв даже если к этой странице не привязанно такое TV.
        Александр
        01 октября 2020, 18:05
        +1
        'includeTVs'=>'icon,price', — pdoTools делает leftJoin
        А для 'class'=>'TV',
        'price'=>[
                            'class'=>'TV',
                            ],
        getTables преобразует в
        3 => 
                array (
                  'field' => 'price',
                  'type' => 'text',
                  'label' => 'price',
                  'placeholder' => 'price',
                  'where_field' => '`TVprice`.`value`',
                  'class' => 'modTemplateVarResource',
                  'search_fields' => 
                  array (
                    'contentid' => 'id',
                    'tmplvarid' => 1,
                  ),
                  'value_field' => 'value',
                  'as' => 'price',
                ),
        where_field используется если для поля включен фильтр.
        По class и search_fields определяется в какую таблицу базы в какую строку писать изменения.
        Эти инструкции можно самим писать. Кажется так:
        'price'=>[
                            'class'=>'modTemplateVarResource',
                            'edit'=>[
                                  'type'=>'text',
                                 'where_field'=> '`TVprice`.`value`',
                                 'search_fields' => 
                                  [
                                    'contentid' => 'id',
                                    'tmplvarid' => 1,
                                 ]
                            ]
                       ],
          R2m0x94 (Vasily)
          04 октября 2020, 02:05
          0
          А как это вывести на getTable? (На конфиг ругается)
            Александр
            04 октября 2020, 18:17
            0
            Что вывести и как ругается?
              R2m0x94 (Vasily)
              04 октября 2020, 18:25
              0
              [[!getTabs? &config=`gtsreview_admin`]]
              На выходе пишет, что
              Нет конфига tabs!
              Уже пробовал создать системную настройку с параметрами из примера выше, но ничего не получилось. Хотелось бы про config узнать подробнее
                Александр
                04 октября 2020, 18:29
                0
                Системная настройка gtsreview_admin есть? И там массив в JSON? В массиве есть инструкция tabs на верхнем уровне? :-)
                  Александр
                  04 октября 2020, 18:38
                  +2
                  Если нужен пример выше в системную настройку, то создаем сиснастройку, например, test_gettable_tv в нее записываем json массив:
                  {
                      "table": {
                          "class": "modResource",
                          "actions": {
                              "create": [],
                              "update": []
                          },
                          "pdoTools": {
                              "class": "modResource",
                              "parents": 258,
                              "includeTVs": "icon,price"
                          },
                          "checkbox": 0,
                          "autosave": 1,
                          "row": {
                              "id": [],
                              "content": [],
                              "icon": {
                                  "class": "TV"
                              },
                              "price": {
                                  "class": "TV"
                              }
                          }
                      }
                  }

                  И вызываем getTable
                  [[!getTable? &config=`test_gettable_tv`]]
                    Александр
                    04 октября 2020, 18:39
                    +1
                    getTable вызывает таблицу, а getTabs — табы. &config в обоих работает.
                    Наверно позже 1 сниппет сделаю, чтоб табы или таблица сам из инструкций определял.
                      R2m0x94 (Vasily)
                      04 октября 2020, 19:06
                      0
                      Создал системную настройку gettables_admin. в неё записал:
                      {
                          "table": {
                              "class": "modResource",
                              "actions": {
                                  "create": [],
                                  "update": []
                              },
                              "pdoTools": {
                                  "class": "modResource",
                                  "parents": 10,
                                  "includeTVs": "keywords,partner_condition_multi",
                                  "where": {"template": 24},
                                  "limit": 20
                              },
                              "checkbox": 0,
                              "autosave": 1,
                              "row": {
                                  "id": [],
                                  "partner_condition_multi": {
                                      "class": "TV"
                                  },
                                  "keywords": {
                                      "class": "TV"
                                  }
                              }
                          }
                      }
                      // Вывел, так
                      [[!getTabs? &config=`gettables_admin`]]
                      Но по прежнему — Нет конфига tabs!
                        Александр
                        04 октября 2020, 20:45
                        +1
                        Так у вас в конфиге нет же tabs. Табов нет только таблица. Вызывайте getTable
                        [[!getTable? &config=`gettables_admin`]]
                          R2m0x94 (Vasily)
                          05 октября 2020, 19:43
                          0
                          Надо попробовать, ну а с табами тоже было б неплохо понять как их скомпилировать на вывод.

                          Jgrowl мне пришлось отключить, так как использую замену sweetalert, поэтому скорее всего сильно нагрузка выросла — там мол постоянно был цикличный запрос на этот файл, что повлекло нагрузку на аккаунт
                            Александр
                            06 октября 2020, 19:36
                            0
                            С табами разобрались?
                            там же просто
                            {'!getTabs' | snippet : [
                                'tabs'=>[
                                    'tab1'=>[
                                        'label'=>'таб с чанком',
                                        'chunk'=>'какой-то чанк'
                                    ],
                                     'tab2'=>[
                                        'label'=>'таб с таблицей',
                                        'table'=>[
                                            все параметры от таблиц
                                        ]
                                    ],
                                ]
                            ]}
                        Александр
                        04 октября 2020, 21:10
                        +1
                        Если у вас включено создание ресурсов
                        "actions": {
                                    "create": [],
                        То нужно еще прописывать поля: pagetitle,parent,template. И лучше наверно через процессор создавать ресурсы
                        'actions'=>[
                                    'create'=>[
                                        'processors'=>['modResource'=>'resource/create',],
                                    ],
                                    'update'=>[
                                        
                                    ],
                                ],
          R2m0x94 (Vasily)
          04 октября 2020, 02:29
          0
          А как это вывести на getTable? (На конфиг ругается)
          *getTabs
          А можно как совместить getTable с компонентом quickview? Или же он тут не ляжет, и надо только обстилить, чтобы модалка заработала?
            Александр
            04 октября 2020, 18:23
            +1
            Не пользовался quickview. Так что не знаю что получиться. Вообще в любом чанке должно сработать. А вот если quickview сам чанк по ajax подгружает может скрипты js не подгрузятся. И если у quickview модалки бутстраповкие проблемы с модалками могут возникнуть. Там новая модалка может ниже старой открыться и стратая будет закрывать ее.
            Вообще попробуйте затестить и отпишитесь что как :-).
              R2m0x94 (Vasily)
              04 октября 2020, 19:10
              0
              Отпишусь обязательно, пока только тестировать начал. Компонент очень нужный
                R2m0x94 (Vasily)
                05 октября 2020, 14:25
                0
                Бутстрап грузится от quickview, а из gettables_mgr_framework_style_css — не грузит (в моём случае это хорошо, потом сделаю на quickview). Но для табсов ещё пока застрял на конфиге.
                // gettables
                <button type="button" class="btn get-table-row " data-name="update" data-action="getTable/update" data-modal="getModal/fetchTableModal" title="Изменить">
                
                </button>
                
                // quickview
                <a class="quickview"
                			data-click
                			data-quickview-mode="modal"
                			data-data-action="chunk"
                			data-data-element="test"
                			data-data-id="1"
                			data-dialog-buttons='["close"]'
                			> </a>
                Вот думаю, как их объединить…
                — gettables update выводит ругать в консоль, а именно сам вывод в феном, сейчас думаю объединить с quickview, но с update, что-то я не так делаю, возможно там не надо указывать параметров?
                {'getTable' | snippet : [
                    'table'=>[
                        'class'=>'modResource',
                        'actions'=>[
                            'create'=>[
                            ],
                            'update' =>[
                                'action'=>'getTable/update',
                                'title'=>'Изменить',
                                'cls' => '',
                                
                                'row' => [],
                                'icon' => 'far fa-edit',
                                'modal' => [
                                    'action' => 'getModal/fetchTableModal',
                                    'tpl'=>'b4.getTable.Modal.CreateUpdate.tpl',
                                ],
                                'processors'=>['modResource'=>'resource/update'],
                            ],

                да и не разобрался ещё какой чанк отвечает за actions
                  R2m0x94 (Vasily)
                  05 октября 2020, 15:28
                  0
                  'update' =>[
                                  'action'=>'getTable/update',
                                  'title'=>'Изменить',
                                  'cls' => 'quickview',
                                  'click' => '',
                                  'quickview-mode' => 'modal',
                                  'row' => [],
                                  'icon' => 'far fa-edit',
                                  'modal' => [
                                      'action' => 'getModal/fetchTableModal',
                                      'tpl'=>'b4.getTable.Modal.CreateUpdate.tpl',
                                  ],
                  Было-бы неплохо давать возможность добавлять атрибуты на кнопку, чтобы появилась возможность связи с quickview

                  Класс добавился, а вот другие данные нет
                    Александр
                    05 октября 2020, 16:11
                    +1
                    На update какая-то ошибка на поцессоре
                    'processors'=>['modResource'=>'resource/update'],
                    Без него работает.
                    для actions я чанк сперва не сделал. думал потом сделаю, а потом возникла проблема как код перевести в чанк и снова отложилось.
                      Александр
                      05 октября 2020, 16:26
                      +1
                      gettables_mgr_framework_style — стиль для админки. gettables_frontend_framework_style — для фронта.
                      Если 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_что-то-там
                        Александр
                        05 октября 2020, 16:53
                        +1
                        для quickview наверно стоит попробывать action
                        'custom' =>[
                                        'action'=>"getTable/custom",
                                        'row' => [],
                                        'icon' => '',
                                        'tag' =>'a',
                                        'attr' => '',
                                    ],
                        и все что вам надо в attr запихать.

                        Только не понятно зачем вам quickview? И я под quickview компонент не планировал и не понятно как data-data-id=«1» в кнопку запихать. У меня все data-id в дата атрибутах строки запиханы. yadi.sk/i/0bBau5HI-TkEmA. На action кнопках данные строки не подставляются.

                        Вы еще можете вместо добавления кнопки в колонку действия, запихать кнопку в отдельную колонку.
                        "row": {
                                    "id": [],
                                    "partner_condition_multi": {
                                        "class": "TV"
                                    },
                                    "keywords": {
                                        "class": "TV"
                                    },
                                    "test": {
                                        "label":"quickview",
                                        "content":"<a class=\"quickview\" data-click
                        			data-quickview-mode=\"modal\"
                        			data-data-action=\"chunk\"
                        			data-data-element=\"test\"
                        			data-data-id=\"{$id}\"
                        			data-dialog-buttons='[\"close\"]'
                        			> </a>"
                                    }
                                }
                        код примерный
                          R2m0x94 (Vasily)
                          05 октября 2020, 18:06
                          0
                          Намудрил, что-то не выходит. Вместо ссылки <\a — в таблице <\input
                          {'getTable' | snippet : [
                              'table'=>[
                                  'class'=>'modResource',
                                  'actions'=>[
                                      'create'=>[
                                      ],
                                      'update' =>[
                                          'action'=>'getTable/update',
                                          'title'=>'{$_modx->resource.id}',
                                          'cls' => '=',
                                          'row' => [],
                                          'icon' => 'far fa-edit',
                                          'modal' => [
                                              'action' => 'getModal/fetchTableModal',
                                              'tpl'=>'b4.getTable.Modal.CreateUpdate.tpl',
                                          ],
                                          
                                      ],
                                  ],
                                  'custom' =>[
                                          'action'=>"getTable/custom",
                                          'row' => [],
                                          'icon' => 'far fa-edit',
                                          'tag' =>'a',
                                          'attr' => 'data-data-tag',
                                      ],
                                  'pdoTools'=>[
                                       'class'=>'modResource',
                                       'parents'=>10,
                                       'template'=>24,
                                       'resource'=>'52603',
                                       'includeTVs'=>'keywords,partner_condition_multi',
                                       'where'=>[
                                          	'template' => 24, 
                                          	'id:IN' => ['', 52603, 2],
                                          ],
                                       'limit'=>20,
                                  ],
                                  'checkbox'=>0,
                                  'autosave'=>1,
                                  'row'=>[
                                          'id'=>[],
                                          'partner_condition_multi'=>[
                                              'class'=>'TV',
                                              ],
                                          'keywords'=>[
                                              'class'=>'TV',
                                              'edit'=>[
                                                  'type'=>'text',
                                                  'where_field'=>'`TVkeywords`.`value`',
                                                  'search_fields' => [
                                                      'contentid' => 'id',
                                                      'tmplvarid' => 6,
                                                  ]
                                              ]
                                             ],
                                          'test'=>[
                                              'label'=>'quickview',
                                              'content'=>'<a >da</a>',
                                              ],
                                      ],
                              ],
                          ]}
                            R2m0x94 (Vasily)
                            05 октября 2020, 18:29
                            0
                            {'getTable' | snippet : [
                                'table'=>[
                                    'class'=>'modResource',
                                    'actions'=>[
                                        'create'=>[
                                        ],
                                        'update' =>[
                                            'action'=>'getTable/custom',
                                            'title'=>'{$_modx->resource.id}',
                                            'cls' => 'quickview" data-click quickview-mode="modal" data-data-action="chunk" data-data-id="{$_modx->resource.id}" data-data-element="getTable.Modal.CreateUpdate.tpl" data-dialog-size="size-wide" data-dialog-title="safasfa"',
                                            'row' => [],
                                            'icon' => 'far fa-edit',
                                            'modal' => [
                                                'action' => 'getModal/fetchTableModal',
                                                'tpl'=>'b4.getTable.Modal.CreateUpdate.tpl',
                                            ],
                                            
                                        ],
                                    ],
                                    'custom' =>[
                                            'action'=>"getTable/custom",
                                            'row' => [],
                                            'icon' => 'far fa-edit',
                                            'tag' =>'a',
                                            'attr' => 'data-data-tag',
                                        ],
                                    'pdoTools'=>[
                                         'class'=>'modResource',
                                         'parents'=>10,
                                         'template'=>24,
                                         'resource'=>'52603',
                                         'includeTVs'=>'keywords,partner_condition_multi',
                                         'where'=>[
                                            	'template' => 24, 
                                            	'id:IN' => ['', 52603, 2],
                                            ],
                                         'limit'=>20,
                                    ],
                                    'checkbox'=>0,
                                    'autosave'=>1,
                                    'row'=>[
                                            'id'=>[],
                                            'partner_condition_multi'=>[
                                                'class'=>'TV',
                                                ],
                                            'keywords'=>[
                                                'class'=>'TV',
                                                'edit'=>[
                                                    'type'=>'text',
                                                    'where_field'=>'`TVkeywords`.`value`',
                                                    'search_fields' => [
                                                        'contentid' => 'id',
                                                        'tmplvarid' => 6,
                                                    ]
                                                ]
                                               ],
                                            'test'=>[
                                                'label'=>'quickview',
                                                'content'=>'<a >da</a>',
                                                ],
                                        ],
                                ],
                            ]}

                            получилось окно вывести, но проблема в том, что окно в окне получилось и на выходе пусто

                            // в attr вывести не удалось атрибуты
                            'attr' => '',
                              Александр
                              05 октября 2020, 22:58
                              +1
                              custom должно быть в массиве actions
                              Вот мой конфиг:
                              {'getTable' | snippet : [
                                  'showLog'=>1,
                                  'toJSON'=>1,
                                  'table'=>[
                                      'class'=>'modResource',
                                      'actions'=>[
                                          'create'=>[
                                              
                                          ],
                                          'update'=>[
                                              'processors'=>['modResource'=>'resource/update',],
                                          ],
                                          'custom' =>[
                                              'action'=>"getTable/custom",
                                              'row' => [],
                                              'cls'=>'red',
                                              'icon' => 'glyphicon glyphicon-edit',
                                              'tag' =>'a',
                                              'attr' => 'data-data-tag',
                                          ],
                                      ],
                                      'pdoTools'=>[
                                           'class'=>'modResource',
                                           'parents'=>258,
                                           'includeTVs'=>'icon,price',
                                      ],
                                      'checkbox'=>0,
                                      'autosave'=>1,
                                      'row'=>[
                                              'id'=>[
                                                  ],
                                              'content'=>[
                                                  ],
                                              'icon'=>[
                                                  'class'=>'TV',
                                                  ],
                                              'price'=>[
                                                  'class'=>'TV',
                                                  ],
                                              'test'=>[
                                                  'label'=>'quickview',
                                                  'content'=>'<a >da</a>',
                                                  'edit'=>false,
                                                  ],
                                          ],
                                  ],
                              ]}
                              только в custom всетаки ошибка забыл кавычки поставить. Ладно попробую сегодня новую версию getTables выпустить.
                              Но все таки зачем вам quickview что вы в нем хотите сделать? может это по другому решать надо?
                                R2m0x94 (Vasily)
                                06 октября 2020, 08:58
                                0
                                Просто, задумка такова, чтобы связать сниппеты, например у меня используется mFilter2 и в нем quickview, я вывожу всё это дело в таблицу с фильтром, и тут появился getTables, который надо внедрить в mFilter2, соответственно решено было скрестить их, но перем маштабом, появилась необходимость сделать возможность окон на редактирование через quickview, так как он все равно подгружается, а из бутстрапа только сетка css и modal-dialog, конечно если есть решение как вывести mFilter2 с getTable, буду только рад. :)
                                  Александр
                                  06 октября 2020, 19:06
                                  0
                                  Скрестить getTables с mFilter2 — такого никогда не задумывалось :-). getTables получает данные таблиц только от pdoTools. По хорошему нужно переписывать функции. В core\components\gettables\core\gettable.class.php
                                  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 коректно отрабатывало)
                                  R2m0x94 (Vasily)
                                  06 октября 2020, 11:11
                                  0
                                  Подключил bootstrap без quickview, окно открылось с полями, как и было задумано, но при сохранении в уведомлении пишет, что объект не сохранен.
                                  Object   не сохранен update
                                  И не сохранились значения, а напрямую в таблице всё сохраняется и сохранялось без проблем
                                    R2m0x94 (Vasily)
                                    06 октября 2020, 11:36
                                    0
                                    Ой, забыл добавить alias, теперь всё норм
                      R2m0x94 (Vasily)
                      05 октября 2020, 16:02
                      0
                      Ещё предложение добавить словари для настройки, а то когда переходишь в систему управления — описание нету и сложно додуматься, что для чего нужно. Спасибо
                        Александр
                        05 октября 2020, 16:14
                        0
                        Мда… так и знал стоит выложить и куча работы добавят :-).
                          Александр
                          06 октября 2020, 06:06
                          +1
                          Обновил компонент
                          1.5.3-alpha
                          ==============
                          — Чанк для action.
                          — Попровлена ошибка проверки существования строки в таблице перед записью.
                          — Добавлены описания для системных параметров.

                          Во все action теперь можно добавить произвольные атрибуты через attr.
                          'actions'=>[
                                      'custom' =>[
                                          'action'=>"getTable/custom",
                                          'row' => [],
                                          'cls'=>'red',
                                          'icon' => 'glyphicon glyphicon-edit',
                                          'tag' =>'a',
                                          'attr' => 'data-data-tag="a"',
                                      ],
                                  ],
                          Проверил
                          'update'=>[
                                          'processors'=>['modResource'=>'resource/update',],
                                      ],
                          Процессор resource/update требует чтобы поле alias было.
                            R2m0x94 (Vasily)
                            07 октября 2020, 21:33
                            0
                            А есть, какой-то простой способ редактировать поле (уже из выборки pdo) tv через процессор напрямую из фронтенда?
                              Александр
                              07 октября 2020, 21:37
                              0
                              Через процессор нет способа. А зачем? и через какой процессор?
                          R2m0x94 (Vasily)
                          06 октября 2020, 16:54
                          0
                          Ещё предлагаю внести корректировки в textarea, чтобы можно было кодить с ACE
                          // такова типа (или же из системной настройки, если он установлен и возможность вкл/выкл редактора в системной настройке)
                          <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js"></script>
                          <style>
                              .autosize {
                                /*resize: none;
                                overflow: hidden;*/
                                height:400px!important;
                              }
                              .autosize[readonly], .autosize[readonly] div {
                                  background: brown;
                                  user-select: none;
                                  cursor: not-allowed;
                              }
                          </style>
                          
                          autosize();
                          function autosize(){
                              var text = $('.autosize');
                          
                              text.each(function(){
                                  $(this).attr('rows',1);
                                  resize($(this));
                              });
                          
                              text.on('input', function(){
                                  resize($(this));
                              });
                              
                              function resize ($text) {
                                  $text.css('height', 'auto');
                                  $text.css('height', $text[0].scrollHeight+'px');
                              }
                          }
                          
                          // Hook up ACE editor to all textareas with data-editor attribute
                          $(function() {
                            $('textarea[data-editor]').each(function() {
                              var textarea = $(this);
                              var mode = textarea.data('editor');
                              var editDiv = $('<div>', {
                                position: 'absolute',
                                width: textarea.width(),
                                height: textarea.height(),
                                'class': textarea.attr('class'),
                                'readonly': textarea.attr('readonly')
                              }).insertBefore(textarea);
                          
                              textarea.css('display', 'none');
                              var editor = ace.edit(editDiv[0]);
                              editor.renderer.setShowGutter(textarea.data('gutter'));
                              editor.getSession().setValue(textarea.val());
                              editor.getSession().setMode("ace/mode/" + mode);
                              editor.setTheme("ace/theme/idle_fingers");
                              //editor.setTheme("ace/theme/chrome");
                          
                              // copy back to textarea on form submit...
                              textarea.closest('form').submit(function() {
                                textarea.val(editor.getSession().getValue());
                              })
                            });
                          });
                          
                          
                          
                          // Ещё в чанк getTable.EditRow.tpl для textarea
                              {case 'textarea'}
                                  <textarea data-editor="xml" data-gutter="1" rows="15" data-field="{$edit.field}" name="{$edit.field}" placeholder="{$edit.placeholder}" class="form-control autosize get-table-autosave"
                                      style="max-height: 400px;" {if $edit.readonly}readonly{/if}>{$edit.value}</textarea>
                                  <span class="error_{$edit.field}"></span>
                            Александр
                            06 октября 2020, 19:19
                            +1
                            Интересный вариант. Только не понятно textarea.closest('form').submit не должно сработать на строке таблицы. И другие редакторы тоже хотелось бы подключать.
                              Александр
                              06 октября 2020, 20:24
                              0
                              думаю подключить ACE и CKEditor. Наверно надо будет указывать
                              'row'=>[
                                  'content'=>[
                                      'edit'=>[
                                          'type'=>'textarea',
                                          'editor'=>'ACE', или 'CKEditor'
                                      ]
                                  ]
                              ]
                              автоматом выбрать редактор не понятно по какому признаку можно :-(.
                                R2m0x94 (Vasily)
                                07 октября 2020, 10:21
                                0
                                Было б вообще волшебно, чтоб как в админке с emmet'ом, но пока ещё эта настройка 'editor'=>'ACE' — не работает
                                  Александр
                                  07 октября 2020, 20:14
                                  0
                                  Не нравиться мне в таблицу редактор запихивать. Строки разьезжаются и это уже не таблица получается yadi.sk/i/uZxbjTVkxqx1kQ
                                  Может лучше к модалке редакторы цеплять? yadi.sk/i/9UrYl9rYeDbZrA сюда?
                                    R2m0x94 (Vasily)
                                    07 октября 2020, 20:16
                                    0
                                    Ну да в модалке можно, просто при ajax пагинации ace слитает
                                      Александр
                                      07 октября 2020, 20:22
                                      0
                                      В assets\components\gettables\js\gettables.js я вешаю обработчик на событие открытия модалки
                                      getTables.$doc.on('shown.bs.modal', function (event) {
                                                      $('.get-date').each(function(){
                                                          $(this).datepicker();
                                                      });
                                                      $('.get-select-multiple').each(function(){
                                                          $(this).multiselect();
                                                      });
                                                  });
                                      И редакторы тудаже тогда запихаю
                                  R2m0x94 (Vasily)
                                  07 октября 2020, 12:39
                                  0
                                  А как сделать, если стр. много и при переключении на вторую стр. редактор-ACE не слитал?
                                R2m0x94 (Vasily)
                                07 октября 2020, 20:13
                                0
                                Попробовал выводить модалку quickview, а в ней форму редактирования, но не вышло. Взял за основу пример 5.
                                Окно открылось, но getTable сниппет отдаёт 'не найдено', хоть и в сервис quickview подключил getTable.

                                ...
                                                            }
                                            }
                                        }
                                    }
                                }
                                0.0000050: __construct
                                0.0000019: getTables loaded.
                                0.0000191: cacheConfig
                                0.0004060: getTables init from cache.
                                0.0004311: load propertySet getTables_bootstrap_v3
                                0.0000069: cacheConfig
                                0.0002370: registerCSS_JS
                                0.0001199: handleRequest getTable/fetch
                                0.4405050: Total time
                                2 097 152: Memory usage
                                  Александр
                                  07 октября 2020, 20:17
                                  0
                                  Как вызываешь покажи весь код
                                    R2m0x94 (Vasily)
                                    07 октября 2020, 20:25
                                    0
                                    // id'шники вывожу на стр.
                                    <div class="quickview-parent"
                                    	data-quickview-mode="modal"
                                    	data-data-action="chunk"
                                    	data-data-element="quickview.tpl"
                                    	data-quickview-loop="true"
                                    	data-quickview-viewhash="true"
                                    	data-dialog-size="size-wide"
                                    	data-dialog-buttons='["prev","next"]'>
                                    	[[!pdoPage?
                                    		&parents=`3679`
                                    		&element=`msProducts`
                                    		&tpl=`@INLINE
                                    		<a class='quickview'
                                    		    data-click
                                    		    data-data-id="[[+id]]"
                                    		    data-quickview-group="product"
                                    		    data-dialog-title="[[+pagetitle]]">[[+pagetitle]]</a>
                                    	`]]
                                    	[[!+page.nav]]
                                    </div>
                                    
                                    // В чанке quickview.tpl
                                        {'!getTable' | snippet : [
                                        'showLog'=>1,
                                        'toJSON'=>1,
                                        'table'=>[
                                            'class'=>'modResource',
                                            'actions'=>[
                                                'update' =>[
                                                    'icon' => 'far fa-edit',
                                                    'processors'=>['modResource'=>'resource/update'],
                                                ],
                                            ],
                                            'pdoTools'=>[
                                                'class'=>'modResource',
                                                'parents'=>3679,
                                                'template'=>4,
                                                'includeTVs'=>'technical_specifications,equipment,videos',
                                                'where'=>[
                                                    'template' => 4, 
                                                    'id' => $_modx->resource.id,
                                                ],
                                                'limit'=>5,
                                            ],
                                            'checkbox'=>0,
                                            'autosave'=>1,
                                            'row'=>[
                                                'id'=>[
                                                    'custom' =>[
                                                    
                                                    'cls'=>'red',
                                                    'icon' => 'far fa-edit',
                                                    'tag' =>'a',
                                                    'attr' => 'data-data-tag',
                                                    ],
                                                ],
                                                'content'=>[
                                                    'edit'=>[
                                                        'type'=>'textarea',
                                                    ],
                                                    
                                                ],
                                                'technical_specifications'=>[
                                                    'class'=>'TV',
                                                    'label'=>'Технические характеристики',
                                                    'edit'=>['type'=>'textarea',],
                                                ],
                                                'equipment'=>[
                                                    'class'=>'TV',
                                                    'label'=>'Комплект поставки',
                                                    'edit'=>[
                                                        'type'=>'textarea',
                                                        'where_field'=>'`TVequipment`.`value`',
                                                        'search_fields' => [
                                                            'contentid' => 'id',
                                                            'tmplvarid' => 95,
                                                        ],
                                                        'readonly'=>1,
                                                    ],
                                                    
                                               ],
                                               'videos'=>[
                                                    'class'=>'TV',
                                                    'label'=>'Видео',
                                                    'edit'=>['type'=>'textarea',],
                                                ],
                                               'alias'=>['edit'=>['readonly'=>1,],],
                                            ],
                                        ],
                                    ]}
                                      Александр
                                      07 октября 2020, 20:38
                                      0
                                      'id' => $_modx->resource.id, сюда вот что приходит? какой id?
                                        R2m0x94 (Vasily)
                                        07 октября 2020, 20:53
                                        0
                                        не найдено
                                        0.5348940: toJSON {
                                            "getTableEditRowTpl": "getTable.EditRow.tpl",
                                            "getTableFilterTpl": "getTable.Filter.tpl",
                                            "getTableModalCreateUpdateTpl": "getTable.Modal.CreateUpdate.tpl",
                                            "getTableNavTpl": "getTable.nav.tpl",
                                            "getTableOuterTpl": "getTable.outer.tpl",
                                            "getTableRowTpl": "getTable.row.tpl",
                                            "getTabsTpl": "getTabs.tpl",
                                            "limit": 10,
                                            "outputSeparator": "\n",
                                            "sortby": "id",
                                            "sortdir": "ASC",
                                            "showLog": 1,
                                            "table": {
                                                "class": "modResource",
                                                "actions": {
                                                    "update": {
                                                        "icon": "far fa-edit",
                                                        "processors": {
                                                            "modResource": "resource\/update"
                                                        }
                                                    }
                                                },
                                                "pdoTools": {
                                                    "class": "modResource",
                                                    "parents": 3679,
                                                    "template": 4,
                                                    "includeTVs": "technical_specifications,equipment,videos",
                                                    "where": {
                                                        "template": 4,
                                                        "id": 3690
                                                    },
                                                    "limit": 5
                                                },
                                                "checkbox": 0,
                                                "autosave": 1,
                                                "row": {
                                                    "id": {
                                                        "custom": {
                                                            "cls": "red",
                                                            "icon": "far fa-edit",
                                                            "tag": "a",
                                                            "attr": "data-data-tag"
                                                        }
                                                    },
                                                    "content": {
                                                        "edit": {
                                                            "type": "textarea"
                                                        }
                                                    },
                                                    "technical_specifications": {
                                                        "class": "TV",
                                                        "label": "\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438",
                                                        "edit": {
                                                            "type": "textarea"
                                                        }
                                                    },
                                                    "equipment": {
                                                        "class": "TV",
                                                        "label": "\u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438",
                                                        "edit": {
                                                            "type": "textarea",
                                                            "where_field": "`TVequipment`.`value`",
                                                            "search_fields": {
                                                                "contentid": "id",
                                                                "tmplvarid": 95
                                                            },
                                                            "readonly": 1
                                                        }
                                                    },
                                                    "videos": {
                                                        "class": "TV",
                                                        "label": "\u0412\u0438\u0434\u0435\u043e",
                                                        "edit": {
                                                            "type": "textarea"
                                                        }
                                                    },
                                                    "alias": {
                                                        "edit": {
                                                            "readonly": 1
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        0.0000050: __construct
                                        0.0000019: getTables loaded.
                                        0.0000341: cacheConfig
                                        0.0005000: load propertySet getTables_bootstrap_v3
                                        0.0000069: cacheConfig
                                        0.0002151: registerCSS_JS
                                        0.0001290: handleRequest getTable/fetch
                                        0.5363231: Total time
                                        4 194 304: Memory usage
                                          Александр
                                          07 октября 2020, 21:34
                                          +1
                                          А это здесь ошибка
                                          if($action == "fetch" and !$this->config['isAjax'])
                                                          return $this->fetch($data);
                                                  
                                                  //$this->getTables->addDebug($data['table_name'],'handleRequest  $table_name');
                                                  if(!$table = $this->getTables->getClassCache('getTable',$data['table_name'])){
                                                      return $this->error("{$data['table_name']} не найдено");
                                                  }
                                          Определяет, что запрос по ajax и не пускает в метод fetch.
                                          А по ajax пускать в fetch опасно. Можно тогда произвольный конфиг туда передать и вытащить любую любую таблицу modx :-(.
                                          Можно сделать сниппет такой getTableFetch
                                          <?php
                                          /** @var modX $modx */
                                          /** @var array $scriptProperties */
                                          /** @var getTables $getTables */
                                          //$getTables = $modx->getService('getTables', 'getTables', MODX_CORE_PATH . 'components/gettables/model/', $scriptProperties);
                                          
                                          $gettables_core_path = $modx->getOption('gettables_core_path',null, MODX_CORE_PATH . 'components/gettables/core/');
                                          $gettables_core_path = str_replace('[[+core_path]]', MODX_CORE_PATH, $gettables_core_path);
                                          if (!$modx->loadClass('gettables', $gettables_core_path, false, true)) {
                                              return 'Could not load getTables class!';
                                          }
                                          if (!$modx->loadClass('getTable', $gettables_core_path, false, true)) {
                                              return 'Could not load getTable class!';
                                          }
                                          //echo "<pre>".print_r($scriptProperties,1)."<pre>";
                                          
                                          $getTables = new getTables($modx, $scriptProperties);
                                          if (!$getTables) {
                                              return 'Could not load getTables class!';
                                          }
                                          
                                          $getTables->pdoTools->addTime('getTables loaded.');
                                          $getTables->initialize();
                                          
                                          //$response = $getTables->handleRequest('getTable/fetch');
                                          $class = 'getTable';
                                          $getTable = new getTable($getTables, $getTables->config);
                                          if (!$getTable) {
                                              return 'Could not load getTable class!';
                                          }else{
                                              $response = $getTable->fetch();
                                          }
                                          
                                          if(!$response['success']){
                                              $output = $response['message'];
                                          }else{
                                              $output = $response['data']['html'];
                                          }
                                          
                                          $log = '';
                                          if ($modx->user->hasSessionContext('mgr') && !empty($showLog)) {
                                              $log .= $response['log'];
                                          }
                                          return $output.$log;
                                            R2m0x94 (Vasily)
                                            07 октября 2020, 23:02
                                            0
                                            Да, getTableFetch выводит в quickview супер-круто. Спасибо
                                        Александр
                                        07 октября 2020, 20:47
                                        0
                                        У меня нет quickview я проверить не могу
                                    R2m0x94 (Vasily)
                                    07 октября 2020, 20:20
                                    0
                                    А какой синтаксис параметров !getTable вывести их из коробки? Например
                                    [[!getTable? &table=`в фигурных или квадратных?`]]
                                      Александр
                                      07 октября 2020, 20:26
                                      0
                                      Э… квадратные скобки это для феном только. А без фенома можно только из системной настройки через config вывести.
                                        R2m0x94 (Vasily)
                                        07 октября 2020, 20:29
                                        0
                                        интересно, попробую…
                                      Александр
                                      08 октября 2020, 00:08
                                      +1
                                      1.5.4-alpha
                                      ==============
                                      — Добавлены редакторы для textarea: ace и ckeditor.

                                      Включение ace:
                                      В системных настройках включить gettables_load_frontend_ace
                                      В конфиге edit поля таблицы прописать 'editor'=>'ace':
                                      ...
                                      'row'=>[
                                              'content'=>[
                                                  'edit'=>        ['type'=>'textarea','editor'=>'ace','editor_mode'=>'xml','editor_height'=>'300','editor_theme'=>'idle_fingers'],
                                                  ],
                                      ....
                                      Включение ckeditor:
                                      В системных настройках включить gettables_load_frontend_ckeditor
                                      В конфиге edit поля таблицы прописать 'editor'=>'ckeditor':
                                      ...
                                      'row'=>[
                                              'content'=>[
                                                  'edit'=>        ['type'=>'textarea','editor'=>'ckeditor',],
                                                  ],
                                      ....
                                      ace с параметром readonly не получилось совместить :-(
                                        R2m0x94 (Vasily)
                                        08 октября 2020, 00:28
                                        0
                                        там в js 1 строчка кода. я для этого дописал
                                        'readonly': textarea.attr('readonly')
                                        или в конструкторе
                                        'readonly'=>'readonly',
                                          Александр
                                          08 октября 2020, 00:46
                                          0
                                          Это я написал. Вообще практически тоже самое что ты написал. Но редактировать дает.
                                          У тебя еще
                                          .autosize[readonly], .autosize[readonly] div {
                                                  background: brown;
                                                  user-select: none;
                                                  cursor: not-allowed;
                                              }
                                          тоже применил, но снова редактировать дает и ничего не видно все brown покрашено.
                                            R2m0x94 (Vasily)
                                            08 октября 2020, 09:17
                                            0
                                            Главное, что запись в него не идёт. Хотя есле в инпекторе браузера убрать атрибут readonly, то сохраняет. Я вот, что не понял, когда в quickview выаожу таблицу, то там почему-то не идёт сохранение через GetTablesFetch, может ещё надо какую строку подкрутить?

                                            Ну а в модульном всё сохраняет))
                                              Александр
                                              08 октября 2020, 09:45
                                              0
                                              Я вот, что не понял, когда в quickview выаожу таблицу, то там почему-то не идёт сохранение через GetTablesFetch, может ещё надо какую строку подкрутить
                                              Я вот не понял какое именно сохранение. И через сниппет никакого сохранения нету. Все операции через ajax идут. Через quickview вообще скрипт assets\components\gettables\js\gettables.js подгружается?
                                                R2m0x94 (Vasily)
                                                08 октября 2020, 09:47
                                                0
                                                Да, скрипт assets\components\gettables\js\gettables.js подгружается, а позавчера сохранялось всё норм было
                                                  R2m0x94 (Vasily)
                                                  08 октября 2020, 09:49
                                                  0
                                                  Скорей всего это из-за моего шаманства. Сейчас проверю…
                                                    Александр
                                                    08 октября 2020, 10:02
                                                    0
                                                    В твоем шаманстве только ты разберешься :-)
                                                      R2m0x94 (Vasily)
                                                      08 октября 2020, 10:33
                                                      0
                                                      Да, это в чанке getTable.EditRow.tpl, напортачил))
                                                      <textarea data-editor="xml" data-gutter="1" rows="15"
                                                      из-за этого авто сохранение почему-то перестаёт работать
                                                        R2m0x94 (Vasily)
                                                        08 октября 2020, 11:05
                                                        0
                                                        Только вот без этого ace пропадает, но сохраняет, а с ace не сохраняет. Плюс в параметрах
                                                        'content'=>[
                                                                        'edit'=>[
                                                                            'type'=>'textarea','editor'=>'ace','editor_mode'=>'xml','editor_height'=>'400','editor_theme'=>'idle_fingers'
                                                                        ],
                                                        и все равно атрибуты не подсовывает
                                                R2m0x94 (Vasily)
                                                08 октября 2020, 09:45
                                                0
                                                да и если просто getTable на странице выводу то перестал автосохранять
                                                  R2m0x94 (Vasily)
                                                  08 октября 2020, 11:13
                                                  0
                                                  А в модулюном quickview теперь «Строка таблицы не найдена» и не происходит автосохранение
                                                  0.0044389: __construct
                                                  0.0000319: cacheConfig
                                                  0.0001361: handleRequest getTable/autosave
                                                  0.0006440: xPDO query object created
                                                  0.0005109: Included list of tvs: equipment, technical_specifications, videos
                                                  0.0002639: leftJoined modTemplateVarResource as TVequipment
                                                  0.0000439: leftJoined modTemplateVarResource as TVtechnical_specifications
                                                  0.0000389: leftJoined modTemplateVarResource as TVvideos
                                                  0.0000961: Added selection of msProduct: `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `alias_visible`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `content`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
                                                  0.0000060: Added selection of modTemplateVarResource: IFNULL(`value`, '') AS `equipment`
                                                  0.0000021: Added selection of modTemplateVarResource: IFNULL(`value`, '') AS `technical_specifications`
                                                  0.0000019: Added selection of modTemplateVarResource: IFNULL(`value`, '') AS `videos`
                                                  0.0000191: Replaced TV conditions
                                                  0.0000060: Processed additional conditions
                                                  0.0000880: Added where condition: id=3374, modResource.id:IN(3374)
                                                  0.0000029: Replaced TV conditions
                                                  0.0000598: Sorted by modResource.id, ASC
                                                  0.0000041: Limited to 1, offset 0
                                                  0.0002069: SQL prepared "SELECT `msProduct`.`id`, `msProduct`.`type`, `msProduct`.`contentType`, `msProduct`.`pagetitle`, `msProduct`.`longtitle`, `msProduct`.`description`, `msProduct`.`alias`, `msProduct`.`alias_visible`, `msProduct`.`link_attributes`, `msProduct`.`published`, `msProduct`.`pub_date`, `msProduct`.`unpub_date`, `msProduct`.`parent`, `msProduct`.`isfolder`, `msProduct`.`introtext`, `msProduct`.`content`, `msProduct`.`richtext`, `msProduct`.`template`, `msProduct`.`menuindex`, `msProduct`.`searchable`, `msProduct`.`cacheable`, `msProduct`.`createdby`, `msProduct`.`createdon`, `msProduct`.`editedby`, `msProduct`.`editedon`, `msProduct`.`deleted`, `msProduct`.`deletedon`, `msProduct`.`deletedby`, `msProduct`.`publishedon`, `msProduct`.`publishedby`, `msProduct`.`menutitle`, `msProduct`.`donthit`, `msProduct`.`privateweb`, `msProduct`.`privatemgr`, `msProduct`.`content_dispo`, `msProduct`.`hidemenu`, `msProduct`.`class_key`, `msProduct`.`context_key`, `msProduct`.`content_type`, `msProduct`.`uri`, `msProduct`.`uri_override`, `msProduct`.`hide_children_in_tree`, `msProduct`.`show_in_tree`, `msProduct`.`properties`, IFNULL(`TVequipment`.`value`, '') AS `equipment`, IFNULL(`TVtechnical_specifications`.`value`, '') AS `technical_specifications`, IFNULL(`TVvideos`.`value`, '') AS `videos` FROM `modx_site_content` AS `msProduct` LEFT JOIN `modx_site_tmplvar_contentvalues` `TVequipment` ON `TVequipment`.`contentid` = `msProduct`.`id` AND `TVequipment`.`tmplvarid` = 95 LEFT JOIN `modx_site_tmplvar_contentvalues` `TVtechnical_specifications` ON `TVtechnical_specifications`.`contentid` = `msProduct`.`id` AND `TVtechnical_specifications`.`tmplvarid` = 94 LEFT JOIN `modx_site_tmplvar_contentvalues` `TVvideos` ON `TVvideos`.`contentid` = `msProduct`.`id` AND `TVvideos`.`tmplvarid` = 96 WHERE  ( `msProduct`.`id` = 3374 AND `modResource`.`id` IN (3374) )  ORDER BY modResource.id ASC LIMIT 1 "
                                                  0.0004120: Could not process query, error #1054: Unknown column 'modResource.id' in 'where clause'
                                                  0.0074599: Total time
                                                  4 194 304: Memory usage
                                                    Александр
                                                    08 октября 2020, 11:25
                                                    +1
                                                    в table.class и table.pdoTools.class поставте msProduct
                                                      R2m0x94 (Vasily)
                                                      08 октября 2020, 11:38
                                                      0
                                                      Верно. Но, что делать с редактором?
                                              R2m0x94 (Vasily)
                                              08 октября 2020, 10:46
                                              0
                                              В конфиге edit поля таблицы прописать 'editor'=>'ace':
                                              Обновил версию, но редактор так и не подключился
                                                Александр
                                                08 октября 2020, 11:26
                                                0
                                                ctrl f5 делали? и редактор только в модалке при редактировании. yadi.sk/i/Vf4qQw0XBt0Vew
                                                  R2m0x94 (Vasily)
                                                  08 октября 2020, 13:37
                                                  0
                                                  Да в модульном есть, но модульное не использую, так как и так в quickview таблица в модульном выводится. И надо в таблице прикрутить редактор. Прикрутить, то получается, вот только загвоздка при авто сохранении не понимаю ничего не происходит, а когда из textarea убираю атрибут data-editor=«xml», то редактор слитает и авто сохранение происходит.

                                                  Если добавить класс к textarea[data-editor] в assets/components/gettables/js/gettables.js
                                                  $('.ace_text-input').addClass('get-table-autosave');
                                                  То вообще row не выводится
                                                    Александр
                                                    08 октября 2020, 20:57
                                                    0
                                                    что-то вроде этого воткните
                                                    editor.on("change", function() {
                                                        textarea.val(editor.getSession().getValue());
                                                        //textarea.trigger('change');
                                                    })
                                                      Александр
                                                      09 октября 2020, 21:21
                                                      0
                                                      помогло editor.on(«change»?
                                                        R2m0x94 (Vasily)
                                                        10 октября 2020, 01:10
                                                        0
                                                        Ещё не пробовал, попробую отпишусь. Кстати существует атрибут content=editable на саму таблицу, которую вывожу, через mFilter2. Люди говорят, что можно через процессор сохранять по ajax, следовательно вариант проще есть, просто надо вещать на элемент и сохранить будет возможно, правда, вот как через процессор это сделать с ajax пока не вникал, но через форму на php по sql запросу получается отредактировать таблицу (без процессора modx, пока тестирую). GetTables слишком трудно даётся, да и к тому же ещё не успел спросить про фильтр, так и не дошел до него, а про getTabs, тоже не вникнул почему у меня нет вкладок, как их туда прописать.

                                                        По сути мне всего то надо в уже имеющейся таблице, которую вывожу на mFilter2 — сделать ячейку или поле +price доступным для быстрого редактирования (событие doubleClick например), так как цены часто меняются и всё, вот думаю если товаров больше 100k как это сделать? И я понимаю, что это реально сделать, но с процессором MODX ещё не доводилось иметь дело, думаю вскором проработать этот вопрос, если есть решение буду очень благодарен
                                                          Александр
                                                          10 октября 2020, 03:31
                                                          0
                                                          Кстати существует атрибут content=editable на саму таблицу, которую вывожу, через mFilter2.
                                                          Первый раз такое слышу.
                                                          если товаров больше 100k
                                                          Возможно 100k проще редактировать через excel и потом только выгружать в модкс. Но вот чтобы менеджеры сами 100k товаров редактировали я с таким не сталкивался. Обычно есть прайсы поставщиков и берем их цены умножаем на коофициент и загружаем. У вас не прайсы? Именно вручную 100k товаров редактировать надо?
                                                            R2m0x94 (Vasily)
                                                            10 октября 2020, 11:42
                                                            0
                                                            Ну не на всю продукцию править надо цены, а на некую часть. Да на счёт умножения я знаю как сделать, и к тому же msPre решает эту проблему, но вопрос в другом, про фронтенд
                                                            Александр
                                                            10 октября 2020, 04:10
                                                            1
                                                            +1
                                                            А вообще можно примерно так сделать простой редактор поля price
                                                            в чанке вывода результатов mfilter2 для поля price пишем:
                                                            <input type="number" class="autosave" data-product_id="[[+id]]" value="[[+price]]"/>
                                                            На страницу или в отдельный файл пишем скрипт
                                                            <script>
                                                            $(function() {
                                                                $(document).on('change','.autosave',function(){
                                                                    $.post( "/assets/components/autosave/action.php", 
                                                                    { product_id: $(this).data('product_id'), value: $(this).val() })
                                                                      .done(function( data ) {
                                                                        alert( "Data Loaded: " + data );
                                                                      });
                                                                });
                                                            });
                                                            </script>
                                                            Создаем файл /assets/components/autosave/action.php
                                                            <?php
                                                            define('MODX_API_MODE', true);
                                                            require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';
                                                            
                                                            $modx->getService('error', 'error.modError');
                                                            $modx->setLogLevel(modX::LOG_LEVEL_ERROR);
                                                            $modx->setLogTarget('FILE');
                                                            
                                                            if (!$modx->user->hasSessionContext('mgr')){
                                                                echo 'Access denied';
                                                                exit;
                                                            }
                                                            
                                                            if((int)$_POST['product_id'] > 0){
                                                                if($product = $modx->getObject('msProduct',(int)$_POST['product_id']){
                                                                    $product->set('price', $_POST['price']);
                                                                    if($product->save()) echo 'success';
                                                                }
                                                            }
                                                              R2m0x94 (Vasily)
                                                              10 октября 2020, 12:49
                                                              0
                                                              Спасибо, попробовал. /assets/components/autosave/action.php отдаёт 500 ошибку при смене цены и не сохраняет
                                                                Александр
                                                                10 октября 2020, 22:58
                                                                +1
                                                                Я не проверял код. Счас посмотрел здесь скобочку забыл
                                                                if($product = $modx->getObject('msProduct',(int)$_POST['product_id']){
                                                                надо
                                                                if($product = $modx->getObject('msProduct',(int)$_POST['product_id'])){
                                                                Проверяйте!
                                                                В начале /assets/components/autosave/action.php напишите
                                                                error_reporting(E_ALL);
                                                                ini_set('display_errors', 1);
                                                                чтоб ошибки показывал
                                                                  R2m0x94 (Vasily)
                                                                  10 октября 2020, 23:26
                                                                  0
                                                                  Спасибо, поправил, но сохранения не происходит, консоль пустой, data пустая, ошибок нет, единственное, что пишет консоль — предупреждение
                                                                  [Violation] 'load' handler took 1776ms
                                                                  И alert вылетает
                                                                  Data Loaded:
                                                                    Александр
                                                                    10 октября 2020, 23:34
                                                                    +1
                                                                    А что в пост параметры отправляется?
                                                                    Пустой ответ это либо (int)$_POST['product_id'] == 0
                                                                    Либо продукт не найден.
                                                                    R2m0x94 (Vasily)
                                                                    10 октября 2020, 23:44
                                                                    0
                                                                    <script>
                                                                    $(document).on('change','.autosave',function(){ 
                                                                        $.post('assets/components/autosave/action.php', 
                                                                        { product_id: $(this).data('product_id'), value: $(this).val() })
                                                                          .done(function(data) { 
                                                                            alert("Data Loaded: " + data);
                                                                            console.log($.post);
                                                                          });
                                                                    });
                                                                    </script>
                                                                    В пост отправляется
                                                                    ƒ (a,c,d,e){return n.isFunction©&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}
                                                                    Александр
                                                                    10 октября 2020, 23:52
                                                                    +1
                                                                    что-то ты меня озадачил… ты то смотришь?
                                                                    даже код проверил. У меня вот пост yadi.sk/i/BXVEFzq5aFPfpQ
                                                                    Александр
                                                                    10 октября 2020, 23:56
                                                                    +1
                                                                    Кстати еще ошибочка
                                                                    <script>
                                                                    $(document).on('change','.autosave',function(){ 
                                                                        $.post('assets/components/autosave/action.php', 
                                                                        { product_id: $(this).data('product_id'), price: $(this).val() })
                                                                          .done(function(data) { 
                                                                            alert("Data Loaded: " + data);
                                                                            console.log($.post);
                                                                          });
                                                                    });
                                                                    </script>
                                                                    вместо price value почемуто поставил.
                                                                    R2m0x94 (Vasily)
                                                                    11 октября 2020, 00:16
                                                                    0
                                                                    Работает, спасибо :)
                                                                    У меня кэшировался mFilter2, от туда и непонятки были, но в уведомление data всё ровно не пишется :(
                                                                    Александр
                                                                    11 октября 2020, 00:21
                                                                    +1
                                                                    success должно написать. Разбираться надо почему не пишется.
                                                                    Но я тебе основы подсказал. Дальнейший обвес сам сделаешь. Ок?
                                                                    R2m0x94 (Vasily)
                                                                    11 октября 2020, 00:26
                                                                    0
                                                                    Ok :)
                                                                    R2m0x94 (Vasily)
                                                                    11 октября 2020, 01:14
                                                                    0
                                                                    Возможно success не пишется из-за версии jQuery 3.4.1.., а на закуску рабочий вариант, правда с перезагрузкой :/
                                                                    <script>
                                                                    // Пришлось делать перезагрузку стр.
                                                                    $(document).on('change','.autosave', function(){ 
                                                                        //$.post('assets/components/autosave/action.php', { product_id: $(this).data('product_id'), price: $(this).val()}).done(function(data) { 
                                                                        //    alert("Data Loaded: " + data);
                                                                        //});
                                                                        $.ajax({  
                                                                            type: "POST",  
                                                                            url: 'assets/components/autosave/action.php', 
                                                                            data: { product_id: $(this).data('product_id'), price: $(this).val()},
                                                                            success:  function(data) { 
                                                                                if (!data){
                                                                                    miniShop2.Message.success('Успешно обновлена!' + data)
                                                                                    location.reload(true);
                                                                                    //setInterval('location.reload()', 444);
                                                                                } else{
                                                                                    miniShop2.Message.error('Что-то пошло не так, попробуйте позже!');
                                                                                    console.log($.post);
                                                                                    console.log(data);
                                                                                }
                                                                            } 
                                                                        }); 
                                                                    });
                                                                    
                                                                    </script>
                                                                    В чанке вывода mFilter2
                                                                    <input type="number" name="price" class="autosave" data-product_id="{$id}" value="{$price | replace : ' ' : ''}"/>
                                                                    А в action.php
                                                                    <?php
                                                                    error_reporting(E_ALL);
                                                                    ini_set('display_errors', 1);
                                                                    
                                                                    define('MODX_API_MODE', true);
                                                                    //require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';
                                                                    
                                                                    /** @noinspection PhpIncludeInspection */
                                                                    require dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';
                                                                    
                                                                    
                                                                    $modx->getService('error', 'error.modError');
                                                                    $modx->setLogLevel(modX::LOG_LEVEL_ERROR);
                                                                    $modx->setLogTarget('FILE');
                                                                    
                                                                    if (!$modx->user->hasSessionContext('mgr')){
                                                                        echo 'Access denied';
                                                                        exit;
                                                                    }
                                                                    
                                                                    if((int)$_POST['product_id'] > 0){
                                                                        if($product = $modx->getObject('msProduct',(int)$_POST['product_id'])){
                                                                            $product->set('price',$_POST['price']);
                                                                            $product->save();
                                                                        }
                                                                    }
                                                                    Александр
                                                                    11 октября 2020, 01:28
                                                                    0
                                                                    А зачем перезагрузка-то если цена успешно обновлена то в поле и так актуальные данные же
                                                                    R2m0x94 (Vasily)
                                                                    11 октября 2020, 01:37
                                                                    0
                                                                    На фронте цена без success не обновляется, поэтому перезагрузка, пока как решить не знаю
                                                                    Александр
                                                                    11 октября 2020, 01:45
                                                                    +1
                                                                    Это где не обновляется? В <input type=«number» name=«price» class=«autosave» data-product_id="{$id}" value="{$price | replace: ' ': ''}"/> она должна остаться такая какая введена. В другом месте можно скриптом обновлять.
                                                                    И причем тут success?
                                                                    Александр
                                                                    11 октября 2020, 01:52
                                                                    +1
                                                                    И вообще в $.ajax лучше добавить dataType: «json», а в action.php писать ответы скрипта так:
                                                                    $message = 'Access denied action.php';
                                                                        echo json_encode(
                                                                                ['success' => false,
                                                                                'message' => $message,]
                                                                                );
                                                                        return;
                                                R2m0x94 (Vasily)
                                                08 октября 2020, 09:21
                                                0
                                                Можно же выборку сделать через pdoPage с элементом getTable, без pdoTools параметров, или ошибаюсь?

                                                Ещё заметил, что при GetTableFetch в quickview, что некоторые id дублируются аж по 8 штук,
                                                  Александр
                                                  08 октября 2020, 10:00
                                                  +1
                                                  Можно же выборку сделать через pdoPage с элементом getTable, без pdoTools параметров, или ошибаюсь?
                                                  нельзя! данные в таблицу только pdoTools дает. без pdoTools параметров ничего нельзя.
                                                  Ещё заметил, что при GetTableFetch в quickview, что некоторые id дублируются аж по 8 штук,
                                                  Наверно в pdoTools к 1 id leftJoin нескольких строк есть
                                                  в GetTableFetch Замени строку $log .= $response['log']; на
                                                  $log = '<pre class="getTablesLog" style="width:900px;">' . print_r($getTables->pdoTools->getTime(), 1) . '</pre>';
                                                  и посмотри sql запрос, что pdoTools сформировал.
                                                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                                  97