Василий Наумкин

Василий Наумкин

С нами с 08 декабря 2012; Место в рейтинге пользователей: #1
Василий Наумкин
04 декабря 2015, 05:30
+1
Опять это «к сожалению на modhost установлен nginx», как будто где-то он сегодня не установлен, или на Apache2 такого поведения нет. Приведу ответ Василия из поддержки modhost.pro:

Еще раз — какое отношение к вашей проблеме имеет хостинг? Почтайте, что ли, о ЧПУ. Её суть заключается в том, что запросы, которых реально нет на сервере отправляются на index.php с параметром.

То есть, если на сервере есть файл site.com/filename.txt, то nginx его отдаст сам. А если нет, то будет вызван
/index.php?q=/filename.txt
А дальше уже сам сайт определяет, что отдать на этот запрос — файл, редирект или 404.

Таким образом, при прямом запросе index.php?id=10 friendly urls и редиректы сервера не используются вообще. Движок получает команду показать 10ю страницу и сам её обрабатывает.

Версия MODX 2.2 при этом умела делать редиректы на канонический адрес. Новые версии, почему-то, перестали. Но каким образом за вас это должен исправлять хостинг — я отказываюсь понимать.

Откуда nginx вообще знает, какой именно адрес соответствуют 10 странице в MODX? Это знает только MODX. Ну и откуда у вас на сайте такие ссылки, чтобы к ним обращался поисковик — отдельный вопрос.

И
Покопался еще, и выяснил, что за это отвечает системная настройка request_method_strict, отключенная по умолчанию.

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

В плагине и правда нужно добавить проверку на $modx->context->key != 'mgr', тут я не доглядел.

P.S. Это АнтиСЕО началось с версии 2.3, насколько я могу судить. Это ж тысячи сайтов должны были просесть в выдаче.
Василий Наумкин
04 декабря 2015, 05:25
+1
Документация у нас открытая, можно редактировать через GitHub.

Допиши, что считаешь нужным, и пришли pull-request. Тогда эта информация добавится на сайте.

Все сетуют на плохую документацию, но никто, почему-то, не хочет её улучшать.
Василий Наумкин
03 декабря 2015, 20:20
2
0
Ну естественно, это мега-тайна, что все ТВ выбираются с префиксом tv. по умолчанию. В документации прям нет этого параметра. includeTVs, prepareTVs, processTVs и дальше пустота.

Можно и не делать пустой &tvPrefix, но тогда, не поверишь, нужно выводить ТВ вот так:
[[+tv.name]] - MODX
{$_pls['tv.name']} - Fenom
Про вывод через точку я тебе давал ссылку еще 2 часа назад.

А вообще, можно увидеть все плейсхолдеры, если просто не указывать чанк.
Василий Наумкин
03 декабря 2015, 19:24
0
Ну создай тестовый сайт и покажи нам эту проблему воочию — разберёмся.
Василий Наумкин
03 декабря 2015, 18:55
0
В чем именно тут ошибка использования? для $_modx нет getObject?
Именно.

Может, прочитаешь уже документацию, а?
Василий Наумкин
03 декабря 2015, 18:45
0
Да как обычно, всё работает только у меня и больше нигде.

Между {$modx} и {$_modx} есть очень серьёзная разница, и если ты пытаешься использовать вторую переменную как первую, то и будет fatal error.
Василий Наумкин
02 декабря 2015, 16:29
0
Ну, у меня проблем нет. В админке используются нормальные ТВ, при сохранении в ресурс они преобразовываются в значения ресурса, а дальше в выборках участвуют только поля ресурса.

Везде всё хорошо =)
Василий Наумкин
02 декабря 2015, 16:21
0
Да, новый вариант вот такой:
$scriptProperties['where'] = '["
	(Ticket.parent IN ('.$parents.') OR Ticket.show_on_start = 1)
	AND Ticket.hide_on_start = 0 
	AND Ticket.ticket_rating > -2
"]';
Собственно, именно поэтому я и предпочитаю не использовать ТВ вообще. И теперь это вполне возможно, даже без miniShop2.
Василий Наумкин
02 декабря 2015, 16:13
0
Ну там монструозненько было, с having и 3500 тикетов. Если интересно, вот старый страшный код:
$scriptProperties['leftJoin'] = json_encode(array(
	'Votes' => array('class' => 'TicketVote', 'on' => 'Votes.id = Ticket.id AND Votes.class = \'Ticket\''),
	'TVshow' => array('class' => 'modTemplateVarResource', 'on' => 'TVshow.contentid = Ticket.id AND TVshow.tmplvarid = 7'),
	'TVhide' => array('class' => 'modTemplateVarResource', 'on' => 'TVhide.contentid = Ticket.id AND TVhide.tmplvarid = 8'),
));
$scriptProperties['select'] = json_encode(array(
	'Votes' => 'SUM(Votes.value) as rating',
	'TVshow' => 'TVshow.value as show',
	'TVhide' => 'TVhide.value as hide',
));
$scriptProperties['having'] = '["rating > -2 OR rating IS NULL"]';
$scriptProperties['where'] = '["(Ticket.parent IN ('.$parents.') OR TVshow.value IS NOT NULL) AND TVhide.value IS NULL"]';
Василий Наумкин
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.
Василий Наумкин
02 декабря 2015, 08:51
0
даже если эта страница не относится к miniShop2
Если на этой странице вызывается сниппет, инициализирующий miniShop2 — то она уже к нему относится.

Сами по себе скрипты и стили не вставляются, их кто-то вставляет.
Василий Наумкин
01 декабря 2015, 06:57
0
Параметр &linkTTL у сниппета OfficeAuth, в секундах.

По умолчанию как раз 10 минут, проверил.
Василий Наумкин
01 декабря 2015, 06:44
0
В последних версиях Office, если пытаться зайти неактивированным юзером, то отправляется повторная ссылка на активацию. Но не чаще чем раз в 30 минут.

Как у других дополнений — не знаю.
Василий Наумкин
30 ноября 2015, 15:05
0
1. pdoPage не принимает массивы, он вызывает сниппет, которому передаёт offset и limit.
2. Сниппет делает запрос в БД. По умолчанию это pdoResources, который использует ровно те же методы, что и метод $_modx->getResources().
3. Результат оформляется в чанки тем же pdoResources, который использует Fenom.
4. Вывод на страницу.

Скажи пожалуйста, зачем пытаться сделать всё наоборот? Просто потому, что заняться нечем?
Василий Наумкин
30 ноября 2015, 14:54
0
Сниппеты MODX могут возвращать исключительно строки
Не нужно вешать на шаблонизатор вообще всё, что только в голову приходит.

Он для оформления, а не для работы с БД.
Василий Наумкин
30 ноября 2015, 14:48
0
Учитывая, что у Fenom есть доступ к GET — не вижу проблем.

Только pdoPage это всё равно сделает лучше.