pdoResources - как выбрать по незаполнненому ТВ?
Как выбрать все ресурсы, у которых не заполнен ТВ например через pdoResources или getTickets?
То есть есть тв moderation. Нужно выбрать все ресурсы, у которых тв moderation != 1.
Комментарий отсюда не работает.
Эта статья тоже ничего не дала.
То есть варианты типа
Вот &showLog:
То есть есть тв 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?
Поблагодарить автора
Отправить деньги
Комментарии: 16
Для тв, у которых значение не равно единице, where будет выглядеть так:
Но, если у вас выставлено в настройках tv-поле значение по-умолчанию, то при создании ресурса с данным тв в базу данных запись тв не попадает.
Т.е. вышеописанный код сработает только если значение 1 у данного тв заносится в ресурсе не по умолчанию.
Соответственно, если вы хотите вывести ресурсы с незаполненным полем, вам нужен код:
&includeTVs=`tv_name`
&where=`{"tv_name:!=" 1}`
Но, если у вас выставлено в настройках tv-поле значение по-умолчанию, то при создании ресурса с данным тв в базу данных запись тв не попадает.
Т.е. вышеописанный код сработает только если значение 1 у данного тв заносится в ресурсе не по умолчанию.
Соответственно, если вы хотите вывести ресурсы с незаполненным полем, вам нужен код:
&includeTVs=`tv_name`
&where=`{"tv_name:IS": null}`
Сменил значение по умолчанию с 0 на пустое значение. Но вариант типа:
Получается что, нужно только сгенерировать как-то скриптом для всех нужных страниц запись тв-шки с пустым значением? Или есть ещё какой-то вариант?
&where=`{ "moderation:!=" 1 }`
всё ещё не срабатывает, выводит 0 результатов, хотя их там немало.Но, если у вас выставлено в настройках tv-поле значение по-умолчанию, то при создании ресурса с данным тв в базу данных данная запись не попадает.А как теперь быть с уже созданными ресурсами, у которых тв moderation было по умолчанию? Вообще-то этот тв только недавно появился и был привязан к соответствующим шаблонам.
Получается что, нужно только сгенерировать как-то скриптом для всех нужных страниц запись тв-шки с пустым значением? Или есть ещё какой-то вариант?
Ммм… не совсем понял в чем проблема.
Насколько я понимаю (в ядре не смотрел, поэтому если это не верно — буду рад комментарию на этот счет), логика при создании-обработки тв-полей примерно такая:
Создание/сохранение ресурса
— при сохранении проверяется заполненность тв. Если тв заполнено и значение отличается от значения по умолчанию, то в отдельную таблицу в бд (для тв-шек) идет запись вида:
Отображение ресурса (на фронтенде)
— при наличии в шаблоне плейсхолдера [[*tv]] проверяется его заполненность для данного ресурса. Если оно заполнено — значение выводится. Если нет — смотрится значение по умолчанию в параметрах тв и выводится оное.
=====================
Т.е. если у вас раньше были созданы ресурсы, у которых значение по умолчанию для определенного тв-поля было, допустим «1», а затем вы изменили его на "" и создали еще ресурсы, то в обоих случаях в таблице бд нет данных записей и для всех ресурсов, у которых тв-поле не заполнено, будет отображено актуальное значение по умолчанию.
Т.е. делать со старыми ресурсам ничего не нужно.
Насколько я понимаю (в ядре не смотрел, поэтому если это не верно — буду рад комментарию на этот счет), логика при создании-обработки тв-полей примерно такая:
Создание/сохранение ресурса
— при сохранении проверяется заполненность тв. Если тв заполнено и значение отличается от значения по умолчанию, то в отдельную таблицу в бд (для тв-шек) идет запись вида:
id-ресурса | id-тв-поля | значение
В противном случае в бд ничего не записывается.Отображение ресурса (на фронтенде)
— при наличии в шаблоне плейсхолдера [[*tv]] проверяется его заполненность для данного ресурса. Если оно заполнено — значение выводится. Если нет — смотрится значение по умолчанию в параметрах тв и выводится оное.
=====================
Т.е. если у вас раньше были созданы ресурсы, у которых значение по умолчанию для определенного тв-поля было, допустим «1», а затем вы изменили его на "" и создали еще ресурсы, то в обоих случаях в таблице бд нет данных записей и для всех ресурсов, у которых тв-поле не заполнено, будет отображено актуальное значение по умолчанию.
Т.е. делать со старыми ресурсам ничего не нужно.
Нет, не хочет работать никак почему-то…
Статистика: 5 ресурсов с заполненным тв, остальные 128 с пустым. Не выбираются только 5 по условию выше хоть убей.
P.S. Да, я тоже так понимаю логику работы ТВ. Но в конкретном случае у меня не работает, убил уже не один час на это… Ладно, завтра на свежую голову может прийдёт ещё что-нибудь.
Статистика: 5 ресурсов с заполненным тв, остальные 128 с пустым. Не выбираются только 5 по условию выше хоть убей.
P.S. Да, я тоже так понимаю логику работы ТВ. Но в конкретном случае у меня не работает, убил уже не один час на это… Ладно, завтра на свежую голову может прийдёт ещё что-нибудь.
Как выбрать все ресурсы, у которых не заполнен ТВ
Как можно вывести только ресурсы, у которых TV != 1?
Статистика: 5 ресурсов с заполненным тв, остальные 128 с пустым. Не выбираются только 5 по условию выше хоть убей.
Вы меня запутали… Вы хотите вывести ресурсы у которых заполнено тв-поле или нет?
Условие выше выводит результаты ТОЛЬКО с незаполненным tv-полем.
У меня у самого вчера уже мысли путались… Похоже чуть ниже Илья дал нужный ответ на мой вопрос.
Если хотите вводить «физическое» значение по умолчанию, которое пойдет в бд, можете воспользоваться плагином:
+ можете по гайду (слегка дописав под свою задачу) Ильи Уткина и дополнению Console обновить требуемые ресурсы циклом.
<?php
if ($modx->event->name == 'OnDocFormSave') {
$template = $resource->get('template');
//плагин работает только для ресурсов с определенным шаблоном
if ($template == айди_шаблона) {
$checkTv = $resource->getTVValue('название_тв_поля');
//не уверен, нужно ли второе условие, но оставлю на всякий случай
if (!isset($checkTv) || $checkTv == '')
$resource->setTVValue('название_тв', 'новое_значение_по_умолчанию_которое_запишется_в_бд');
}
}
$resource->save();
}
+ можете по гайду (слегка дописав под свою задачу) Ильи Уткина и дополнению Console обновить требуемые ресурсы циклом.
Похоже это плагин на добавление в базу тв-шек при сохранении формы…
Но похоже это не выход. Сайт очень большой, в десятки тысяч ресурсов (тикетов). Представить даже страшно во что превратится таблица тв-шек если записывать в базу всем им необязательные тв-поля…
Но похоже это не выход. Сайт очень большой, в десятки тысяч ресурсов (тикетов). Представить даже страшно во что превратится таблица тв-шек если записывать в базу всем им необязательные тв-поля…
а в includeTVs поле moderation есть?
там то ли в tvfilters то ли в where без этого не срабатывало
там то ли в tvfilters то ли в where без этого не срабатывало
Я знаю только такой костыльный способ:
То есть сначала получаем список всех ресурсов, у которых ТВ = 1, а потом их исключаем из выборки. Но это уже два запроса в базу…
[[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, а потом их исключаем из выборки. Но это уже два запроса в базу…
Да, костыльный, но хотя бы рабочий, спасибо!
Как вариант. Только предварительно нужным ресурсам нужно выставить moderation=1.
Классный вариант! Спасибо за него — похоже он прямо для меня!
Спасибо твоему тезке Василию за классную идею по расширению таблиц.
Ага, а тебе за развитие идеи! Мне она тоже понравилась.
Привет! Столкнулся с той же проблемой, что и в топике. Всё что можно уже перепробовал — ничего не помогает. Можете помочь актуальным советом, что с этим делать? :-(
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.