Как изменять и выводить TV поле при каждом обновлении страницы?

Приветствую

Бьюсь вторые сутки, столкнулся с неизвестным для себя — не получается обработать значение TV поля при обновлении страницы (получить > изменить > вывести обновленные данные). Подскажите пожалуйста, как настроить корректно.

Что имеем? — Есть дополнительное поле и его при каждом обновлении страницы надо менять. Приведу пример.

1. Два поля: num_tv (числовое) и text_tv (текстовое).

2. Есть плагин:
switch ($modx->event->name) {
    case 'OnLoadWebDocument':
        
        // получаем значения полей
        $num_tv = $modx->resource->getTVValue('num_tv');
        $text_tv = $modx->resource->getTVValue('text_tv');
       
        // меняем значения полей
        $num_tv += 5;
        $text_tv .= 'abc';
        
        // устанавливаем значения полей
        $modx->resource->setTVValue('num_tv', $num_tv);
        $modx->resource->setTVValue('text_tv', $text_tv);
       
        break;
}

3. Есть сниппет («update_page_snippet»):
// получаем значение полей
$num_tv = $modx->resource->getTVValue('num_tv');
$text_tv = $modx->resource->getTVValue('text_tv');

// выводим значение полей      
echo '<p>NUM_TV: '.$num_tv.'</p>';
echo '<p>TEXT_TV: '.$text_tv.'</p>';

4. Сниппет вывожу в шаблон:
[[!update_page_snippet?]]

По логике при каждом обновлении страницы плагин должен получать значения полей и менять их, а сниппет выводить их на страницу, но этого не происходит или происходит однократно при очистке кеша. Если отключить кеширование ресурса (снять чекбокс кеширования в настройках ресурса), то все работает и через плагин и через сниппет.

Подскажите пожалуйста правильное решение — какой самый оптимальный способ есть для получения, изменения и вывода обновленных данных TV полей?
weranda
15 февраля 2018, 06:43
modx.pro
3 269
0

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

Наумов Алексей
15 февраля 2018, 09:54
0
Делайте setTVValue при вызове СНИППЕТА! Зачем вам тут плагин то? save не забудьте.

HitsPage, например, работает по данному принципу.
    weranda
    15 февраля 2018, 10:27
    0
    Перенес все в сниппет:

    // получаем значения полей
    $num_tv = $modx->resource->getTVValue('num_tv');
    $text_tv = $modx->resource->getTVValue('text_tv');
    
    // меняем значения полей
    $num_tv += 5;
    $text_tv .= 'abc';
            
    // устанавливаем значения полей
    $modx->resource->setTVValue('num_tv', $num_tv);
    $modx->resource->setTVValue('text_tv', $text_tv);
    
    // сохраняем — ХЗ как, тут я не понимаю как
    $num_tv->save();
    $text_tv->save();
    
    // выводим значение полей      
    echo '<p>-NUM_TV: '.$num_tv.'</p>';
    echo '<p>-TEXT_TV: '.$text_tv.'</p>';

    В общем, видимо где-то что-то я делаю не так. Подскажите пожалуйста что ктонкретно не так на примере, если сможете.
      Наумов Алексей
      15 февраля 2018, 10:36
      1
      0
      // 1. Сначала получаем
      $num_tv = $modx->resource->getTVValue('num_tv');
      $text_tv = $modx->resource->getTVValue('text_tv');
      
      // 2. меняем
      $num_tv += 5;
      $text_tv .= 'abc';
              
      // 3. Устанавливаем TV
      $modx->resource->setTVValue('num_tv', $num_tv);
      $modx->resource->setTVValue('text_tv', $text_tv);
      
      // 4. Сохраняем ресурс!!!
      $modx->resource->save();
      
      // 5. Выводим значения
      echo '<p>-NUM_TV: '.$num_tv.'</p>';
      echo '<p>-TEXT_TV: '.$text_tv.'</p>';
      p.s. выводить из сниппета лучше через return! никакого echo.
      Если в выводе есть html код — то лучше вынести его в чанк.
        weranda
        15 февраля 2018, 10:56
        0
        Алексей, добавил сохранение ресурса по вашему примеру. Результат тот же — на кешированной странице ничего не меняется, а на некешированной все прекрасно меняется.

        Вот пример:
        кешированная страница
        некешированная страница

        Если есть возможность глянуть в админку:
        — url: s12901.h7.modhost.pro/manager/
        — manager
        — adminmodx.pro

        А если нет возможности, то какие еще могут быть варианты?
    Сергей Сергеев
    05 марта 2018, 13:24
    -2
    Варианты:

    1. $resource->clearCache(); после save
    2. Используйте modx процессоры для обновления данных ресурсов (рекомендуется) docs.modx.com/revolution/2.x/developing-in-modx/advanced-development/using-runprocessor

    ps. Это наверно как раз про «некорректный кеш» в другой вашей теме?
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      5