Задание 2. Напишите сниппет, который будет при каждом просмотре страницы увеличивать значение TV-параметра «Просмотры» на 1. А потом напишите второй сниппет, который выведет общее количество просмотров всех страниц, созданных пользователем. Подсказка — текущего пользователя можно получить так:Ну первый сниппет для нас уже легко. Создаем ТВ views и сниппет setViews:$user = $modx->userи в переменной $user у нас будет объект класса modUser с полями текущего пользователя.
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;Этот сниппет выведет число просмотров всех созданных пользователем страниц.
1. В сниппете счетчика страниц вы забыли сохранить значение ТВ в объекте и ваш сниппет ничего не возвращает. Т.е. попросту не работает.
Таким образом нужно добавить:
2. Еще наткнулся на такую проблему, может поможете в ней разобраться. Хотя сниппет вызывается некэшируемым счетчик на странице изменяется только один раз, а затем при обновлении страницы не меняется. Если снять галочку в настройках страницы Кэрируемый — все работает. Т.е. получается все-равно вывод сниппета кэшируется, почему так?
А возвращать он ничего и не должен. Сниппет меняет значение ТВ-параметра views, поэтому количество просмотров можно вывести в любом месте страницы так: [[*views]].
Но потому я и люблю MODX, что можно выбрать любой вариант вывода и придумать любую логику. Надо вам, чтобы просмотры сразу же выводились, делайте так. А если просмотры — это служебная информация, можете оставить первый вариант, а количество просмотров смотреть только в админке.
2. Тут не знаю, чем помочь. Попробуйте посмотреть, как сниппет выглядит в файле кеша самой страницы (core/cache/resource/web/resources/{id}.cache.php) — должен быть написан так же, как и в шаблоне: [[!snippet]]
Так же хочу выразить благодарность автору, очень живые и понятные уроки, и, что самое важное, есть задания для практики! С MODX работаю довольно давно, на большинстве проектов пользуюсь дефолтными пакетами, лишь изредка пишу свои сниппеты и плагины, но вот наконец-то дошли руки чтоб раз и навсегда систематизировать свои обрывистые знания в API MODX.
Смутило еще то, что смотрел код похожего сниппета и там метод save() используется.
Ошибка моя понятна, здесь используется setValue а у вас setTVValue.
Файл кэша посмотрел, там все как надо. Глюк вообщем какой-то.
Подтверждаю, MODX 2.3.2-pl не увеличивает переменную views. В содержимом ресурса: [[!setViews]], в кеше (cache/resource/web/resources/4.cache.php): 'content' => '[[!setViews]]..., переменная увеличивается только если сделать страницу некешируемой или Обновить сайт (очистить кеш).
Здесь же мы просто учимся использовать методы API MODX.