Максим Кузнецов

Максим Кузнецов

Был в сети 04 августа 2021, 21:51
Заказы принимаю
Office также использует (и догружает при установке себя) HybridAuth.

Пользователи тоже не исчезнут, т.к. при первом заходе через HybridAuth (регистрация), дополнение автоматически создает полноценного пользователя modx.

Важно:
По умолчанию, при регистрации пользователя нельзя использовать HybridAuth. Юзер должен первый раз авторизоваться через email, а затем уже привязать нужные соцсети в настройках профиля.

— это сделано как раз для того, чтобы пользователь, заходя с разных соцсетей не плодил несколько независимых друг от друга аккаунтов.
Как выбрать все ресурсы, у которых не заполнен ТВ

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

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

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

Условие выше выводит результаты ТОЛЬКО с незаполненным tv-полем.
Ммм… не совсем понял в чем проблема.

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

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

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

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

Т.е. если у вас раньше были созданы ресурсы, у которых значение по умолчанию для определенного тв-поля было, допустим «1», а затем вы изменили его на "" и создали еще ресурсы, то в обоих случаях в таблице бд нет данных записей и для всех ресурсов, у которых тв-поле не заполнено, будет отображено актуальное значение по умолчанию.
Т.е. делать со старыми ресурсам ничего не нужно.
Для тв, у которых значение не равно единице, where будет выглядеть так:
&includeTVs=`tv_name`
&where=`{"tv_name:!=" 1}`

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

Соответственно, если вы хотите вывести ресурсы с незаполненным полем, вам нужен код:
&includeTVs=`tv_name`
&where=`{"tv_name:IS": null}`
Вообще, сильно тормозить при должном сервере не должно, тем более, что с момента статьи Николая Ланца прошло уже довольно много времени и кэширование в модксе также претерпело свои изменения.

https://modx.pro/comments/ — вот, например, 783 страницы по 25 результатов на каждую.

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

Как вариант, для повышения производительности, можно также воспользоваться Fenom'ом.

UPD: Впрочем, вопрос оптимизации бесконечен, да и для по-настоящему больших проектов всегда предпочтительнее писать все конкретно под задачу.
1. Создаешь через каждые 8 блоков контейнер с уникальным классом на перовом уровне вложения родителя:
$(".container > div:nth-child(8n)").after("<div class='banner-block'></div>");

2. Теперь для каждого четного вставляешь одно, а для каждого нечетного — другое:
$(".container > .banner-block:nth-child(odd)").html("2, 4, 6");
$(".container > .banner-block:nth-child(even)").html("1, 3, 5");

Как альтернатива — можно расписать условие проверки внутри шага один. Если функцию нужно будет вызывать с определенной периодичностью (инфинити скролл, например), то это предпочтительнее. Если только 1 раз при создании страницы — то лучше вышеописанным способом.
Если не ошибаюсь, в фильтре mpu дефолтное значение множителя (если любой другой не указан) = 2.

Попробуйте указать:
[[*sale_sticker:default=`0`]].

В крайнем случае, можно обернуть результат в условие:
[[*sale_sticker:is=``:then=`
	[[*cena_proekta_doma]]
`:else=`
	[[+num:decr=`[[*cena_proekta_doma]]`:mpy=`[[*sale_sticker]]`:div=`100`:add=`[[*cena_proekta_doma]]`]]
`]]
Если количество записей непосредственно в суб-категории (а не все потомки для суб-категории в принципе), то в вышеописанном сниппете нужно убрать строчку получения всех потомков для потомков:
$pids = array_merge(array($parent), $modx->getChildIds($parent));

и заменить условие:
'parent:IN' => $pids
на:
'parent' => $parent

— таким образом вы получите непосредственно всех потомков 1-го уровня для нужной категории. Сниппет вызывать также.

Если же вы спрашивали по поводу того, какой в каком шаблоне нужно вызвать данный сниппет, то ~так:
&displayStart=`1`
&tplStart // это шаблон для раздела (1 уровень)
&tplParentRow // это шаблон подразделов тут вставляем нужные сниппеты.
//также можно использовать &tplCategoryFolder, если у потомков нет своих потомков
&tpl //шаблон внутренних пунктов
Если вы выводите структуру при помощи pdoMenu, то в вашем распоряжении есть параметры шаблонов, которые позволяют кастомизировать меню на нужном уровне — например &tplCategoryFolder.

Количество комментариев в нужном разделе:
[[!TicketCommentsCount:default=`0`? &id=`[[+id]]`]]

Количество записей:
— пишем сниппет, например CatalogItemsCount:
<?php
	if (empty($parent)) {
		return;
	}

	$pids = array_merge(array($parent), $modx->getChildIds($parent));
	$ids = array();

	$q = $modx->newQuery('modResource');
	$q->where(array('parent:IN' => $pids,'published' => 1,'deleted' => 0));
	//здесь можно переписать на простое получение count-запроса, но оставил так на случай, если потребуется использовать где-то список id потомков
	$q->select('`modResource`.`id`');
	if ($q->prepare() && $q->stmt->execute()) {
		$ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
		return count($ids);
	}
	else {
		return '0';
	}

— вызываем в нужном месте
[[!CatalogItemsCount? &parent=`[[+id]]`]]
Как убрать класс active из &tplStart
Мне нужен класс актив в родительском
Вас довольно сложно понять… В любом случае, у вас есть
целый ворох параметров шаблонов для кастомизации корневых пунктов, разделов, внутренних пунктов и тд. Выбирайте нужный, где вам нужно убрать/добавить отображение класса «active» и редактируйте в соответствующем шаблоне плейсхолдер [[+classes]].