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

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

С нами с 01 июля 2013; Место в рейтинге пользователей: #33
Максим Кузнецов
26 июня 2015, 22:39
0
[[+parametr_name:default=`значение_по_умолчанию`]] так?)

Или вы спрашиваете о чем-то другом?
Максим Кузнецов
26 июня 2015, 22:38
1
0
Создайте плагин на событие OnDocFormSave (+ какой-нибудь доп.фильтр, чтобы чистился только из фронта) или вшейте в сниппет создания ресурса с фронтэнда:
$modx->cacheManager->refresh(array(настройки_для_детальной_очистки_кэша));
или
$modx->cacheManager->clearCache(путь до кэша, доп.опции);
Подробнее здесь.
Максим Кузнецов
26 июня 2015, 20:14
0
Оу, не знал.) А он динамично обновляется при аяксе?
Максим Кузнецов
26 июня 2015, 20:01
0
Если ли в консоле браузера ошибка js?

Вполне может быть, что конфликтует — тогда попробуйте отключить в системных настройках tickets'а редактор и подключить ваш редактор руками через javascript.
Максим Кузнецов
26 июня 2015, 19:54
0
Содержимое ресурса = контент?

Можно визуально скрывать через javascript:
<script type="text/javascript">
$(document).ready(function(){
	checkFirstPage();
});
$(document).ajaxStop(function(){
	checkFirstPage();
});

function checkFirstPage() {
	var page = getUrlParameter('page'); //если вы заменили дефолтный атрибут пагинации с ?page= на что-то другое - нужно подставить заместо 'page'
	if (page == 1 || page.length == 0) {
		$("#id_контейнера_с_контентом").css("display", "block");
	}
	else {
		$("#id_контейнера_с_контентом").css("display", "none");
	}
}

function getUrlParameter(sParam)
{
    var sPageURL = window.location.search.substring(1);
    var sURLVariables = sPageURL.split('&');
    for (var i = 0; i < sURLVariables.length; i++) 
    {
        var sParameterName = sURLVariables[i].split('=');
        if (sParameterName[0] == sParam) 
        {
            return sParameterName[1];
        }
    }
}
</script>

Если такой вариант не подходит, то нужно писать сниппет и каждый раз запускать его при вызове ajax'a.
Максим Кузнецов
26 июня 2015, 17:41
+1
Вообще, для одного заголовка правильнее в сниппете ajaxReturn получать данные через pdoField и не морочиться с чанком articleTitle, но в примере я написал через pdoResources на случай, если потребуется возвращать целое превью статьи.
Максим Кузнецов
26 июня 2015, 17:33
+1
Тогда, как и сказал Илья Уткин, только через ajax.

Постараюсь помочь. Вот примерное решение:

В том месте, где вызываете select со списком, пишем:
<select class="form-control" id="articleSwitch">
	[[!pdoResources? &tpl=`articleSelectOption`]]
	//здесь нужно донастроить параметры для pdoResources, чтобы возвращался список только ваших статей
</select>

Создаем чанк articleSelectOption с содержимым:
<option data-id="[[+id]]" class="link">[[+pagetitle]]</option>

Теперь, где-нибудь внизу страницы после подключенного Jquery пишем:
<script type="text/javascript">
	var canSwitch = true;
	$('#titleSwitch').on('change', function() {
		if (canSwitch == true) {
		
			$.ajax({
				type: "POST",
				url: window.location.href,
				data: {action: 'getArticle', articleId: $("#titleSwitch option:selected").attr("data-id")},
			
				beforeSend: function(){
					canSwitch = false;
				},
			
				success: function(response) {
					$("#article-title").html(response); //здесь мы вставляем нужный результат в контейнер с id = article-title
	
					canSwitch = true;
				}
			});
		}
		return;	

	});
</script>
— при помощи этого мы через ajax обратимся к сниппету, который возвратит нам желаемые данные (в нашем случае — заголовок). Создадим сам сниппет (допустим ajaxReturn):

ajaxReturn
<?php
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}

if (empty($_POST['action'])) {return;}

switch ($_POST['action']) {
	case 'getArticle':
		if (empty(intval($_POST['articleId']))) {
			return;
		}
		$articleOptions = array();
		$articleOptions['resources'] = intval($_POST['articleId']);
		$articleOptions['tpl'] = 'articleTitle'; //шаблон для возвращаемых данных
		//здесь по аналогии можно дописать доп. опции для сниппета pdoResources, через который мы получим результат
		
		$result = $modx->runSnippet('pdoResources', $articleOptions);
		
		break;
}

if (isset($result)) {
	die($result);
}
— теперь в самом низу страницы до закрыващего тега вызовем этот сниппет [[!ajaxReturn]]

Осталось только создать чанк articleTitle, с содрежимым, допустим [[+pagetitle]]
Максим Кузнецов
26 июня 2015, 17:10
+1
&select=
`{
	"modResource":"*"
,"120x90":"120x90.url as 120x90"
}`
— здесь modResource замените на Data, пожалуйста. Если по-прежнему не поможет — приложите лог (&showLog=`1`) — постараюсь помочь.

