Владимир

Владимир

С нами с 28 декабря 2012; Место в рейтинге пользователей: #90
Сергей Шлоков
03 сентября 2015, 23:34
2
+3
Вообще полезно читать официальную документацию. Вот код примера из нее, чуть измененный
<?php
$output = '';
$options = !empty($options)?$options:50;
if (!empty($input) && !empty($options)) {
  if (strlen($input) > $options) {
    $output = substr($input, 0, strrpos(substr($input, 0, $options), '.'));
  } else{
    $output = $input;
  }
}
return $output;
Засовываем это в сниппет, например, smartcuttext и вызываем
[[+content:smartcuttext =`200`]]
Василий Наумкин
31 августа 2015, 05:54
4
0
Условия в виде массива в msProducts не принимаются, потому что он ожидает их всегда в виде JSON. Придётся так и указывать:
{$_modx->runSnippet('!msProducts', [
    'parents' => 3,
    'sortby' => '{
        "Data.new": "desc",
        "msProduct.editedon": "desc"
    }',
    'includeThumbs' => '150x150',
    'where' => '{
	"Data.price:>=": 0
    
    }',
    'limit' => 4,
    'showLog' => true,
    'tpl' => '@INLINE
		bla-bla-bla
	'
])}
У pdoResources такой проблемы нет.

Кстати, если очень хочется использовать именно массивы — то можно воспользоваться тем, что json_encode в Fenom является разрешённой PHP функцией:
{$_modx->runSnippet('!msProducts', [
    'parents' => 3,
    'sortby' => json_encode([
        "Data.new" => "desc",
        "msProduct.editedon" => "desc"
    ]),
    'includeThumbs' => '150x150',
    'where' => json_encode([
	    "Data.price:>=" => 0
    ]),
    'limit' => 4,
    'showLog' => true,
    'tpl' => '@INLINE
		bla-bla-bla
	'
])}
Fi1osof
30 августа 2015, 16:32
2
+3
ИМХО — зря заминусовали. Вопрос-то стоял «как сделать доступ к определенной странице сайта одному единственному пользователю». С одной стороны да — ответили. Через группу и т.п. С другой стороны, это вопрос, который действительно касается слабой и темной стороны MODX-а — предоставление прав конкретным пользователям. Представьте, что вы запускаете социалку на MODX, где пользователи могут писать свои топики и предоставлять права каким-то отдельным друзьям. Сейчас, если пытаться такое реализовать, придется плодить 100500 групп пользователей. Потому что в MODX нет механизма предоставления прав на что-либо конкретно пользователям. Есть предоставление прав группам пользователей на группы ресурсов и т.п. А уже потом разбираться к каким группам относятся пользователи и документы. Это не есть гуд. И это действительно запутанно. Так же в MODX нет такого понятия как owner (то есть владелец сущности). На мой взгляд это тоже было бы правильно учитывать. Если я создатель какой-то сущности — значит я имею на нее все права. Это по логике. Но на практике такого нет.

В свое время я заморочился допиливанием механизма политик MODX-а, чтобы учитывались индивидуальные права пользователей, без необходимости добавления ресурсов и пользователей в группы. То есть можно было давать права как отдельным людям, так и отдельным группам. Конечно же пришлось использовать CRC. Если кому интересно, вот некоторые коды:
modzilla.class.php — основной класс модуля
modzillaproject.class.php CRC Проект
modzillaaccess.class.php кастомный класс политик безопасности.
modzillaaccessprojects.class.php что-то там тоже с правами связанное.

Писалось все это очень давно, так что в деталях многого не помню уже. Но это работало. По этому вопросу материал в помощь:
modxclub.ru/blog/dokumentatsiya-dlya-spetsialistov/26.html
modxclub.ru/blog/dokumentatsiya-dlya-spetsialistov/28.html
modxclub.ru/blog/113.html

Материал крайне мозговыносящий, но самый сок. Так что если освоите, понимать будете очень многое.

Николай
29 августа 2015, 16:54
5
+1
Делал очень давно, сейчас бы сделал по другому, но что есть, то есть )

Сниппет adsense
<?php
//спустя сколько символов искать перенос строки и вставлять рекламу?
$nu = 3800;
//Код рекламы
$adsense = <<<HTML
<div class="sense">
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<ins class="adsbygoogle"
     style="display:inline-block;width:728px;height:90px"
     data-ad-client="ca-pub-1233335915169539"
     data-ad-slot="2233378009"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script></div>
HTML;
$a = preg_replace('@([^^]{'.$nu.'}.*?)(\r?\n\r?\n|</p>)@', "\\1$adsense\\2", trim($content), 1);
return $a;
Вызов (в шаблоне вместо [[*content]])
[[adsense? &content=`[[*content]]`]]
Василий Наумкин
27 августа 2015, 16:59
3
+2
В общем, этот конкретный недостаток — суть продолжение достоинств Fenom.

