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

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

Был в сети 04 августа 2021, 21:51
Заказы принимаю
Скорее всего у вас проблемы с настройками 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' для документов.
$section = 5;//id страницы 404
— это лучше убрать, а в sendForward добавить проверку заполненности $section, в противном случае не выполнять ничего.
Если выполнять $modx->sendForward(айди_страницы_404), то будет отдаваться некорректный код ответа, ну и последующие плагины на OnPageNotFound не будут корректно обрабатываться.
Да, более того, вы не туда вставили условия.

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

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

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

— в моем же примере второе условие было ВНУТРИ первого.
Ну, можете изменить участок кода на такой:
//Страница профиля
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;
	}
}
— нужно пояснить, что изменилось?
Для работы этого кода, вам нужно:
— установить дополнение pdoTools
— включить для него системную настройку pdotools_fenom_parser

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

Да, к слову. Вам будет не лишним принудительно отключить кэширование для страницы списка пользователей:
редактирование ресурса -> закладка настройки -> убрать галочку у
пункта «Кэшируемый»
Да вот не тут то было, оказалось, что он так реагирует на все алиасы:
mysite.ru/users/2/wadwfw
mysite.ru/users/2/awdafw
mysite.ru/users/2/sgsgse
— упс, а это уже моя недоработка, извиняюсь. В том участке кода, где реализуется $modx->sendForward, вам нужно прописать доп. условие, чтобы подмена страницы срабатывала только в диапазоне подходящих вам кейсов.
В противном случае не делать ничего, чтобы в случае неподходящего запроса пользователя перехватывал роутер 404 ошибки.
Ну, в принципе, можно сделать так (но я рекомендую все же обучиться fenom'y, т.к. с ним создавать сайты становится на порядок интереснее):

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

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

Например:
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}