//upd: вообще, единственное, кроме вышеописанного, что может быть настроено здесь не правильно — пути до таблиц с превьюшками. Они, скорее всего, отличаются от моего примера для ms2Gallery
Максим Кузнецов
26 июня 2015, 16:44
+1
Да, т.к. mSearch2 работает на pdoTools — он переварит &leftJoin и &select.
Максим Кузнецов
26 июня 2015, 15:43
+1
Если вы хотите вставить только заголовок (или любые другие данные, которые уже есть на данной странице в статьях):
<select class="form-control" id="titleSwitch">
	//здесь вызов при помощи pdoResources всех статей. Чанком отображения будет: <option class="link">[[+pagetitle]]</option>
</select>

<article>
	<span id="article-title">Статья - 1</span>
</article>


<script type="text/javascript" src="https://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
	$('#titleSwitch').on('change', function() {
		$("#article-title").text($("#titleSwitch option:selected").text()); //берем значение выбранной опции select-a и вставляем в заголовок
	});
</script>

— в противном случае, если данные нужно подгружать — то да, только ajax.
Максим Кузнецов
26 июня 2015, 14:36
1
0
mSearch вызывает результаты через pdoResources, а значит:

а) можно вывести thumbs через leftJoin вот так (данный пример для вывода превьюшек msGallery2, а для msGallery minishop'a, соответственно, нужно прописать его данные с бд):
&leftJoin=`{
	"75x75": {"class":"msResourceFile","alias":"75x75", "on": "75x75.resource_id = modResource.id AND 75x75.path LIKE '%/75x75/' AND 75x75.rank=0"}
}`
&select=`{
	"modResource":"*"
	,"75x75":"75x75.url as 75x75"
}`
б) можно применить параметры &class=`msProduct` &element=`msProducts` &includeThumbs=`75x75`

— ну и 75х75 заменить на желаемый размер превьюшек
Максим Кузнецов
25 июня 2015, 13:52
0
Если вы хотите отображать в корзине свои доп. параметры, вам нужно расширить класс корзины и внутри перебора товаров для отображения добавить строку:

foreach ($cart as $k => $v) {
	...
	//добавляем опцию цвета.
	$row['color'] = $product->get('color');
	...
}
Т.е. модифицируется сегмент не на шаге «добавления», а на шаге «отображения» товара.
Максим Кузнецов
25 июня 2015, 11:27
0
Да не за что… Сам же разобрался.)
Максим Кузнецов
24 июня 2015, 23:30
0
Мм… а если по-отдельности вызывать pdoResources? Сначала первый, потом первый стереть и вызвать второй — результаты будут корректными?

И, если не затруднит, скиньте древо ваших ресурсов, которые вы вызываете. Пытаюсь понять глубину вложения и, возможно, исходя из этого их можно вызывать как-то иначе, не прибегая к такой куче pdoField-ов.
Максим Кузнецов
24 июня 2015, 21:03
+1
Мм… попробуйте теста ради удалить &tplLast у обоих вызовов, а &tpl заменить на чанк с содержимым [[+id]] — посмотреть, какие ресурсы возвращают. Если по логам все ок и айди возвращаются нормальные, то проблема, скорее всего, в чанках.
Максим Кузнецов
24 июня 2015, 20:26
+1
По поводу картинок, как-то так, например:
&leftJoin=`{
	"75x75": {"class":"msResourceFile","alias":"75x75", "on": "75x75.resource_id = modResource.id AND 75x75.path LIKE '%/75x75/' AND 75x75.rank=0"}
}`
&select=`{
	"modResource":"*"
	,"75x75":"75x75.url as 75x75"
}`
75x75, соответственно, меняете на ваши пропорции и вызывается в чанке как [[+75x75]]. А вообще — вот.

Что же до основной проблемы — ну, судя по логам, все ок. Могу предложить следующее:
а) вызывать pdoFetch некэшированным
б) обновить кэш
в) попробовать вызывать результаты pdoResources в плейсхолдеры.

+ возможно, хоть и маловероятно, что как-то барахлит &tplLast.

И, если не секрет, если вы указываете при помощи tv — родителей, то зачем вам &depth= `2`? Не может ли так выйти, что они в древе из-за 2х уровней и сортировке по publishedon выходят на один и тот же список?
Максим Кузнецов
24 июня 2015, 16:50
0
Если вы ставите с Modx'a — то, вероятнее всего, нужно просто подождать, сайт модкса подвисает.

В противном случае, вы можете скачать редактор ace с репозитория, залить архив по адресу core/packages/, после чего перейти в установщик и выбрать опцию «искать пакет локально».
Максим Кузнецов
24 июня 2015, 16:17
+1
Думаю, самым оптимальным по нагрузке решением будет реализация через api, где при помощи цикла в выборке проверять, есть ли уже статья с данным автором, и если да — пропускать, а если нет — добавлять в массив для вывода.

В противном случае, вам разве что pdoResources с &limit=`1` и where author == [[+username]] вызывать внутри чанка pdoUsers, где указаны все id авторов. (но это очень плохое решение)
Максим Кузнецов
23 июня 2015, 15:46
0
Ну и отлично.
И да, если у вас будет время — посмотрите, все-таки, метод reload в этом скрипте — уничтожать и заново создавать древо, на мой взгляд, выглядит как костыль и грозит утечкой памяти.
Максим Кузнецов
23 июня 2015, 15:40
0
Если не проблемно — киньте линк на сайт.

И у masonry, похоже, есть свой метод для обновления — container.masonry(«reloadItems»);. Возможно, вам вызывать на событие on('mse2_load') нужно его.