Перезагрузить страницу при сохр. ресурса в админке

Добрый день!

Подскажите, как можно перезагрузить страницу при сохранении ее в админке, также как это происходит при первом сохранении ресурса.

Т.е. при первом сохранении ресурса MODx перегружает страницу, а при последующих — только лишь отправляет ajax запрос на ее обновление. Вот тут мне и нужно при определенных условиях заставить MODx перезагрузить страницу, так как я в плагине в этот момент изменяю поля ресурса и эти изменения не видны.
Алексей
11 апреля 2013, 10:55
modx.pro
2
3 652
0

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

Василий Наумкин
11 апреля 2013, 16:41
0
Только разбираться с ExtJS и подгружать свой скрипт при загрузке страницы.

Ну а свой скрипт должен вклиниваться в скрипт страницы и перехватывать обработчик сохранения.

Нетривиальная задача, в общем.
    Алексей
    11 апреля 2013, 16:54
    0
    Осталось разобраться с ExtJs.

    В принципе у меня custom tv, и в html код я могу написать любой скрипт.

    Перезагрузить страницу я могу так:
    MODx.loadPage('index.php?bla-bla-bla);
    И это действие должно висеть на событии, возникающем после сохранения ресурса. Это мне сейчас не под силу =) Не писал на extjs ничего.
      Василий Наумкин
      11 апреля 2013, 17:11
      0
      Тут в этом и прикол, что надо найти и перезаписать функцию обработки ответа в форме ресурса.

      Если ничего не путаю — вот это место, которое надо изменить плагином.

      То есть, надо по Ext.onReady() делать перезапись MODx.panel.Resource.success() — но я так не пробовал, наверняка будут разные грабли.

      Разбираться дальше, извини, некогда.
    Серьёзный
    20 января 2016, 00:11
    0
    Вопрос автора актуален и для меня.
    Может быть уже нашлось решение?
      Наумов Алексей
      20 января 2016, 09:02
      0
      Неа, мне оно не известно…
        Adorazel
        02 апреля 2016, 11:49
        1
        0
        Нашел вот такое решение

        <?php
        $modx->regClientStartupHTMLBlock('
            <script type="text/javascript">
                    Ext.override(MODx.panel.Resource, {
                        originalSuccess: MODx.panel.Resource.prototype.success
                        ,success: function(o) {
                            this.originalSuccess(o);
                            var tv = Ext.get("tv1").dom.value;
                            if (tv && tv == "1") {
                                MODx.loadPage(location.href);
                            }
                        }
                    });
            </script>    
        ');


        Но у меня не получилось повесить этот код на событие OnDocFormSave. Плагин запускается, но скрипт не выполняется.

        Есть подозрения, что скрипт не регистрируется
          Сергей Шлоков
          02 апреля 2016, 13:14
          1
          0
          Ну и наворочено. Не уверен, что пример рабочий. Вот простейший рабочий вариант с примером изменения поля
          <?php
          switch ($modx->event->name) {
              case 'OnDocFormPrerender':
                  $modx->controller->addHTML('
          	<script type="text/javascript">
          		Ext.ComponentMgr.onAvailable("modx-panel-resource", function (e) {
          		    var res = Ext.getCmp("modx-panel-resource");
          		    res.on("beforeSubmit", function(){
          			// Меняем зачение поля longtitle
          		        Ext.getCmp("modx-resource-longtitle").setValue("Новое значение");
          		    });
          		    res.on("success", function(){ 
          		        // Перезагрузка страницы после сохранения
          		        location.reload();
          		    });
          		});
              </script>');
              break;
          }
            Adorazel
            02 апреля 2016, 13:26
            0
            Не-не-не.

            Лично меня интересует изменение значение твшки на событие OnDocFormSave.
            Значение-то изменяется, но вот юзер этого после сохранения не видит.
            В принципе, я бы мог на это забить, но измененное значение должно блокировать повторный запуск плагина. А если юзер не перезагрузит страницу после сохранения, то он сможет сколько угодно раз запустить плагин, ведь он будет каждый раз посылать старое значение твшки
              Воеводский Михаил
              02 апреля 2016, 13:54
              0
              Тогда производи изменение на событии OnBeforeDocFormSave.
                Воеводский Михаил
                02 апреля 2016, 14:40
                0
                Принцип таков: если необходимо только изменить значение, то простой плагин на OnBeforeDocFormSave. Если изменить значение после сохранения, то плагин на 2 события:
                1. OnDocFormSave для фактического изменения значения
                2. OnManagerPageBeforeRender для встраивания скрипта на страницу в админке.

                Сергей, подскажи, пжл, второе событие я правильно указал?
                  Сергей Шлоков
                  03 апреля 2016, 10:12
                  0
                  Не успел, ниже уже ответили.
                  Событие OnManagerPageBeforeRender будет регистрировать скрипт для любого объекта (ресурса, чанка, сниппета), а нужно только для ресурса. Тут подойдет событие OnDocFormPrerender.
                  В примере моего плагина 2 javacript события — beforeSubmit и success. Если задействовать первое, то второе не нужно. Потому что, во-первых, изменения уже видны в интерфейсе (обновлять страницу не нужно) и, во-вторых, новые значения запишутся в базу (не надо их ловить в OnDocFormSave). Для знатоков яваскрипт не составит труда обработать и ТВшки. Этот вариант более интерактивный.
                  Ну а если таких знаний не хватает, то подойдет вариант ниже — в OnDocFormSave (можно в OnBeforeDocFormSave) меняются значения ТВ, а в яваскрипте, подключенным в OnDocFormPrerender, обновляется страница. Этот вариант проще.
                Илья Уткин
                02 апреля 2016, 23:29
                0
                Во время OnDocFormSave страница редактирования уже сформирована и отдана пользователю, кроме того, он ей уже воспользовался. Вставить скрипт на сформированную страницу не получится.

                Так что надо использовать OnDocFormPrerender и уже самом JS скрипте переопределять функции, которые отвечают за обработку ответа сервера.
                  Adorazel
                  03 апреля 2016, 09:51
                  0
                  Сделал, как посоветовал Илья. Повесил регистрацию js на OnDocFormPrerender
                  А все остальное – на OnDocFormSave

                  И получилось! Страница перезагружается после срабатывания плагина.
                    Сергей Шлоков
                    03 апреля 2016, 10:16
                    0
                    Сделал, как посоветовал Илья. Повесил регистрацию js на OnDocFormPrerender
                    А разве в плагине в третье строчке не это событие указано?
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          14