Владимир

Владимир

С нами с 28 декабря 2012; Место в рейтинге пользователей: #90
Василий Наумкин
23 января 2016, 10:55
2
+1
Отвечает «отец-основатель», который отказывается обучать javascript всех желающих в техподдержке дополнения.

Я действительно не понимаю, в чём может быть проблема вывести какие-то значения в чанке, а потом скопировать их через javascript.
Если это получается сделать с title и alt, что мешает это сделать с другими элементами? Очевидно, вы просто не знаете, как работать с jQuery.

В моём коде title и alt — это атрибуты тега img, поэтому и обращение к ним идёт через image[0].title и image[0].alt. Если рядом с картинкой будет элемент с классом, например, desc, то получить его можно так:
var image = $(this).find('img'); // здесь ищем картинку - это из оригинального кода

var desc = $(this).find('.desc'); // а рядом можно поискать элемент с классом desc
// После этого содержимое элемента desc можно вставить куда угодно. Например, в элемент .mainImageDesc 
var imageDesc = gallery.find('.mainImageDesc');
imageDesc.text(desc.text());
Это весь нужный javascript код. 80 lvl не требуется даже близко.

Чтобы всё работало, нужно не забыть вывести описание на страницу:
<div class="span2 col-md-2">
	<a href="[[+360x270:default=`[[+url]]`]]" class="thumbnail" data-image="[[+url]]">
		<img src="[[+120x90]]" alt="[[+alt]]" title="[[+name]]" width="120" height="90">
		<div class="desc" style="display:none;">[[+description]]</div>
	</a>
</div>
Я вывожу его в скрытом виде, чтобы не мешало.

А еще нужно предусмотреть блок для вывода текста в главной картинке
<div class="ms2Gallery">
	<a rel="fancybox" href="[[+url:default=`/assets/ms2gallery/minishop2/img/web/ms2_big.png`]]" target="_blank">
		<img src="[[+360x270:default=`/assets/components/ms2gallery/img/web/ms2_medium.png`]]" width="360" height="270" alt="[[+alt]]" title="[[+name]]" class="mainImage" />
	</a>
	<div class="mainImageDesc">[[+description]]</div>
	<div class="row">
		[[+rows]]
	</div>
</div>

Как видно, речь исключительно о работе с javascript, никаких особенностей, связанных с ms2Gallery, здесь нет.
Василий Наумкин
20 января 2016, 18:48
1
0
Ладно, а теперь без шуток.

HybridAuth прекрасно работает в нескольких контекстах, но для этого:
1. Нужно указывать &loginContext=`` и &addContexts=`` соответствующими контексту.
2. Всем этим контекстам должна быть доступна одна общая сессия. Если на сайте 3 поддомена, то у них по умолчанию 3 разных сессии и при авторизации в одном контексте, другие ничего не видят.

На всякий случай, авторизует не HybridAuth, а процессоры авторизации MODX. Они же используются и в Office, и в Login и в любых других нормальных дополнениях. Для того они и придуманы.

Еще советую переписать свой плагин переключения контекстов.
Іван Клімчук
19 января 2016, 15:45
1
+1
Ну окей, tech.yandex.ru/metrika/?ncrnd=285 — вот апи. Весь учет поведения (настроить тоже можно как угодно, включая цели и тд) берет на себя метрика, через апи на сайте делается логика.

Я не вижу смысла в вашем случае такие объемы данных генерировать и хранить у себя. Что вы будете делать через год, когда база вашего трекинга разрастется до несколькоих десятков гигабайт? А по вашей логике код должен эту базу каждый раз шерстить и выдавать то, что показать пользователю.
Alexander V
16 января 2016, 12:44
1
+1
I have this issues too on modx 2.3.5, however I managed to solve the first one by adding the following code after line 243 in /core/components/assman/controllers/BaseController.php
$this->modx->regClientCSS('templates/default/css/index.css');
Илья Уткин
12 января 2016, 11:23
2
+3
Установить Console и запустить в нем что-то типа такого:

