Наверх

Часть 4 (Практика). Редактирование ТВ-параметров

Второе практическое задание звучало так:
Задание 2. Напишите сниппет, который будет при каждом просмотре страницы увеличивать значение TV-параметра «Просмотры» на 1. А потом напишите второй сниппет, который выведет общее количество просмотров всех страниц, созданных пользователем. Подсказка — текущего пользователя можно получить так:
$user = $modx->user
и в переменной $user у нас будет объект класса modUser с полями текущего пользователя.
Ну первый сниппет для нас уже легко. Создаем ТВ views и сниппет setViews:
if ($views = $modx->resource->getTVValue('views')) {
    $views++;
} else {
    $views = 1;
}
$modx->resource->setTVValue('views',$views);
И вставляем его где-нибудь на странице. Некешируемым (так как он должен выполняться каждый раз при открытии страницы).

Если посмотрим на связи объекта «modUser», то увидим, что он связан со всеми созданными пользователем ресурсами (алиас связи — CreatedResources). Теперь создаем новую страницу, где будем выводить информацию о количестве просмотров страниц, созданных пользователем.

На этой странице вставляем следующий сниппет:
$user = $modx->user;
$resources = $user->getMany('CreatedResources');
foreach ($resources as $res) {
    $views = $views + $res->getTVValue('views');
}
return $views;
Этот сниппет выведет число просмотров всех созданных пользователем страниц.


8 комментариев

  1. Сергей 18 ноября 2014, 02:06 # 0
    Илья, добрый день! Спасибо за уроки. Хочу прокоментировать данное домашнее задание, т.к. возможно, кто-то также столкнется с проблемой во время изучения.
    1. В сниппете счетчика страниц вы забыли сохранить значение ТВ в объекте и ваш сниппет ничего не возвращает. Т.е. попросту не работает.
    Таким образом нужно добавить:
    $modx->resource->save();
    return $views;
    2. Еще наткнулся на такую проблему, может поможете в ней разобраться. Хотя сниппет вызывается некэшируемым счетчик на странице изменяется только один раз, а затем при обновлении страницы не меняется. Если снять галочку в настройках страницы Кэрируемый — все работает. Т.е. получается все-равно вывод сниппета кэшируется, почему так?
    1. Илья Уткин 18 ноября 2014, 07:24 # 0
      1. По идее, метод setTVValue должен сохранять значение. Попробуйте все-таки без строчки с save()
      А возвращать он ничего и не должен. Сниппет меняет значение ТВ-параметра views, поэтому количество просмотров можно вывести в любом месте страницы так: [[*views]].

      Но потому я и люблю MODX, что можно выбрать любой вариант вывода и придумать любую логику. Надо вам, чтобы просмотры сразу же выводились, делайте так. А если просмотры — это служебная информация, можете оставить первый вариант, а количество просмотров смотреть только в админке.

      2. Тут не знаю, чем помочь. Попробуйте посмотреть, как сниппет выглядит в файле кеша самой страницы (core/cache/resource/web/resources/{id}.cache.php) — должен быть написан так же, как и в шаблоне: [[!snippet]]
      1. Антон 23 декабря 2015, 22:18 # 0
        Если убрать на вызываемой странице в разделе «Настройки» галочку с «Кэшируемый», то начнет крутится счетчик, но это соответственно повлияет на скорость загрузки страницы, поэтому делать не советуется, но в целях обучения для наглядности почему бы и нет. А так если нужен подобный сниппет, то, как писал ниже Илья, в репозитории лежит HitsPage.
        Так же хочу выразить благодарность автору, очень живые и понятные уроки, и, что самое важное, есть задания для практики! С MODX работаю довольно давно, на большинстве проектов пользуюсь дефолтными пакетами, лишь изредка пишу свои сниппеты и плагины, но вот наконец-то дошли руки чтоб раз и навсегда систематизировать свои обрывистые знания в API MODX.
      2. Сергей 18 ноября 2014, 07:46(Комментарий был изменён) # 0
        Спасибо за разъяснение. Смутило что сниппет ничего не выводит :-) Здесь думал категориями php и забыл про то что это обычный TV. Да ваш код вполне рабочий.
        Смутило еще то, что смотрел код похожего сниппета и там метод save() используется.
        <?php
        /* Code for the PageCount Snippet */
        $id = $modx->resource->get('id');
        $tv =
        $modx->getObject('modTemplateVar',
        array('name'=>'PageCount'));
        $count = $tv->getValue($id);
        $count++;
        $tv->setValue($id,$count);
        $tv->save();
        return $count;
        Ошибка моя понятна, здесь используется setValue а у вас setTVValue.
        Файл кэша посмотрел, там все как надо. Глюк вообщем какой-то.
        1. Андрей 22 декабря 2014, 11:32 # 0
          Большой спасибо за полезные уроки! Замечание по подсчету просмотров страницы.

          Подтверждаю, MODX 2.3.2-pl не увеличивает переменную views. В содержимом ресурса: [[!setViews]], в кеше (cache/resource/web/resources/4.cache.php): 'content' => '[[!setViews]]..., переменная увеличивается только если сделать страницу некешируемой или Обновить сайт (очистить кеш).
          1. Станислав 30 мая 2015, 07:28 # 0
            MODX 2.2.14. Тоже не увеличивает переменную views. Когда страница не кэшируется, увеличивает значение не на 1, а на 2.
            1. Илья Уткин 01 июня 2015, 07:25 # 0
              Для того, чтобы считать просмотры страниц, нужно использовать готовое дополнение, например, HitsPage.

              Здесь же мы просто учимся использовать методы API MODX.
            2. Станислав Однолетко 16 июля 2017, 22:55 # 0
              $views = $modx->resource->getTVValue('views')
              Ругается на getTVValue, как-будто его не знает. P.S. поле я свое прописывал, если что.

              Авторизация

              через сервис Loginza:


              Шаблоны MODX

              1 2 Дальше »

              Объектная
              модель
              MODX