Наверх

Часть 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;

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


21 комментарий

  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
                  Да, опечаточка… Спасибо, поправил)
                  1. Руслан 23 ноября 2018, 20:57 # 0
                    Илья, почему выдается ошибка (Fatal error: Call to a member function get() on null) в данном примере:
                    <?php
                    $resources = $modx->getCollection('modResource');
                    foreach ($resources as $res) {
                        $parent = $res->getOne('Parent');
                        $output .= $parent->get('pagetitle');
                    }
                    return $output;
                    Я понимаю, пример кривой, но не понятно почему getOne('Parent') для ресурса не обрабатывается? Заранее спасибо.
                    1. Илья Уткин 26 ноября 2018, 10:32 # +1
                      Потому что если ресурс находится в корне дерева, то у него нет родителя. Нужно обязательно проверять, есть родитель или нет:
                      <?php
                      $resources = $modx->getCollection('modResource');
                      foreach ($resources as $res) {
                          if ($parent = $res->getOne('Parent')) {
                              $output .= $parent->get('pagetitle');
                          }
                      }
                      return $output;
                      1. Руслан 26 ноября 2018, 10:46 # 0
                        Здравствуйте, Илья, спасибо за ответ, теперь ясно.
                        Еще небольшой вопрос: я правильно понимаю, что можно использовать любую связь как «aggregates», так и «composites» для любого объекта через getOne или getMany, если она есть? Я к тому, что у связей нет иерархии относительно друг друга, они параллельны, надеюсь вы поняли :)
                        1. Илья Уткин 26 ноября 2018, 10:48 # +1
                          Да, у каждой связи есть своё название, поэтому никакой путаницы нет
                          1. Руслан Алеев 26 ноября 2018, 10:49 # 0
                            Спасибо!

                Авторизация

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


                Шаблоны MODX

                1 2 Дальше »

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