Дмитрий Иванов

Дмитрий Иванов

С нами с 23 октября 2014; Место в рейтинге пользователей: #210
Андрей
21 февраля 2018, 14:11
2
0
Потому что where это выборка по условию, так и будет работать. Если нужно чтобы были вверху, надо использовать параметр sortby, который принимает json массив, примерно как то так будет:

&sortby=`{"Data.popular":"desc", "Data.new":"desc", "publishedon":"desc"}`
Кирилл
13 апреля 2017, 18:19
1
0
Извиняюсь, посмотрел внимательнее, у меня стоит плагин, который редиректит index.php и все, что с ним связано. Найден на просторах интернета, если нужно, вот код:

<?php
switch ($modx->event->name) {
    case 'OnHandleRequest':
        if (strpos($_SERVER['REQUEST_URI'],'index.php') !== false && $modx->context->get('key') != 'mgr') {
            if (!empty($_GET['id'])) {
                $id = (int)$_GET['id'];
                if (!$modx->getCount('modResource', array('id' => $id, 'published' => 1, 'deleted' => 0))) {
                    $modx->sendErrorPage();
                } 
            } else {
                $id = $modx->getOption('site_start', null, 1);
            }
            $modx->sendRedirect($modx->makeUrl($id),array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
        }
        break;
}
Алексей Смирнов
24 марта 2017, 09:15
1
+1
В общем, решение следующее. Без плагинов:
Копируем снипет TiketsComments — переименовав в удобное для вас имя. (чтобы обновлением не затерлось)
И заменяем строку 9 на:
$scriptProperties['commentEditTime'] = $modx->getOption('tickets_comment_edit_time', $scriptProperties, 180);
Где 180 — Время по умолчанию в секундах. tickets_comment_edit_time — Имя переменной которую указываем в параметре снипета.
Возможно тут еще есть варианты, но сейчас пока нет времени искать. Думаю, можно Василию написать просьбу сделать параметр этот из коробки. :)
Максим Кузнецов
24 января 2017, 12:38
3
+1
Примерно так в плагине, но это решение увеличит время создания основной страницы:

if ($modx->event->name == 'OnDocFormSave' && $mode == 'new') {
	$contexts = $modx->getCollection('modContext', array('key:!=' => 'mgr'));

	if ($curr_ctx_key = array_search($resource->get('context'), $contexts)) {
		unset($contexts[$curr_ctx_key]);
	}

	foreach ($contexts as $context) {
		//Создаем ресурс (заполняем все основные не-тв поля)
		$response = $modx->runProcessor('resource/create', array(
			'template' => $resource->get('template'),
			'isfolder' => $resource->get('isfolder'),
			'published' => $resource->get('published'),
			'pagetitle' => $resource->get('pagetitle'),
			'parent' => '', //нужно додумать логику, как связывать родителей из одного контекста с другим
		));
		
		if ($response->isError()) {
			return $modx->error->failure($response->getMessage());
		}
		else {
			//Получаем id свежесозданной копии
			$newId = $response->response['object']['id'];
		
			//Заполняем тв-поля
			$newPage = $modx->getObject('modResource', $newId);
			
			$newPage->setTVValue('Поле_1', $resource->getTvValue('Поле_1'));
			$newPage->setTVValue('Поле_2', $resource->getTvValue('Поле_2'));
			//...
		
			$newPage->save();
		}
	}

	$modx->cacheManager->clearCache();

}
Дмитрий Середюк
11 апреля 2016, 23:30
2
0
Если актуально еще то вот ссылка на пример!

Вызов pdoMenu
[[!pdoMenu?
&parents=`2`
&level=`0`
&outerClass=`anyClass skinClear`
&firstClass=`0`
&lastClass=`0`
&hereClass=`0`
&levelClass=`levels`
&tplInner=`@INLINE <ul>[[+wrapper]]</ul>`
]]

js
(function ($) {
              $.fn.liHarmonica = function (params) {
                var p = $.extend({
                  currentClass: 'cur', //Класс для выделенного пункта меню
                  onlyOne: true, //true - открытым может быть только один пункт, 
                  //false - число открытых одновременно пунктов не ограничено
                  speed: 500 //Скорость анимации
                }, params);
                return this.each(function () {
                  var
                  el = $(this).addClass('harmonica'),
                    linkItem = $('ul', el).prev('a');
                  el.children(':last').addClass('last');
                  $('ul', el).each(function () {
                    $(this).children(':last').addClass('last');
                  });
                  $('ul', el).prev('a').addClass('harFull');
                  el.find('.' + p.currentClass).parents('ul').show().prev('a').addClass(p.currentClass).addClass('harOpen');
                  linkItem.on('click', function () {
                    if ($(this).next('ul').is(':hidden')) {
                      $(this).addClass('harOpen');
                    } else {
                      $(this).removeClass('harOpen');
                    }
                    if (p.onlyOne) {
                      $(this).closest('ul').closest('ul').find('ul').not($(this).next('ul')).slideUp(p.speed).prev('a').removeClass('harOpen');
                      $(this).next('ul').slideToggle(p.speed);
                    } else {
                      $(this).next('ul').stop(true).slideToggle(p.speed);
                    }
                    return false;
                  });
                });
              };
            })(jQuery);
            
            /*Инициализация плагина*/
            $(function () {
              $('.anyClass').liHarmonica({
                onlyOne: false,
                speed: 500
              });
              $('.anyClass2').liHarmonica({
                onlyOne: false,
                speed: 400
              });
            });

