Наверх

Часть 4 (Практика). Доступ к ТВ-параметрам

Задание. Написать сниппет, который будет выводить на страницу заголовки, анноцации и даты публикации только тех ресурсов, у которых значение TV-параметра «Выводить на главной» равно 1. Или если таких ресурсов больше 10 будет выводить сообщение «Найдено больше 10 ресурсов»
У меня id TV-параметра «Выводить на главной» — 3.

Итак. Сначала нам надо найти все объекты класса modTemplateVarResource, у которых значение равно единице:
$tvs = $modx->getCollection('modTemplateVarResource', array('tmplvarid' => 3, 'value' => 1));
foreach ($tvs as $k => $tv) {
    $tvs[$k] = $tv->toArray();
}
print "<pre>";
print_r($tvs);
Кроме того у нас в условии есть еще и проверка на количество ресурсов. Вставляем эту проверку перед тем, как начать искать сами ресурсы, чтобы если ресурсов больше 10 у нас скрипт вывел нужную строку, а не начал делать выборку нужных ресурсов.
$tvs = $modx->getCollection('modTemplateVarResource', array('tmplvarid' => 3, 'value' => 1));
if (count($tvs) > 10) return 'Найдено больше 10 ресурсов';
foreach ($tvs as $k => $tv) {
    $tvs[$k] = $tv->toArray();
}
print "<pre>";
print_r($tvs);
Ну и если ресурсов меньше десяти, получаем каждый ресурс и значения его полей (не забываем заглянуть сюда, найти там строчку «aggregates» и узнать, какой алиас связи TV-параметра с ресурсом):
$tvs = $modx->getCollection('modTemplateVarResource', array('tmplvarid' => 3, 'value' => 1));
if (count($tvs) > 10) return 'Найдено больше 10 ресурсов';
foreach ($tvs as $tv) {
   $res = $tv->getOne('Resource');
   $output .= "<h3>".$res->get('pagetitle')."</h3>";
   $output .= "<p>".$res->get('introtext')."</p>";
   $output .= "<small>".$res->get('publishedon')."</small>";
   $output .= "\n";
}
return $output;

Если все понятно, поздравляю, со связями объектов вы познакомились.


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

  1. Nick 18 декабря 2014, 13:04 # -1
    Что-то ни одного случая, где выполнялось бы условие 'value' => 1, у меня нет да и в принципе быть не может, потому что там записано имя картинки или определение для MIGX'а. Вот начало моего списка (после того как я выкинул это условие):

    Array
    (
        [1] => Array
            (
                [id] => 1
                [tmplvarid] => 1
                [contentid] => 1
                [value] => krysyulya.jpg
            )
    ...
    1. Nock 22 января 2015, 14:20(Комментарий был изменён) # 0
      Nick, это, реально, очень дельный комментарий… Как же так вышло-то…
      1. Фдуч 20 февраля 2015, 17:07 # 0
        А почему в критерии к запросу, id для tv не используется? Забылся?
        1. Илья Уткин 20 февраля 2015, 17:40 # 0
          Да, действительно. Только у modTemplateVarResource нет id — используем tmplvarid. В статье код подправил.
          1. Фдуч 20 февраля 2015, 19:17 # 0
            Спасибо, Илья, большое. И язык хороший и примеры живые.
            1. Андрей 17 декабря 2015, 04:48 # 0
              Илья, огромное спасибо! Замечательные уроки. Пожалуйста помогите разобраться: в этом примере мы получили документы по TV параметру. Возможно ли в этом цикле сразу вывести значения других TV параметров полученных документов?
              $tvs = $modx->getCollection('modTemplateVarResource', array('tmplvarid' => 3, 'value' => 1));
              if (count($tvs) > 10) return 'Найдено больше 10 ресурсов';
              foreach ($tvs as $tv) {
                 $res = $tv->getOne('Resource');
                 $output .= "<h3>".$res->get('pagetitle')."</h3>";
                 $output .= "<p>".$res->get('introtext')."</p>";
                 $output .= "<small>".$res->get('publishedon')."</small>";
              	$output .= "<small>".$res->get('TV_parametr_img')."</small>"; ???????
                 $output .= "\n";
              }
              return $output;
              1. Илья Уткин 17 декабря 2015, 05:39 # 0
                Да, можно. В предыдущей статье было написано же))
                $output .= "<small>".$res->getTVValue('TV_parametr_img')."</small>";
                1. Андрей 17 декабря 2015, 05:52 # 0
                  Спасибо, Илья! Так быстро ответили!
                  1. Андрей 17 декабря 2015, 08:00 # 0
                    Извините, Илья, еще вопросик возник: А можно там же получить ссылку на страничку? Или собирать из alias и пути?
                    1. Илья Уткин 17 декабря 2015, 08:07 # 0
                      У ресурса есть поле uri
                      $res->get('uri');
                      А еще в MODX есть метод makeUrl, которому можно передавать id ресурса
                      $modx->makeUrl($id);
                      1. Андрей 17 декабря 2015, 08:17 # 0
                        Офигенно) то что надо! Спасибо.
                        1. Андрей 17 декабря 2015, 09:46 # 0
                          Простите за глупые вопросы, но не могу пока понять связь всех элементов) Как выполнить этот поиск по ТВ параметру но в заданном контейнере?
                          1. Илья Уткин 17 декабря 2015, 11:13 # 0
                            Это уже сложнее — надо выбирать ресурсы в заданном контейнере и прописывать JOIN ТВ-параметров, чтобы по ним фильтровать.

                            Вот что я нашел по этому поводу bezumkin.ru/training/course2/3006/ ну и плюс вот есть пример кода с присоединением ТВ-параметров ilyaut.ru/cribs-for-modx/sample-resources-filled-with-tv-settings/
                            1. Андрей 17 декабря 2015, 12:45 # 0
                              Искал в указанном вами направлении. Спасибо. Но нашел только вот такое решение, через pdoResources
                              [[!pdoResources?
                                  &parents=`17`
                                  &tvFilters=`myTV==1`]]
              2. Sanes 10 января 2017, 05:00 # 0
                У меня id TV-параметра «Выводить на главной» — 4.
                А в коде
                'tmplvarid' => 3
                1. Илья Уткин 10 января 2017, 08:07 # 0
                  Да, опечаточка… Спасибо, поправил)

                Авторизация

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

                Подписка или RSS

                Буду присылать новые статьи — никакого спама



                Шаблоны MODX

                1 2 Дальше »

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