Как в админке с помощью ExtJS отследить изменение значения TV и поменять его сразу или перезагрузкой стараницы?

Есть плагин изменения значения tv при определенных условиях.

if ($modx->event->name == 'OnDocFormSave' && $mode != 'new') {
//куча условий
//.......

// меняем значение TV
$resource->setTVValue('my_tv', 'Новое значение');

//...
}


//перезагружает страницу в админке при каждом сохранении ресурса
//НЕ пойму как сделать, чтобы перезагружалось только при изменении значения TV
if ($modx->event->name == 'OnDocFormPrerender' && $mode != 'new') {
	
	$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(){			
				//Перезагрузка страницу после сохранения
		        location.reload();
		    });
		   
		});
    </script>');	
}
Данная конструкция перезагружает страницу в админке при каждом сохранении ресурса, НЕ пойму как сделать, чтобы перезагружалась только при изменении значения TV… Не могу передать значение переменной из кода на событие OnDocFormSave в код на событие OnDocFormPrerender, представляется, что это невозможно...

Пробовал так, при изменении значения TV присваивать переменной значение true ($a=true;) и передать значение переменной в код с событием OnDocFormPrerender для проверки, но ничего не выходит.

Нужно чтобы при изменении значения определенного tv поля в плагине на событие 'OnDocFormSave' значение tv сразу менялось в инпуте в админке.
А то получается, что значение поля изменено, а в инпуте этого TV поля остается старое значение. И получается, что так до бесконечности можно изменять, а значение в инпут будет старое, и при сохранении ресурса будет опять меняться в базе, а в инпут оставаться старое… пока не перезагрузишь страницу Ctrl+F5

Подскажите как правильно реализовать сию задумку?

Заранее. благодарю!
Дмитрий
31 января 2020, 00:44
modx.pro
2
1 144
0

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

