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

Здравия!

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

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

Іван Клімчук
29 октября 2015, 16:25
+1
Если речь о системных событиях MODX, то нет. Так как это просто клиентский код, который показывает виджет окна, не загружая сам ресурс как страницу. Понятно, что данные при редактировании подтягиваются (через процессор), но события как такового нет. Что касается перехватить, то в теории можно написать скрипт на ExtJS, который подключить через плагин (событие загрузки админки) и который перехватит вызов окна и сделает свое черное дело. Но нужно уже конкретнее описывать задачу.
Сергей Шлоков
29 октября 2015, 19:38
1
+2
Правильно Иван пишет. Нужно перехватывать через 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
    0
    Большое спасибо, Сергей! Это очень полезный кусок кода для меня!

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

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