Максим Кузнецов

Максим Кузнецов

С нами с 01 июля 2013; Место в рейтинге пользователей: #27
Максим Кузнецов
06 июня 2017, 11:56
1
+3
1. одноразовый алерт, оповещающий о сборе персональных данных (продолжая пользоваться данным сайтом, вы соглашаетесь с нашей политикой конфиденциальности)
2. чекбоксы «я согласен на обработку моих персональных данных/подтверждая форму, я соглашаюсь с правилами сайта» на объемных формах — регистрация/оформления заказа
3. страница с политикой конфиденциальности + ссылка в подвале
4. modhost.pro
Максим Кузнецов
04 июня 2017, 10:35
0
Т.е. вам нужно создать полноценный чанк в бд или в файле, после чего прописать внутри него все условия, как вам нужно.
Максим Кузнецов
03 июня 2017, 22:00
+1
В INLINE чанках нельзя указывать сниппеты, другие чанки или фильтры вывода через обычные теги, потому что так парсер MODX обработает их в первую очередь, и сниппет получит совсем не то, что вы хотели.
Максим Кузнецов
03 июня 2017, 21:21
0
Может, у вас включен параметр fastMode?
Максим Кузнецов
30 мая 2017, 11:42
+1
Скорее всего у вас проблемы с настройками htaccess или системными настройками суффикса html-документов.

Попробуйте в плагине выше заменить:
$name = str_replace('.html', '', $tmp[1]);
	if ($tmp[1] != $name || !isset($tmp[2])) {
		$modx->sendRedirect($tmp[0] . '/' . $name);
	}

На это:
$name = str_replace('.html', '', $tmp[1]);
	if (!isset($tmp[2])) {
		$modx->sendRedirect($tmp[0] . '/' . $name);
	}

А вообще, правильнее было бы убрать суффикс '.html' для документов.
Максим Кузнецов
27 мая 2017, 12:57
+1
$section = 5;//id страницы 404
— это лучше убрать, а в sendForward добавить проверку заполненности $section, в противном случае не выполнять ничего.
Если выполнять $modx->sendForward(айди_страницы_404), то будет отдаваться некорректный код ответа, ну и последующие плагины на OnPageNotFound не будут корректно обрабатываться.
Максим Кузнецов
26 мая 2017, 23:25
+1
Да, более того, вы не туда вставили условия.

Посмотрите мой исходный пример и сравните со своим — у вас вначале происходит условие:

if (count($chunks) >= 2) {
	//...
}

а после вы пытаетесь проверить на это:
elseif (count($chunks) == 3) {
	//..
}

— в моем же примере второе условие было ВНУТРИ первого.
Максим Кузнецов
26 мая 2017, 22:57
+1
Ну, можете изменить участок кода на такой:
//Страница профиля
if (count($chunks) == 2) {
	//...
	$modx->sendForward(айди_страницы_users);
}

//Подразделы
elseif (count($chunks) == 3) {
	switch ($chunks[2]) {
			
		//Сообщения пользователя
		case 'posts':
				//...
				$modx->sendForward(айди_страницы_users);
			break;
				
		//Комментарии пользователя
		case 'comments':
				//...
				$modx->sendForward(айди_страницы_users);
			break;
			
		//Избранное пользователя	
		case 'favorites':
				//...
				$modx->sendForward(айди_страницы_users);
			break;
	}
}
— нужно пояснить, что изменилось?
Максим Кузнецов
26 мая 2017, 22:52
+1
Для работы этого кода, вам нужно:
— установить дополнение pdoTools
— включить для него системную настройку pdotools_fenom_parser

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

Да, к слову. Вам будет не лишним принудительно отключить кэширование для страницы списка пользователей:
редактирование ресурса -> закладка настройки -> убрать галочку у
пункта «Кэшируемый»
Максим Кузнецов
26 мая 2017, 22:50
+1
Да вот не тут то было, оказалось, что он так реагирует на все алиасы:
mysite.ru/users/2/wadwfw
mysite.ru/users/2/awdafw
mysite.ru/users/2/sgsgse
— упс, а это уже моя недоработка, извиняюсь. В том участке кода, где реализуется $modx->sendForward, вам нужно прописать доп. условие, чтобы подмена страницы срабатывала только в диапазоне подходящих вам кейсов.
В противном случае не делать ничего, чтобы в случае неподходящего запроса пользователя перехватывал роутер 404 ошибки.
Максим Кузнецов
26 мая 2017, 22:36
+1
[[*alias]] = поле ресурса. У вас оно все время будет полем от страницы «списка пользователей», которой вы подменяете ответ сервера.

