Владимир

Владимир

С нами с 28 декабря 2012; Место в рейтинге пользователей: #53
Василий Наумкин
10 октября 2017, 12:39
6
+5
Если покопаться в MODX API то можно научиться выводить любой ресурс в плагине на нужном событии:
$modx->resource = $modx->getObject('modResource', $modx->getOption('site_start'));
$modx->resource->set('content', $pdoTools->runSnippet('@FILE snippets/get_panel.php'));
$modx->request->prepareResponse();
Здесь, как видно, еще и замена контента на свой идёт, на лету.

Можно так на лету и виртуальные ресурсы делать, со своими pagetitle и прочими свойствами. При желании, можно вообще весь сайт без ресурсов сделать =)
Роман
04 октября 2017, 12:00
2
+1
Плагин на событие OnLoadWebDocument:
<?php
$id = $modx->resource->get('id'); // Get current page id
$resource = $modx->getObject('modResource',$id); // Get current object
$template = $modx->resource->template; // Get current page template
if($template == 5 && isset($_GET['amp'])) {
	$modx->resource->set('template', 23); 
} 
$modx->resource->cacheable = false; // Disable cache
В шаблонах
// что бы показать, что у тебя есть amp страница
<link  rel="amphtml" href="http://site.ru/page?amp" />
// на amp странице показать главную, что бы не было дублей
<link  rel="canonical" href="http://site.ru/page" />
Проверка тут: search.google.com/test/amp

Всем спасибо, работает!
Илья Уткин
03 октября 2017, 14:24
1
+2
<?php
$id = 15;
$resource = $modx->getObject('modResource', $id);
$thisContent = $resource->content;
preg_match('/<img(.*)src(.*)=(.*)"(.*)"/U', $thisContent, $regexResult);
$firstImgScr = array_pop($regexResult);
return $firstImgScr;
Илья Уткин
01 октября 2017, 14:41
2
+4
АААААА… не надо return менять на echo…

// ...
$output = array();
foreach ($rows as $key => $row) {
        // ...
	$pdo = $modx->getService('pdoTools');
	if (empty($chunk)) {
		$output[] = '<pre>' . $pdo->getChunk('', $row) . '</pre>';
	} else {
		$output[] = $pdo->getChunk($chunk, $row, false);
	}
}
return implode(PHP_EOL, $output);
Илья Уткин
14 сентября 2017, 10:36
2
+3
Да, перед проверкой псевдонима никакое событие не вызывается. Здесь используется дополнение Tickets — тикеты это расширенные ресурсы с дополнительным функционалом, в том числе, со своим механизмом генерации URL.

Можно как костыль использовать такое решение:
1. Включаем автоматическую генерацию псевдонима
2. В плагине проверяем — если псевдоним ресурса такой же, как его сгенерировал бы MODX, заменяем псевдоним:
<?php
switch ($modx->event->name) {
    case 'OnDocFormSave':
        $generated = $resource->cleanAlias($resource->pagetitle);
        if ($resource->alias == $generated) {
            $resource->set('alias', $resource->id);
        }
        $resource->save();
        break;
    default:
        break;
}

Но это, конечно, очень грязный хак — ведь где-то автоматически сгенерированный псевдоним будет реально нужен. Нужно ограничивать работу плагина, например, родителем ресурса или его шаблоном.
Василий Наумкин
12 сентября 2017, 11:40
2
+4
{var $ids = $_modx->getParentIds($_modx->resource.id)}
{if '11' in list $ids}
  Фильтры для пылесосов
{else}
  Фильтры для вытяжек	
{/if}
Код не проверял, но логика примерно такая: получить массив с родителями текущего ресурса и проверить, если ли среди них нужный.
Stan Ezersky
10 сентября 2017, 13:56
2
+2
Хотлинк-защита

location /images/ {
	valid_referers none blocked www.host.com host.com;
	if ($invalid_referer) {
		return 403;
	}
}
Павел Гвоздь
24 августа 2017, 19:11
4
0
Так а чего там решать, все просто до ужаса:
if ($modx->event->name == 'OnDocFormSave' && $mode == 'new' && is_object($resource) && $resource->get('class_key') == 'msProduct') {
    $resource->set('alias', ($resource->get('alias') . '-' . $id));
    $resource->save();
}
Павел Степанов
22 августа 2017, 21:14
1
+1
Повесил на событие OnHandleRequest
<?php
if (strpos($_SERVER['REQUEST_URI'],'index.php') !== false && $modx->context->get('key') != 'mgr') {
    $modx->sendErrorPage();
}
Работает отлично
Попробую через .htaccess
t.g
t.g
22 августа 2017, 21:11
1
+2
Вешаете на событие OnHandleRequest, или через файл .htaccess можна так.
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]