<?php
// Сколько ресурсов обрабатывать за раз
$step = 1;
// Если процесс уже остановлен, сбрасываем OFFSET
if (!isset($_SESSION['Console']['completed'])) {
    $_SESSION['console_offset'] = 0;
}
$offset = isset($_SESSION['console_offset']) && $_SESSION['console_offset'] ? $_SESSION['console_offset'] : 0;
// Формируем запрос
$q = $modx->newQuery('modResource');
$total = $modx->getCount('modResource', $q);
// Пропускаем все уже обработанные объекты
$q->limit($step, $offset);
$resources = $modx->getCollection('modResource', $q);
// Обработка
foreach ($resources as $resource) {
    $modx->runProcessor('resource/update', $resource->toArray());
}
// Меняем offset
$_SESSION['console_offset'] = $offset + $step;
if ($_SESSION['console_offset'] >= $total) {
  $sucsess = 100;
  $_SESSION['Console']['completed'] = true;
} else {
  $sucsess = round($_SESSION['console_offset'] / $total, 2) * 100;
  $_SESSION['Console']['completed'] = false;
}
for ($i=0; $i<=100; $i++) {
    if ($i <= $sucsess) {
        print '=';
    } else {
        print '_';
    }
}
print "\n";
print $sucsess.'% ('.$_SESSION['console_offset'].')'."\n\n";
Андрей
25 декабря 2015, 10:33
1
+2
Самое оно!
Обнаружил ряд мелких недочетов. Скорее всего даже опечаток.
1. В скрипте
$(document).on('click','#read-more',function(e){
В разметке же написан не id а класс:
<a class="read-more" data-id="5" href="#">Подробнее</a>
2. В коннекторе ajax.php проверяем на наличие action
...empty($_REQUEST['action'])...
В разметке его нет вообще.
<a class="read-more" data-id="5" href="#">Подробнее</a>
И теперь вопрос еще по коду. А как мне вместо надписи Модальное окно в самом модальном окне)) выводить заголовок статьи pagetitle?

P.S. Письмо о регистрации с Вашего сайта мне так и не пришло))
Ivan Shvindin
23 декабря 2015, 16:54
1
+2
лучше ставь
friendly_alias_restrict_chars = alphanumeric
это разрешит только цифры, буквы и обычные дефисы
Ярослав
17 декабря 2015, 11:38
1
+4
Была у меня такая ситуация. Решил её маленьким плагином.
<?php
$page = $modx->sanitizeString($_GET['page']);
if ($page != null) {
$pageIdTo = (int)$modx->resource->get('id');
$site = $modx->makeUrl($pageIdTo, "", "", "full");
return $modx->sendRedirect($site);
}
При обновлении страницы он уберёт get параметры и загрузится первая страница. В событиях должна стоять галочка «OnWebPagePrerender»
Максим Кузнецов
15 декабря 2015, 19:22
2
0
По своему опыту реализации такой задачи, опишу главную особенность его интеграции: единожды инициализировав редактор на форме и, впоследствии, при попытке переместить ее, используя, допустим, кнопку «ответить», редактор будет умирать. Тоже самое с ним случается при добавлении им комментария через ajax.
Данная проблема актуальна для данного редактора и решается последовательным уничтожением в dom-e и последующей повторной инициализацией.

Соответственно — необходимо вынести процесс создания/удаления редактора, написать свою логику работы при нажатии на кнопку «ответить» (до уничтожения формы сохранять уже введенные данные и вставлять в свежесозданную форму) и отредактировать tickets/js/web/default.js, вклинив в него нужные процессы.

Для наглядности, приведу пример часть своего кода, которым решал данную задачу.

Функция создания/удаления формы:
var editor, editorText;
	
