pdoResources - как выбрать по незаполнненому ТВ?

Как выбрать все ресурсы, у которых не заполнен ТВ например через pdoResources или getTickets?
То есть есть тв moderation. Нужно выбрать все ресурсы, у которых тв moderation != 1.
Комментарий отсюда не работает.
Эта статья тоже ничего не дала.

То есть варианты типа
'where' => '{ "moderation:IS": null }',
'where' => '{ "moderation": "" }',
'where' => '{ "moderation:!=": 1 }',
'where' => '{ "TVmoderation.value:!=":1 }',
'where' => '{ "moderation:IS": null, "OR:moderation":"" }',
'where' => '[ TVmoderation.value != 1 ]',
не работают, а точнее выводят 0 результатов.
Вот &showLog:
0.0000851: pdoTools loaded
0.0000339: xPDO query object created
0.0003300: Included list of tvs: moderation
0.0001380: leftJoined modTemplateVarResource as TVmoderation
0.0002620: Added selection of Ticket: SQL_CALC_FOUND_ROWS `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
0.0000091: Added selection of modTemplateVarResource: IFNULL(`value`, '0') AS `tv.moderation`
0.0000350: Replaced TV conditions
0.0005832: Processed additional conditions
0.0008240: Added where condition: `TVmoderation`.`value`:!==1, Ticket.parent:IN(34,118893,118894,118896,118897,118898,118899,118900,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,190,191,118823,118824,118842,118844,118861,118881,118907,118913,118927,118979,118988,118990,118991), Ticket.deleted=0
0.0000231: Replaced TV conditions
0.0000570: Sorted by Ticket.publishedon, DESC
0.0002320: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `Ticket`.`id`, `Ticket`.`type`, `Ticket`.`contentType`, `Ticket`.`pagetitle`, `Ticket`.`longtitle`, `Ticket`.`description`, `Ticket`.`alias`, `Ticket`.`link_attributes`, `Ticket`.`published`, `Ticket`.`pub_date`, `Ticket`.`unpub_date`, `Ticket`.`parent`, `Ticket`.`isfolder`, `Ticket`.`introtext`, `Ticket`.`richtext`, `Ticket`.`template`, `Ticket`.`menuindex`, `Ticket`.`searchable`, `Ticket`.`cacheable`, `Ticket`.`createdby`, `Ticket`.`createdon`, `Ticket`.`editedby`, `Ticket`.`editedon`, `Ticket`.`deleted`, `Ticket`.`deletedon`, `Ticket`.`deletedby`, `Ticket`.`publishedon`, `Ticket`.`publishedby`, `Ticket`.`menutitle`, `Ticket`.`donthit`, `Ticket`.`privateweb`, `Ticket`.`privatemgr`, `Ticket`.`content_dispo`, `Ticket`.`hidemenu`, `Ticket`.`class_key`, `Ticket`.`context_key`, `Ticket`.`content_type`, `Ticket`.`uri`, `Ticket`.`uri_override`, `Ticket`.`hide_children_in_tree`, `Ticket`.`show_in_tree`, `Ticket`.`properties`, IFNULL(`TVmoderation`.`value`, '0') AS `tv.moderation` FROM `modx_site_content` AS `Ticket` LEFT JOIN `modx_site_tmplvar_contentvalues` `TVmoderation` ON `TVmoderation`.`contentid` = `Ticket`.`id` AND `TVmoderation`.`tmplvarid` = 76 WHERE  ( `TVmoderation`.`value` != '1' AND `Ticket`.`parent` IN (34,118893,118894,118896,118897,118898,118899,118900,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,190,191,118823,118824,118842,118844,118861,118881,118907,118913,118927,118979,118988,118990,118991) AND `Ticket`.`deleted` = 0 )  ORDER BY Ticket.publishedon DESC "
0.0010159: SQL executed
0.0001111: Total rows: 0
0.0000150: Rows fetched
0.0000141: Prepared and processed TVs
0.0000010: Returning processed chunks
0.0032361: Total time
18 087 936: Memory usage
Как можно вывести только ресурсы, у которых TV != 1?
Василий Столейков
01 декабря 2015, 20:52
modx.pro
5
4 374
+1
Поблагодарить автора Отправить деньги

Комментарии: 16

Максим Кузнецов
02 декабря 2015, 00:14
+1
Для тв, у которых значение не равно единице, where будет выглядеть так:
&includeTVs=`tv_name`
&where=`{"tv_name:!=" 1}`

Но, если у вас выставлено в настройках tv-поле значение по-умолчанию, то при создании ресурса с данным тв в базу данных запись тв не попадает.
Т.е. вышеописанный код сработает только если значение 1 у данного тв заносится в ресурсе не по умолчанию.

Соответственно, если вы хотите вывести ресурсы с незаполненным полем, вам нужен код:
&includeTVs=`tv_name`
&where=`{"tv_name:IS": null}`
    Василий Столейков
    02 декабря 2015, 00:23
    0
    Сменил значение по умолчанию с 0 на пустое значение. Но вариант типа:
    &where=`{ "moderation:!=" 1 }`
    всё ещё не срабатывает, выводит 0 результатов, хотя их там немало.

    Но, если у вас выставлено в настройках tv-поле значение по-умолчанию, то при создании ресурса с данным тв в базу данных данная запись не попадает.
    А как теперь быть с уже созданными ресурсами, у которых тв moderation было по умолчанию? Вообще-то этот тв только недавно появился и был привязан к соответствующим шаблонам.
    Получается что, нужно только сгенерировать как-то скриптом для всех нужных страниц запись тв-шки с пустым значением? Или есть ещё какой-то вариант?
      Максим Кузнецов
      02 декабря 2015, 00:36
      0
      Ммм… не совсем понял в чем проблема.

      Насколько я понимаю (в ядре не смотрел, поэтому если это не верно — буду рад комментарию на этот счет), логика при создании-обработки тв-полей примерно такая:

      Создание/сохранение ресурса
      — при сохранении проверяется заполненность тв. Если тв заполнено и значение отличается от значения по умолчанию, то в отдельную таблицу в бд (для тв-шек) идет запись вида:
      id-ресурса | id-тв-поля | значение
      В противном случае в бд ничего не записывается.

      Отображение ресурса (на фронтенде)
      — при наличии в шаблоне плейсхолдера [[*tv]] проверяется его заполненность для данного ресурса. Если оно заполнено — значение выводится. Если нет — смотрится значение по умолчанию в параметрах тв и выводится оное.

      =====================

      Т.е. если у вас раньше были созданы ресурсы, у которых значение по умолчанию для определенного тв-поля было, допустим «1», а затем вы изменили его на "" и создали еще ресурсы, то в обоих случаях в таблице бд нет данных записей и для всех ресурсов, у которых тв-поле не заполнено, будет отображено актуальное значение по умолчанию.
      Т.е. делать со старыми ресурсам ничего не нужно.
        Василий Столейков
        02 декабря 2015, 00:44
        0
        Нет, не хочет работать никак почему-то…
        Статистика: 5 ресурсов с заполненным тв, остальные 128 с пустым. Не выбираются только 5 по условию выше хоть убей.

        P.S. Да, я тоже так понимаю логику работы ТВ. Но в конкретном случае у меня не работает, убил уже не один час на это… Ладно, завтра на свежую голову может прийдёт ещё что-нибудь.
          Максим Кузнецов
          02 декабря 2015, 00:55
          0
          Как выбрать все ресурсы, у которых не заполнен ТВ

          Как можно вывести только ресурсы, у которых TV != 1?

          Статистика: 5 ресурсов с заполненным тв, остальные 128 с пустым. Не выбираются только 5 по условию выше хоть убей.

          Вы меня запутали… Вы хотите вывести ресурсы у которых заполнено тв-поле или нет?

          Условие выше выводит результаты ТОЛЬКО с незаполненным tv-полем.
            Василий Столейков
            02 декабря 2015, 10:58
            0
            У меня у самого вчера уже мысли путались… Похоже чуть ниже Илья дал нужный ответ на мой вопрос.
        Максим Кузнецов
        02 декабря 2015, 00:44
        0
        Если хотите вводить «физическое» значение по умолчанию, которое пойдет в бд, можете воспользоваться плагином:
        <?php
        	if ($modx->event->name == 'OnDocFormSave') {
        		$template = $resource->get('template');
        		
        		//плагин работает только для ресурсов с определенным шаблоном
        		if ($template == айди_шаблона) {
        			$checkTv = $resource->getTVValue('название_тв_поля');
        			
        			//не уверен, нужно ли второе условие, но оставлю на всякий случай
        			if (!isset($checkTv) || $checkTv == '')
        				$resource->setTVValue('название_тв', 'новое_значение_по_умолчанию_которое_запишется_в_бд');
        			}
        		}
        		
        		$resource->save();
        	}

        + можете по гайду (слегка дописав под свою задачу) Ильи Уткина и дополнению Console обновить требуемые ресурсы циклом.
          Василий Столейков
          02 декабря 2015, 00:47
          0
          Похоже это плагин на добавление в базу тв-шек при сохранении формы…
          Но похоже это не выход. Сайт очень большой, в десятки тысяч ресурсов (тикетов). Представить даже страшно во что превратится таблица тв-шек если записывать в базу всем им необязательные тв-поля…
      Евгений Webinmd
      02 декабря 2015, 00:53
      0
      а в includeTVs поле moderation есть?
      там то ли в tvfilters то ли в where без этого не срабатывало
        Илья Уткин
        02 декабря 2015, 10:49
        +2
        Я знаю только такой костыльный способ:

        [[pdoResources:toPlaceholder=`exclude`?
            &limit=`0`
            &returnIds=`1`
            &includeTVs=`moderation`
            &where=`{ "moderation":1 }`
        ]]
        [[pdoResources?
            &limit=`3`
            &tpl=`tpl.row`
            &includeTVs=`moderation`
            &where=`{ "id:NOT IN":[ [[+exclude]] ] }`
        ]]

        То есть сначала получаем список всех ресурсов, у которых ТВ = 1, а потом их исключаем из выборки. Но это уже два запроса в базу…
          Василий Столейков
          02 декабря 2015, 10:59
          0
          Да, костыльный, но хотя бы рабочий, спасибо!
            Сергей Шлоков
            02 декабря 2015, 12:32
            +2
            Как вариант. Только предварительно нужным ресурсам нужно выставить moderation=1.
              Василий Столейков
              02 декабря 2015, 12:38
              0
              Классный вариант! Спасибо за него — похоже он прямо для меня!
                Сергей Шлоков
                02 декабря 2015, 12:42
                0
                Спасибо твоему тезке Василию за классную идею по расширению таблиц.
                  Василий Столейков
                  02 декабря 2015, 12:43
                  0
                  Ага, а тебе за развитие идеи! Мне она тоже понравилась.
                    Артур Цыба
                    17 июля 2020, 15:31
                    0
                    Привет! Столкнулся с той же проблемой, что и в топике. Всё что можно уже перепробовал — ничего не помогает. Можете помочь актуальным советом, что с этим делать? :-(
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          16