Если вам нужно получить плейсхолдер, используйте [[+value]]
Максим Кузнецов
26 мая 2017, 22:05
+1
$resource = $modx->getObject('modResource', array(   
	'alias' => 'ваш алиас'
));   
$modx->sendForward($resource->get('id'));

Но это лишние запросы к бд, т.е. итоговая скорость обработки будет ниже.
Максим Кузнецов
26 мая 2017, 21:57
+1
Нужен только ресурс /users/, по айди которого плагин будет реализовывать sendForward.
Максим Кузнецов
26 мая 2017, 21:13
+1
{var $user_page_type = $_modx->getPlaceholder('user_page_type')}

{switch $user_page_type}
	{case 'main'}
		...
	{case 'comments'}
		...
	{case default}
		...
{/switch}
Максим Кузнецов
26 мая 2017, 20:59
+1
Ну, в принципе, можно сделать так (но я рекомендую все же обучиться fenom'y, т.к. с ним создавать сайты становится на порядок интереснее):

— качаете какое-нибудь дополнение аля switch
— в плагине, в зависимости от совпадения, передаете плейсхолдер user_page_type
— создаете чанк с оформлением под каждый «тип» страницы (основная, список пользователей, комментарии, избранное)
— далее, в шаблоне списка пользователей:

[[[[!switch? 
	&get=`[[+user_page_type]]` 
	&c1=`main`
	&do1=`$имя_основного_чанка_профиля_пользователя`
	&c2=`comments`
	&do2=`$имя_чанка_комментариев_пользователя`
	
	&default=`$имя_чанка_общей_страницы_пользователей`
]]]]
(пояснение по поводу структуры чанков)
Максим Кузнецов
26 мая 2017, 20:39
+1
Оперируйте контентом, выстраивая условия в шаблоне, который определен для ресурса, на который произошла замена.

Например:
1. Есть страница /users/ (список всех пользователей), со своим шаблоном, отображающий, допустим, всех пользователей.
2. В плагине, при совпадении шаблона адресного запроса, идет переадресация на /users/ методом sendForward + выставляются плейсхолдеры (допустим, user_id)
3. В шаблоне «списка всех пользователей» проверяем наличие этого плейсхолдеры и, исходя из результата, подставляем нужные данные:

[[+user_id:is=``:then=`обычная страница "списка всех пользователей"`:else=`формируем страницу профиля`]]

Используя феном, можно так вообще кастомизировать виртуальную страницу без потери результативности, вплоть до сео. Вот, например, как реализована страница пользователя у меня:

{extends 'template:1'}

{var $user_id = $_modx->getPlaceholder('user_id')}


{block 'meta'}
	{if $user_id}
		{var $user_name = $_modx->getPlaceholder('user_name')}
		{var $pagetitle = $user_name ~ ' / Профиль пользователя'}
		{var $avatar = 1 | user: 'photo'}
	
		<title>{$pagetitle ~' :: '~ $_modx->config.site_name}</title>
		<meta property="og:title" content="{$pagetitle}" /> 
		<meta name="twitter:title" content="{$pagetitle}" />
		
		{set $canonical_url = $_modx->resource.id | url : ['scheme' => 'full'] ~ $user_name ~ '/'}
		
		<link rel="canonical" href="{$canonical_url}" />
		<meta property="og:url" content="{$canonical_url}" /> 

		<meta name="twitter:image" content="{$avatar ?: '/assets/images/users/default/120x120.png'}" />
		<meta property="og:image" content="{$avatar ?: '/assets/images/users/default/120x120.png'}" />
		
		<meta property="og:type" content="profile" />
	{else}
		{parent}
	{/if}
{/block}



{block 'main'}
	{parent}

	{if $user_id}
		//оформляем страницу пользователя
	{else}
		//оформляем общую страницу всех пользователей
	{/if}
{/block}
Максим Кузнецов
25 мая 2017, 17:40
0
Вначале необходимо подгрузить ваш лексикон:
{$_modx->lexicon->load('ru:customlexicon:default')}

После чего уже обращаться к его переменным
{set $value = ('customlexicon_value') | lexicon: [] : 'ru'}
Максим Кузнецов
25 мая 2017, 14:54
1
0
Таким методом нет — у переменной будет ограниченная область видимости.

Есть 2 варианта:

— засунуть е-мейл в плейсхолдер:
{var $emailto = 1 | resource : 'form.emailTo'}
{$_modx->setPlaceholder('emailto', $emailto)}
и в последующем получать его в любом коде, инициализированном после записи плейсхолдера:
{$_modx->getPlaceholder('emailto')}

— воспользоваться дополнением clientconfig и вынести ваш е-мейл в системную настройку, которую в дальнейшем можно будет получить так:
{$_modx->config.emailto}