Юрий
01 февраля 2020, 13:24
0
А разве событие OnDocFormPrerender не раньше срабатывает?
    Дмитрий
    02 февраля 2020, 00:26
    0
    Раньше, запускается до загрузки формы редактирования ресурса в менеджере и регистрируется ExtJS.
      Юрий
      02 февраля 2020, 14:04
      0
      Тогда не понятна логика
      Не могу передать значение переменной из кода на событие OnDocFormSave в код на событие OnDocFormPrerender
      Как можно передать из кода, который выполняется позже в код, который выполняется раньше?
        Дмитрий
        02 февраля 2020, 15:31
        0
        Это я в качестве примера указал, а так видимо отслеживать изменение полей надо на ExtJS, но документации по MODX ExtJS нет, как и примеров.
    Дмитрий
    02 февраля 2020, 16:21
    0
    Поменял заголовок вопроса, кто знаком с MODX ExtJS, прошу помочь!
    Как в админке с помощью ExtJS отследить изменение значения TV и поменять его сразу или перезагрузкой стараницы?
      Руслан Сафин
      02 февраля 2020, 17:40
      0
      Повесь отдельный js на инпут и отслеживай изменение, а дальше по обстоятельствам… либо меняй значение, либо перезагружай страницу.
      По ExtJs куча документация на офф сайте docs.sencha.com/extjs/3.4.0/
        Дмитрий
        02 февраля 2020, 18:17
        0
        Повесь отдельный js на инпут и отслеживай изменение, а дальше по обстоятельствам… либо меняй значение, либо перезагружай страницу.
        Сомневаюсь, что обычным js это получится, так как сами изменения происходят не в инпут, а в базе (как я понимаю). А в инпуте происходят изменения как раз после перезагрузки страницы.

        По ExtJs куча документация на офф сайте docs.sencha.com/extjs/3.4.0/
        Да офф документация есть, но документации именно по MODX ExtJs нет. И как применить это все к MODX никак не могу разобраться.
          Руслан Сафин
          02 февраля 2020, 18:36
          0
          Если нужно изменить TV во время сохранения (в базе), думаю это событие подойдет OnDocFormSave. По событиям гуглится на ура, например pitrooo.ru/note/modx-plaginyi-i-sobyitiya-dlya-nix-(events).html

          Если нужно на лету подменять значение, то js в помощь
            Дмитрий
            02 февраля 2020, 19:03
            0
            Если нужно изменить TV во время сохранения (в базе), думаю это событие подойдет OnDocFormSave. По событиям гуглится на ура, например pitrooo.ru/note/modx-plaginyi-i-sobyitiya-dlya-nix-(events).html
            Так у меня так и меняется, но изменение в админке не видно, значение TV в инпут изменяется только после перезагрузки страницы. Если страницу не перезагружать, то в инпут значение не меняется. Как в этом случае воспользоваться событием js или jquery на изменение.

            Например
            $("#tv10").on("input",function() {
              console.log($("#tv10").val());
            });
            будет отслеживать в реальном времени при вводе в инпут, но никак не будет отслеживать изменение значения в базе.

            Если нужно на лету подменять значение, то js в помощь
            можно пример. применительно к поставленной задаче…
              Руслан Сафин
              02 февраля 2020, 19:08
              0
              $("#tv10").on(«input»,function() {
              console.log($("#tv10").val());
              });

              вместо консоль лога, делай запрос на самописный контроллер и проверяй то что нужно изменить, очень извращенный вариант)))

              лучше напиши задачу полностью, может есть более элегантное решение
                Дмитрий
                02 февраля 2020, 19:31
                0
                вместо консоль лога, делай запрос на самописный контроллер и проверяй то что нужно изменить, очень извращенный вариант)))
                так это будет меняться только при ручном вводе в инпут

                лучше напиши задачу полностью, может есть более элегантное решение
                Нужно чтобы при изменении значения определенного tv поля в плагине на событие 'OnDocFormSave' значение tv сразу менялось в инпуте в админке.
                А то получается, что значение поля изменено, а в инпуте этого TV поля остается старое значение. И получается. что так до бесконечности можно изменять, а значение в инпут будет старое, пока не перезагрузишь страницу Ctrl+F5
        Юрий
        02 февраля 2020, 17:54
        0
        А попробуйте в скрипте вместо события beforeSubmit
        поставить submit
          Дмитрий
          02 февраля 2020, 18:18
          0
          А попробуйте в скрипте вместо события beforeSubmit
          поставить submit
          Это ничего не даст.
        Дмитрий
        03 февраля 2020, 20:51
        0
        Неужели в MODX ExtJS все настолько запутано, и никто в нем не разбирается, что уже 3 суток знающих не находится?
          Николай
          04 февраля 2020, 00:20
          +1
          Пример кода, вводишь что-то в одной TV, это значение автоматом в другую дублируется:

          Ext.onReady(function () {
              let tv1 = Ext.get('tv17');
              // console.log(tv1);
          
              tv1.on('keyup', function() {
                  let tv2 = Ext.get('tv18');
                  // console.log(tv2);
                  tv2.dom.value = this.dom.value;        
              });
          });

          Другие события можно тут подсмотреть — docs.sencha.com/extjs/3.4.0/#!/api/Ext.form.TextField
            Дмитрий
            04 февраля 2020, 19:13
            0
            Благодарю, но немного не то.
            Задача отловить изменение значения TV при сохранении ресурса и передать новое значение скрипту, а не отлавливать ввод с клавиатуры в одно поле с тем чтобы значение менялось в другом
          Дмитрий
          04 февраля 2020, 19:12
          1
          0
          Пока получилось добиться следующего.
          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(){			
          			// Меняем зачение TV поля			
          			Ext.get("tv45").dom.value = "'.$resource->getTVValue(6).'";			
          			});		    
          		});
              </script>');
              break;
          }

          Значение поля меняется сразу после сохранения без перезагрузки страницы. Вставляется сразу значение и оно видно в поле, исключение TV поле типа image, так как в image вставляется вначале в скрытое поле (как сделать чтобы в TV типа image значение сразу было видно в поле, пока не понял).

          Значение вставляется, однако это значение получено из базы до изменения (то есть старое значение), поскольку событие «OnDocFormPrerender» происходит до загрузки формы редактирования ресурса в менеджере и скрипт регистрируется со старым значением.

          Проблемы (задачи/вопросы).
          1. Как отловить изменение значения при сохранении ресурса и передать новое значение скрипту, не могу понять. Ведь как-то, думаю, на ExtJS можно отловить это событие (изменение значения при сохранении ресурса «OnDocFormSave») и передать уже зарегистрированному скрипту???

          2. Как сделать, чтобы в TV поле типа image вставляемое скриптом значение сразу становилось видимым?

          А пока данный кодом можно воспользоваться (может кому пригодиться), если нужно вставить при сохранении ресурса значение из одного TV поля в другое, при этом значение сразу видно в админке и сохраняется в базе.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            17