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

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

С нами с 01 июля 2013; Место в рейтинге пользователей: #34
02 декабря 2015, 21:29
0
Точно. Идея очень здравая и избавила бы от многих неудобств.)
02 декабря 2015, 20:01
0
Если что, вот готовый пример джоина рейтинга из VoteForms к mFilter2.
Переделать под pdoResources, думаю, труда не составит.
02 декабря 2015, 17:07
+1
Office также использует (и догружает при установке себя) HybridAuth.

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

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

— это сделано как раз для того, чтобы пользователь, заходя с разных соцсетей не плодил несколько независимых друг от друга аккаунтов.
02 декабря 2015, 15:54
+2
Нет, HybridAuth создан для авторизации только через соцсети и других внешних сервисов.

Для обычной регистрации вы можете воспользоваться сниппетом Login. Но такая связка (login + hybridauth) потребует решения задачи «связки» пользователей, чтобы не плодить дубли аккаунтов, созданных через разные соцсети.

Уже готовая реализация гибридной авторизации через соцсети/форму + дополнительные возможности (редактирования профиля пользователя и тд) реализована в платном компоненте Office.
02 декабря 2015, 01:04
0
Да, с комментариями и вправду не самый удачный пример.

Статью почитаю, спасибо.)
02 декабря 2015, 00:55
0
Как выбрать все ресурсы, у которых не заполнен ТВ

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

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

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

Условие выше выводит результаты ТОЛЬКО с незаполненным tv-полем.
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:36
0
Ммм… не совсем понял в чем проблема.

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

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

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

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

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

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

Соответственно, если вы хотите вывести ресурсы с незаполненным полем, вам нужен код:
&includeTVs=`tv_name`
&where=`{"tv_name:IS": null}`
01 декабря 2015, 21:38
+1
Пришло! Спасибо.)
01 декабря 2015, 16:23
+3
Ну, код будет примерно таким:

if (isset($startJS)) {
	$startJS = explode(",", $startJS);
	
	foreach ($startJS as $value) {
		$modx->regClientStartupScript($value);
	}
}
— дальше только копировать и добавлять переменные и места инициализации.

UPD: Но да, minfiyx все это и так умеет.
01 декабря 2015, 14:32
0
Вообще, сильно тормозить при должном сервере не должно, тем более, что с момента статьи Николая Ланца прошло уже довольно много времени и кэширование в модксе также претерпело свои изменения.

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

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

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

UPD: Впрочем, вопрос оптимизации бесконечен, да и для по-настоящему больших проектов всегда предпочтительнее писать все конкретно под задачу.
01 декабря 2015, 14:21
0
Скриптом, например:

//Проверяем на пустоту
if (!$("идентификатор_формы").val()) {
	$(this).val("Значение_по_умолчанию");
}
01 декабря 2015, 14:11
+1
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 раз при создании страницы — то лучше вышеописанным способом.
30 ноября 2015, 12:29
+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]]`]]
`]]
29 ноября 2015, 15:09
0
Если количество записей непосредственно в суб-категории (а не все потомки для суб-категории в принципе), то в вышеописанном сниппете нужно убрать строчку получения всех потомков для потомков:
$pids = array_merge(array($parent), $modx->getChildIds($parent));

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

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

Если же вы спрашивали по поводу того, какой в каком шаблоне нужно вызвать данный сниппет, то ~так:
&displayStart=`1`
&tplStart // это шаблон для раздела (1 уровень)
&tplParentRow // это шаблон подразделов тут вставляем нужные сниппеты.
//также можно использовать &tplCategoryFolder, если у потомков нет своих потомков
&tpl //шаблон внутренних пунктов
29 ноября 2015, 14:58
0
P.S. Если не секрет, по какому принципу вы генерируете названия для своих вопросов?)
29 ноября 2015, 14:47
1
+2
Если вы выводите структуру при помощи 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]]`]]
28 ноября 2015, 22:02
0
Как убрать класс active из &tplStart
Мне нужен класс актив в родительском
Вас довольно сложно понять… В любом случае, у вас есть целый ворох параметров шаблонов для кастомизации корневых пунктов, разделов, внутренних пунктов и тд. Выбирайте нужный, где вам нужно убрать/добавить отображение класса «active» и редактируйте в соответствующем шаблоне плейсхолдер [[+classes]].