css
/*skin Clear [.skinClear]*/
 .skinClear, .skinClear ul {
  list-style:none;
  padding:0;
  margin:0;
  font:14px/1.2em Arial, Helvetica, sans-serif
}
.skinClear ul {
  display:none;
  margin:0 0 0 10px;
  
}
.skinClear li {
  list-style:none;
}
.skinClear a {
  color:#888;
  display:block;
  position:relative;
  text-decoration:none;
  padding:1px 0 1px 9px;
}
.skinClear a:before {
  content:'';
  width: 0;
  height: 0;
  border:0;
  display:inline-block;
  position:absolute;
  top:5px;
  left:0px;
  margin:0 4px 0 0;
}
.skinClear a.harFull.harOpen:before {
  border:0;
  border-left: 3px solid transparent;
  border-top: 4px solid #000;
  border-right: 3px solid transparent;
  top:7px;
}
.skinClear a.harFull:before {
  border:0;
  border-top: 3px solid transparent;
  border-left: 4px solid #000;
  border-bottom: 3px solid transparent;
  top:5px;
}
.skinClear a:hover {
  text-decoration:underline;
}
.skinClear a.cur {
  color:#000
}
.skinClear a.harOpen {
  color:#000
}

ссылка на источник!
Василий Наумкин
01 марта 2016, 09:46
3
+1
$modx->log(1, print_r(array_keys($scriptProperties),1));
Василий Наумкин
28 декабря 2015, 15:30
4
+3
Обожемой, зачем откапывать рецепты из Evolution?
<?php
switch ($modx->event->name) {    
	case 'OnBeforeDocFormSave':
		if ($modx->user->get('id') != $object->get('createdby')) { 
			$modx->event->output('Ошибка! У вас нет прав редактировать этот документ');
		};
	break;
}

Василий Наумкин
12 декабря 2015, 20:21
1
0
То есть, речь о том, что Jevix преобразовывает сущности в нормальные символы, чтобы потом повырезать всякую дрянь?

Ну, чтобы пользователь не смог тупо написать
&lt;script&gt;alert()&lt;/script&gt;
а иначе, все эти проверки обходились бы очень легко.

Может, ленивому разработчику лучше сначала отдавать документ Jevix, а потом уже экранировать всякое опасное, как это делает Tickets?

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

И Jevix, и Fenom, и создание всякого с фронтенда — это всё не работает по умолчанию, нужно включить и использовать самостоятельно.
Василий Наумкин
02 декабря 2015, 15:57
3
+2
Прикольно, именно так уже какое-то время и фильтруются новости на главной modx.pro. Там есть 2 ТВ параметра: выводить на главной, или скрывать на главной.

При работе с ТВ запрос с фильтрацией по этим 2м ТВ выходил под 0.5 сек, сейчас — 0.06 сек. Мой плагин выглядит вот так:
<?php
switch ($modx->event->name) {
	
	case 'OnMODXInit':
		$modx->loadClass('modResource');
		$modx->map['modResource']['fields']['show_on_start'] =
		$modx->map['modResource']['fields']['hide_on_start'] = 
		$modx->map['modResource']['fields']['ticket_rating'] = 0;
		$modx->map['modResource']['fieldMeta']['show_on_start'] =
		$modx->map['modResource']['fieldMeta']['hide_on_start'] = array(
			'dbtype' => 'tinyint',
			'precision' => 1,
			'attributes' => 'unsigned',
			'phptype' => 'boolean',
			'null' => true,
			'default' => 0,
		);
		$modx->map['modResource']['fieldMeta']['ticket_rating'] = array(
			'dbtype' => 'int',
			'precision' => 10,
			'attributes' => '',
			'phptype' => 'int',
			'null' => true,
			'default' => 0,
		);
		break;
		
		case 'OnBeforeDocFormSave':
			$resource->set('show_on_start', !empty($resource->get('tv7')));
			$resource->set('hide_on_start', !empty($resource->get('tv8')));
			break;
		
		case 'OnTicketVote':
			if ($object->class == 'Ticket') {
				if ($ticket = $modx->getObject('Ticket', $object->id)) {
					$properties = $ticket->getProperties('tickets');
					$rating = !empty($properties['rating'])
						? $properties['rating']
						: 0;
					$ticket->set('ticket_rating', $rating + $object->value);
					$ticket->save();
				}
			}
			break;
}
Ка видите, там еще и сортировка по рейтингу тикетов есть — дарю! OnTicketVote был добавлен в последней версии Tickets.
Василий Наумкин
20 октября 2014, 12:08
4
0
С версии MODX 2.3 у ресурса есть свой метод clearCache.
if ($resource = $modx->getObject('modResource', 15)) {
	$resource->clearCache();
}