К содержанию

Есть ли события на "Быстро создать" и "Быстро обновить"?

Здравия!

Подскажите, есть ли такие события в плагинах, которые сработают перед открытием модального окна «Быстро создать ресурс» и «Быстро обновить ресурс»? Или можно ли как-то повесить на эти действия свой код?
Павел Гвоздь
Павел Гвоздь
29 октября 2015, 11:40
modx.pro
2 068
Поблагодарить автора Отправить деньги
Реклама

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

Іван Клімчук
Іван Клімчук Администратор
29 октября 2015, 16:25
Если речь о системных событиях MODX, то нет. Так как это просто клиентский код, который показывает виджет окна, не загружая сам ресурс как страницу. Понятно, что данные при редактировании подтягиваются (через процессор), но события как такового нет. Что касается перехватить, то в теории можно написать скрипт на ExtJS, который подключить через плагин (событие загрузки админки) и который перехватит вызов окна и сделает свое черное дело. Но нужно уже конкретнее описывать задачу.
    Павел Гвоздь
    Павел Гвоздь Эксперт
    29 октября 2015, 18:38
    Спасибо. Я понял куда копать.
    Сергей Шлоков
    Сергей Шлоков Эксперт
    29 октября 2015, 19:38
    Правильно Иван пишет. Нужно перехватывать через javascript. Самый просто вариант, переопределить эти функции дерева. Создаешь js файл.
    Ext.onReady(function () {
       var tree = Ext.getCmp('modx-tree-resource');
      // Это стандартная функция из файла modx.tree.resource.js
       tree.quickUpdate = function(itm,e,cls){
       MODx.Ajax.request({
                url: MODx.config.connector_url
                ,params: {
                    action: 'resource/get'
                    ,id: this.cm.activeNode.attributes.pk
                }
                ,listeners: {
                    'success': {fn:function® {
                        var pr = r.object;
                        pr.class_key = cls;
    
                        var w = MODx.load({
                            xtype: 'modx-window-quick-update-modResource'
                            ,record: pr
                            ,listeners: {
                                'success':{fn:function® {
                                    this.refreshNode(this.cm.activeNode.id);
                                    var newTitle = '<span dir="ltr">' + r.f.findField('pagetitle').getValue() + ' (' + w.record.id + ')</span>';
                                    w.setTitle(w.title.replace(/<span.*\/span>/, newTitle));
                                },scope:this}
                                ,'hide':{fn:function() {this.destroy();}}
                            }
                        });
                        w.title += ': <span dir="ltr">' + w.record.pagetitle + ' ('+ w.record.id + ')</span>';
                        w.setValues(r.object);
                        w.show(e.target,function() {
                            Ext.isSafari ? w.setPosition(null,30) : w.center();
                        },this);
                    },scope:this}
                }
            });
    }
    Подключаешь его в плагине на событие OnManagerPageBeforeRender. Тут же и быстрое создание переопределить.
    Добавляй сюда нужный код. Например, можно переопределить процессор на свой и там делай что надо. Все зависит от задачи.
      Павел Гвоздь
      Павел Гвоздь Эксперт
      30 октября 2015, 07:05
      Большое спасибо, Сергей! Это очень полезный кусок кода для меня!

      Я обратил внимание, что ты в ExtJS хорошо разбираешься, не хотел бы ты написать какое-нибудь руководство? Пусть даже оно будет платным, я думаю многие заинтересуются. Я в их числе, определённо!
        Сергей Шлоков
        Сергей Шлоков Эксперт
        30 октября 2015, 09:41
        Лучше, конечно скопировать оригинал, потому что тут Jevix хулиганит — вместо function( r ) пишет function®.
        По поводу курсов… Я начал разбирать ExtJs летом. Мой уровень — уверенный новичек. Что я могу предложить? Только базис и только для начинающих.
      Fi1osof
      Fi1osof Эксперт
      30 октября 2015, 09:55
      И все же, какова задача стоит? Запросы на «Быстро обновить» и «Быстро создать» обрабатывают те же самые процессоры, что и на «не быстрые» действия. То есть там те же самые события OnBeforeDocFormSave и OnDocFormSave. Другое дело, что там данных в запросе на сервер меньше отправляется, ибо форма сама меньше, и не содержит данных ТВшек, но, опять-таки, в зависимости от задачи вполне может быть, что ее можно решить на базе плагина. В любом случае, говорить о том, что никакие события не срабатывают — не совсем корректно. И навешивать событие на дерево тоже может оказаться не комильфо, так как если данные нужно обрабаывать не только на уровне быстрого редактирования, то придется вклиниваться во все возможные редакторы документов, а это уже совсем не круто.
        Павел Гвоздь
        Павел Гвоздь Эксперт
        30 октября 2015, 10:09
        Задача сделать так, чтобы шаблон для новых документов конкретного родителя ставился по-умолчанию не только на странице создания ресурса, а также и в модальном окне быстрого создания ресурса. То бишь в компоненте Collections есть возможность для новых документов определённой коллекции поставить шаблон по-умолчанию, однако для документов, создаваемых через модальное окно быстрого создания он не ставится.
          Воеводский Михаил
          Воеводский Михаил Проверенный
          30 октября 2015, 10:34
          Может, пойти иным путем? Пускай создается документ с любым шаблоном, а плагином на событие OnBeforeDocFormSave ставить правильный шаблон в зависимости от родителя.
            Павел Гвоздь
            Павел Гвоздь Эксперт
            30 октября 2015, 10:36
            Я думал над этим. Однако в таком случае у нас исключается возможность переназначить шаблон при создании.
              Воеводский Михаил
              Воеводский Михаил Проверенный
              30 октября 2015, 10:50
              Тоже верно. Причем, принудительная смена щаблона будет работать и для полной формы редактирования.
              Если целесообразно заморачиваться с плясками вокруг Ext.JS — это решение.
            Fi1osof
            Fi1osof Эксперт
            30 октября 2015, 10:52
            К сожалению, да, здесь без JS вряд ли обойтись будет. MODx (именно MODx, то есть JS-объект, и его составляющие) не смотрит на данные, пришедшие от сервера (точнее при открытии создания документа он в принципе не запрашивает его данные, а просто создает окно), он просто использует настройки контекста, получаемые от корневой ноды-контекста. В методе getContextSettingForNode он никак не смотрит на данные самой ноды документа. Это, конечно, печально. Было бы круче, если бы он запрашивал данные для нового документа с сервера, передавая туда id родителя как минимум.
              Сергей Шлоков
              Сергей Шлоков Эксперт
              30 октября 2015, 12:53
              Не знаю, зачем Николай наводит ужас — … не комильфо… вклиниваться в редакторы… В случае именно быстрого создания ресурса все очень просто. Действительно, как писал Николай, MODx не запрашивает данные с сервера, а просто открывает окно. Всего то нужно это поправить — вызывай окно в ajax запросе (как в случае быстрого редактирования), который вернет нужный шаблон из твоего процессора. Вот и все. Причем здесь редакторы, не понимаю. Надо к Николаю на курсы записаться, что-ли. :)
              Или второй вариант. Сохраняй шаблон в javascript переменной при загрузке дерева, используя плагин. А потом в своей функции (пример которой я давал выше) просто зачитывай эту переменную. Так можно обойтись без процессора и ajax.
                Fi1osof
                Fi1osof Эксперт
                30 октября 2015, 18:18
                наводит ужас — … не комильфо… вклиниваться в редакторы…
                Еще раз: зависит от ситуации. Демонстрацию некомильфо мы видим в принципе, изначально. Иначе бы не было этого топика здесь в принципе. Разжовываю: сейчас у нас есть полный редактор документов и есть «быстрый» модельный редактор. И вот для полного редактора свои механизмы используются, в том числе позволяющие задать шаблон по умолчанию, а в модальном редакторе другие механизмы. Если бы механизм использователся единый (хотя бы единый процессор подгрузки конфигов по умолчанию), то измененные шаблоны по умолчанию появились бы и там, и там.
                Так вот, вызвать модальное окно можно не только из меню дерева ресурсов, но и в других модулях, к примеру. Поэтому, если бы задача решалась на уровне плагина в момент сохранения, то лучше было бы сделать это именно на уровне плагина, как это уже предлагалось выше. В таком случае даже вызов $modx->runProcessor('resource/create', $data); не обошел бы кастомный функционал. Но в нашем случае, к сожалению, это не годится.
                  Сергей Шлоков
                  Сергей Шлоков Эксперт
                  30 октября 2015, 18:43
                  Так вот, вызвать модальное окно можно не только из меню дерева ресурсов, но и в других модулях, к примеру.
                  И где еще оно используется? Мне кажется им даже в дереве редко кто пользуется, не то что где-то еще. Поэтому оно такое ущербное и не завязано на общий механизм.
                  А в предложенном выше хаке я предлагаю менять не само окно, а метод дерева, которое вызывает окно. Так что это изменение никак не повлияет на возможность вызова этого окна где-то ещё и ничего не поломает.
                    Fi1osof
                    Fi1osof Эксперт
                    30 октября 2015, 20:48
                    Именно, не повлияет. И все, что будет сделано для этого модального окна, никак не отразится на основном редакторе. На самом деле совсем не хочется долго это мусолить. Пусть каждый останется при своем мнении. Я останусь.

                    И где еще оно используется?
                    Не обязательно используется, но может, в том же табличном редакторе. Ничего не стоит вызвать окно редактора, а и обязательно через события дерева.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            15