SELECT, теги, выборка ресурсов Новый


Всем привет!

На сайте есть категория с ресурсами — Авторы (7)
  • Иванов Иван Иванович (1)
  • Петров Петр Петрович (2)
  • Дмитриев Дмитрий Дмитриевич (3)
Создан tv c множественном выбором — tags (тип вывода через запятую):
@SELECT pagetitle, id FROM modx_site_content WHERE parent=7
Также есть категория — Книги, для каждого ресурса этой категории назначено это TV.

т.е для каждой книги можно назначить автора из списка — Авторы.

Если у ресурса (категория Книги) просто вывести [[*tags]] то он выведет id документов через запятую.

Вопрос в следующем:

Как вывести все книги через pdoResources, если зайти на страницу автора.

Т.е если зайти на страницу Иванова Ивана Ивановича, он выведет все книги где указан тег с его ФИО
12 сентября 2016, 16:28    Глеб   
0    815 0

Комментарии (10)

  1. Павел Романов 12 сентября 2016, 17:07 # +1
    Через tvFilters:
    &tvFilters=`tags==%[[*id]]%`
    То есть логика «вывести все книги, у которых в поле tags содержится ID текущего ресурса (автора)».

    Но есть нюанс. Если у Вас у одного автора ID будет 2, а у второго 32 (или 12 или 22, 212 и т. д., то есть будет присутствовать часть ID первого), то на странице автора (2) будут выводиться книги автора (32), поскольку идет выборка «LIKE» и 32 содержит в себе 2. То есть у книги в поле стоит, допустим, «32,15». Содержит эта строка двойку? Содержит, значит выводим у автора(2).

    Чтобы такого не было, нужно либо делать одиночный выбор, либо в поле писать не просто ID авторов через запятую, а с каким-то разделителем. Например,
    #1#,#2#,#3#
    Тогда фильтрация будет такой:
    &tvFilters=`tags==%#[[*id]]#%`
    В этом случае все будет выводиться верно, поскольку #2# и #32# разные конструкции и ни одна из них не является частью другой.

    Сделать такое TV просто. Нужно в возможных значениях вместо этого:
    @SELECT pagetitle, id FROM modx_site_content WHERE parent=7

    сделать так:
    @EVAL return $modx->runSnippet('pdoResources',array(
    'parents'=>7,
    'depth'=>0,
    'limit'=>0,
    'tpl'=>'@INLINE [[+pagetitle]]==#[[+id]]#',
    'outputSeparator'=>'||'
    ));

    Ну или сделать не по ID, а по pagetitle.
    Тогда в TV так:
    @SELECT pagetitle FROM modx_site_content WHERE parent=7

    а в вызове так:
    &tvFilters=`tags==%[[*pagetitle]]%`
    1. Глеб 12 сентября 2016, 19:28 # 0
      попробовал 2мя способами:

      первый:
      @EVAL return $modx->runSnippet('pdoResources',array(
      'parents'=>7,
      'depth'=>0,
      'limit'=>0,
      'tpl'=>'@INLINE [[+pagetitle]]==#[[+id]]#',
      'outputSeparator'=>'||'
      ));
      вывод:
      {$_modx->runSnippet('pdoResources', [
              'parents' => 20,
              'limit' => 3,
              'depth' => 1,
              'where' => ['isfolder' => 0],
              'fenomModifiers'=>'dateAgo',
              'includeTVs' =>'image,tags',
              'processTVs' => 1,
              'tplPath' => '/assets/elements/tpl/',
              'tpl' => '@FILE newsSidebar.tpl',
              'tvFilters' => 'tags==%#[[*id]]#%'
              ])}
      второй:
      @SELECT pagetitle FROM modx_site_content WHERE parent=7
      вывод:
      {$_modx->runSnippet('pdoResources', [
              'parents' => 20,
              'limit' => 3,
              'depth' => 1,
              'where' => ['isfolder' => 0],
              'fenomModifiers'=>'dateAgo',
              'includeTVs' =>'image,tags',
              'processTVs' => 1,
              'tplPath' => '/assets/elements/tpl/',
              'tpl' => '@FILE newsSidebar.tpl',
              'tvFilters' => 'tags==%[[*pagetitle]]%'
              ])}
      к сожалению в обоих вариантах ресурсы не выводятся.

      Если просто вывести [[*tags]] то выводится так:
      В первом варианте: #30#,#374#
      Во втором варианте: Иванов Иван Иванович, Петров Петр Петрович

      но tvFilters не срабатывает
      1. Павел Романов 12 сентября 2016, 20:43 # 0
        А так выводит?
        [[pdoResources?
        &parents=`20`
        &limit=`3`
        &includeTVs=`image,tags`
        &processTVs=`1`
        &tpl=`@INLINE [[+pagetitle]]`
        &tvFilters=`tags==%#[[*id]]#%`
        ]]

        Или:
        [[pdoResources?
        &parents=`20`
        &limit=`3`
        &includeTVs=`image,tags`
        &processTVs=`1`
        &tpl=`@INLINE [[+pagetitle]]`
        &tvFilters=`tags==%[[*pagetitle]]%`
        ]]
        1. Глеб 12 сентября 2016, 21:15 # 0
          Выводит, похоже fenom не нравится вот это &tvFilters=`tags==%[[*pagetitle]]%`
          1. Глеб 13 сентября 2016, 20:09 # 0
            А как можно сделать проверку? если у автора нет книг (или меньше 3х), и выводились просто рандомные
            1. Павел Романов 13 сентября 2016, 20:50 # +1
              Есть параметр:
              [[pdoResources?
              ...
              &totalVar=`count`
              ]]

              Потом можно проверять:
              [[+count:lt=`3`:then=`
              Если меньше трех
              `:else=`
              Ели больше
              `]]

              Но тут, ИМХО, лучше сниппет написать.
      2. Andrei D. 14 сентября 2016, 00:01 # 0
        почему не сделать выборку по where?
        1. Andrei D. 14 сентября 2016, 00:15 # 0
          ведь у книги один автор, и если в tv ресурса книги выбрать id страницы автора, то будет проще…
          &where=`{"author:LIKE":"[[*id]]"}`
          1. Глеб 16 сентября 2016, 04:03 # 0
            нет, авторов может быть несколько.

            сделал через

            tv
            @SELECT pagetitle, id FROM modx_site_content WHERE parent=7
            выборка
            &where=`["1 = 1 AND FIND_IN_SET('[[*id]]', replace(categories, '||', ','))"]`
        2. Глеб 17 сентября 2016, 19:30 # 0
          Теперь пытаюсь сделать выборку такую.
          Когда заходишь в книгу, чтобы выводилось еще 5 книг с таким же автором

          Если автор один, то работает (выбирает все книги, даже если у книги указано несколько авторов), а вот если несколько то нет.

          {$_modx->runSnippet('pdoResources', [
                  'parents' => '24',
                  'resources' => '-[[*id]]',
                  'limit' => 5,
                  'includeTVs' =>'image,tags',
                  'tpl' => '@FILE newsSidebar.tpl',
                  'where' => ["1 = 1 AND FIND_IN_SET("~$_modx->resource.tags~", replace(tags, '||', ','))"],
              ])}
          подскажите пожалуйста
          Вы должны авторизоваться, чтобы оставлять комментарии.