Как поставить галку в MODx, чтобы не отображать ресурс в списке
Довелось дорабатывать сайт http://biosfere.ru, и одна из задачек была связана с тем, чтобы с помощью checkbox отменить анонс страницы на главной странице.
На первый взгляд, а также на второй, третий и четвертый, задача тривиальная для любого, кто более-менее знаком с MODx.
Проиллюстрируем на примере конкретных страниц.
Вот главная страница сайта с прокручивающимся списком заболеваний.
В админке MODx Revolution 2.5.1 имеем вот такой checkbox:
Задача: чтобы при стоящей галке этот пункт не отображался на главной.
А вот так выглядит чанк на главной с вызовом сниппета pdoResources, выводящего список:
Флажок на странице каждого заболевания представляет собой булевый tv-параметр:
Казалось бы, нет ничего проще: выставить фильтр по tv-параметру и всего делов.
Например, так:
&sortbyTVType=`integer` &tvFilters=`desease_noshow<>1`
Почему это не сработало?
Все очень просто: tv-параметр был добавлен уже тогда, когда было забито порядка 150 страниц с видами заболеваний.
Чтобы в таблице modx_site_tmplvar_contentvalues прописалось значение tv-параметра 0, нужно зайти на каждую из 150 страниц и сохранить ее, либо написать для этого некий скрипт (если знаете другой вариант – пишите на capweb@bk.ru.
Когда мы зашли на 2 страницы из 150 и поставили там галки, в базе появилоcь две единички у tv с id=82.
Больше в базе записей о значениях этого tv нет!
Поэтому решение задачи "в лоб" предполагает, например, такую конструкцию
&where=`{ "id:IN":[ [ [getnomenuid3 ] ] ] }`
Т. е., нужен второй сниппет, который будет собирать id документов, не содержащих tv-параметр desease_noshow со значением 1.
Также для этого в pdoResources предусмотрена минусация:
&resources=`-2, -5`
В результате приходим к конструкции
Остается лишь сделать пару xPDO-запросов для того, чтобы вытащить из базы эти id и оформить сниппет так, чтобы он выдавал их в виде '-2, -5'
Кто не знает, как это сделать, пишите, ответим почти всем.
Кстати, нужно вкладывать именно некэшируемый сниппет в кэшируемый, а не наоборот. Еще более правильным решением будет вызов сниппета pdoResources из другого сниппета конструкцией вида
$query = $modx->sanitizeString($_GET['resSearch']); $searchFilter = '[" published = 1 AND deleted = 0 AND ( pagetitle LIKE \"%'.$query.'%\" OR description LIKE \"%'.$query.'%\" OR longtitle LIKE \"%'.$query.'%\" ) "]'; return $modx->runSnippet('pdoResources', array( parents' => 0, showLog' => 1, where' => $searchFilter ));
Следующая статья: MODx. Вопросительные знаки вместо текста. Решение проблемы https://capweb.ru/modx-voprositelnyie-znaki-vmesto-teksta.html
Предыдущая статья: Зарабатывайте с помощью сайта Avon! https://capweb.ru/zarabatyivajte-s-pomoshhyu-sajta.html