Все ajax запросы eventsCalendar2 отправляются на текущую страницу, где сниппет должен их словить, обработать, выдать ответ и прервать работу парсера. В общем, как написано в этой статье.

И всё отлично работает, за исключение того, что при компиляции шаблона Fenom он прописывает вывод всех данных не в переменную, которую покажет в конце, а выводит их сразу через echo.

Соотвественно, в ответ ajax запроса попадают все сниппеты, обработанные до eventsCalendar2 — и ты видишь их на странице. Это косяк старой архитектуры eventsCalendar2, ведь по уму нужно бы отправлять все запросы на отдельный коннектор или плагин, как в mFilter2 и miniShop2.

Но можно выйти из ситуации и сейчас:
1. Нужно вызывать eventsCalendar2 в шаблоне, перед всеми другими сниппетами, и сохранять его вывод в переменную.
2. А переменную уже выводить на странице. Но не в контенте, а тоже в шаблоне или в чанке, потому что ресурс обрабатывается перед шаблоном и переменная там еще будет пуста.

Тогда при обычной загрузке страницы сниппет отработает, данные сохранятся в переменную и выведутся в нужном месте страницы. А при ajax запросе сниппет отреагирует первым и выдаст чистый ответ, без других сниппетов.

Примерно так:
{set $calendar = $_modx->runSnippet('!eventsCalendar2', [
	...
])}

{$calendar}

Кстати говоря, можно так сохранять и вывод других сниппетов, чтобы вызывать их в одном месте, а показывать в другом.
Максим Кузнецов
27 августа 2015, 13:57
2
+3
<script src="http://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU" type="text/javascript"></script>

<script type="text/javascript">
	var userCity = ymaps.geolocation.city; //получаем город пользователя
	//далее находим соответствие в массиве iata и возврвщаем результат
</script>
Павел Гвоздь
24 августа 2015, 12:48
1
+1
Отключил в настройках плагин MobileDetect. Использую сниппет, который определяет средствами MobileDetect девайс, в сочетании с Феном. В начале чанка «layout» вставил такой код:
<?php
if( !$MobileDetect = $modx->getService('mobiledetect', 'MobileDetect', MODX_CORE_PATH . 'components/mobiledetect/') ) {return;}


$key = $MobileDetect->config['force_browser_variable'];

$device = !empty($_GET) && array_key_exists($key, $_GET)
		? $modx->stripTags($_GET[$key])
		: '';

if( empty($device) )
{
	$device = $MobileDetect->getSettings();
}

if( empty($device) )
{
	$detector = $MobileDetect->getDetector();
	
	if( $detector->isMobile() )
	{
		$return = 'mobile';
	}
	else {
		$return = 'standard';
	}
}
else {
	$return = $device;
}

$MobileDetect->saveSettings( $return ); // ставим печеньку

return $return;
Внимание! Сниппет будет работать только с установленным компонентом MobileDetect.

Советую, для корректной работы с мультиязыками использовать системную настройку «session_cookie_path». Значение данной настройки должно быть "/" (без кавычек).
Василий Наумкин
23 августа 2015, 18:56
1
+1
Плохой пример, советую переписать. Переменная {$modx} отключена по умолчанию и включать её никому не советую, иначе любой менеджер сайта может натворить дел.

Использовать её можно исключительно там, где ты — единственный хозяин сайта и больше никого в админке гарантированно не будет. Если ты предлагаешь общедоступное решение — это не вариант.

Так что использование {$modx-> fromJSON()} отпадает, но зато мы можем использовать обычный json_decode() — он в списке разрешенных функций Fenom, вместе с
json_encode, count, is_string, is_array, is_numeric, is_int, is_object, strtotime, gettype, is_double, ip2long, long2ip, strip_tags, nl2br

Так что, правильный вариант будет таков:
{set $video_json = json_decode($_modx->resource.video, true)}

{if !empty($video_json['video'])}
	<iframe width="860" height="650" src="{$video_json['video']}" frameborder="0" allowfullscreen></iframe>
{else}
	Видео нет
{/if}

И кстати, можно заменить
{if !empty($video_json['video'])}
на
{if $video_json.video?}
См. операторы сравнения. Обожаю Fenom!
Василий Наумкин
21 августа 2015, 15:28
1
+1
Вот исправление, можешь применить пока у себя на сайте.
Василий Наумкин
12 августа 2015, 09:26
1
+4
А вообще, это издевательство, конечно!

С версии 2.1.1-pl, все обычные вызовы сниппетов становятся кэшированными:
{$_modx->runSnippet('pdoResources')}

Некэшированный вызов, понятно дело, вот такой:
{$_modx->runSnippet('!pdoResources')}
Можно обновляться.

Если очень хочется самому управлять кэшем — то верхний пример по-прежнему работает.