function createCommentEditor() {
	if (!editor) {
		editor = CKEDITOR.replace('comment-editor', {
			customConfig: 'comments.config.js'
		});
		CKEDITOR.instances['comment-editor'].setData(editorText);
	}
}
function removeCommentEditor() {
	if (editor) {
		editorText = editor.getData();

		editor.destroy();
		editor = null;
	}
}

Первичное создании формы и логика для кнопки «ответить»:
//первичное подключение редактора
	createCommentEditor();

	//при нажатии на кнопку "ответить"
	$('.comment-reply > a.reply').click(function(){
		//replyMe - класс, навешивающийся на кнопку "ответить" при первом нажатии
		
		//если пользователь нажал на уже активную кнопку "ответить" - возвращаем редактор на место
		if($(this).hasClass('replyMe')) {
			removeCommentEditor();
			//#formWillReturn - контейнер, где по умолчанию находится форма (в дефолтном состоянии)
			//#comment-form - айди формы редактора
			$("#comment-form").appendTo("#formWillReturn");
			createCommentEditor();
			//#returnEditor - id кнопки "вернуть редактор на место"
			$("#returnEditor").hide();
		}
		else {
			//здесь переносим редактор под комментарий, на который пользователь хочет ответить
			//кнопка "ответить" находится внутри элемента li с классом ticket-comment и атрибутом data-id=[[+id]]
			var place = $(this).parents('li.ticket-comment').data('id');
			removeCommentEditor();
			
			//у каждого элемента li.ticket-comment есть по умолчанию пустой контейнер для редактора вида <div id="comments-tree-[[+id]]"></div>
			//вставляем в него редактор
			$("#comment-form").appendTo("#comments-tree-"+place);
			
			createCommentEditor();
			
			//показываем кнопку "вернуть редактор на место"
			$("#returnEditor").show();
		}
	});
	
	//при нажатии на кнопку "вернуть редактор"
	$('#returnEditor').click(function(){
		//удаляем все выделенные кнопки "ответить"
		$('.comment-reply a').removeClass('replyMe');
		removeCommentEditor();
		$("#comment-form").appendTo("#formWillReturn");
		createCommentEditor();
		//возвращаем скрытому полю параметр родителя, к которому комментарий будет привязываться в случае успешного добавления
		$('#comment-form input[name="parent"]').val(0);
		
		//прячем кнопку "вернуть редактор"
		$("#returnEditor").hide();
	});

tickets/js/web/default.js
var Tickets = {
	...
	,ticket: {
		...
		,save: function(form, button)  {
			$(form).ajaxSubmit({
				...
				,success: function(response) {
					$(button).removeAttr('disabled');
					if (response.success) {
						//Если комментарий успешно добавлен - реинициализируем форму
						removeCommentEditor();
						Tickets.forms.comment(false);
						$('#comment-preview-placeholder').html('').hide();
						//и очищаем ее
						$('#comment-editor',form).val('');
						
						//после инициализации мы возвращаем форму на место, так что прячем кнопку "вернуть редактор", если она была
						$("#returnEditor").hide();
						$('.ticket-comment-body').removeClass('antwortComment');

						// autoPublish = 0
						if (!response.data.length && response.message) {
							Tickets.Message.info(response.message);
						}
						else {
							Tickets.comment.insert(response.data.comment);
							Tickets.utils.goto($(response.data.comment).attr('id'));
						}
						
						editorText = '';
						

						Tickets.comment.getlist();
						prettyPrint();
						createCommentEditor();
						
						...

Данное решение было выполнено довольно давно (~начало 2014), поэтому не исключаю, что в редакторе/коде тикетсов что-то поменялось, но не уверен, что это в значительной степени изменит логику работы.

Возможно, забыл добавить какой-то кусок кода — в случае чего пишите.

UPD: плюс, насколько я помню, у тикетсов была проблема с подхватыванием введенных пользователем данных в форму ckeditor, но затрудняюсь сказать точнее.