Виртуальные вкладки для страницы пользователя!
Приветствую сообщество!
Вопрос собственно в следующем!
Как бы мне сделать вкладки как на здесь на modx.pro для одного юзера! (заметки, комменты, избранное)
П.С.
Говорить о том, что «надо сначала воспользоваться поиском» не надо, пишу это как раз потому, что воспользовался!
Понимаю есть ааахренеть сколько мануалов и примеров, например здесь:
Сама страница пользователя у меня тем не менее есть и организована так:
Прошу помощи! Но так, чтобы не пришлось менять вид чанков и политики вызова данных пользователя на фронт! Заранее спасибо за любою помощь!
Вопрос собственно в следующем!
Как бы мне сделать вкладки как на здесь на modx.pro для одного юзера! (заметки, комменты, избранное)
П.С.
Говорить о том, что «надо сначала воспользоваться поиском» не надо, пишу это как раз потому, что воспользовался!
Понимаю есть ааахренеть сколько мануалов и примеров, например здесь:
https://modx.pro/howto/7909-page-users-on-modxpro/но тем не менее пример у меня не работает, даже не хочет работать элементарно страница пользователя!Сама страница пользователя у меня тем не менее есть и организована так:
<?php
// обрабатываем только события OnPageNotFound, на случай, если отметили галкой и другие в настройках плагина
if ($modx->event->name != 'OnPageNotFound') {
return false;
}
// на случай, если у нас настройки кто-то менял, получаем значение переменной, через которую передаются ссылки в modx от веб-сервера
$alias = $modx->context->getOption('request_param_alias', 'q');
// проверяем, что такая переменная есть, иначе и обрабатывать нечего
if (!isset($_REQUEST[$alias])) {
return false;
}
// наш запрос, который нужно разобрать и обработать
$request = $_REQUEST[$alias];
// разбиваем ссылку на составляющие,
// как правило, будет что-то вроде users/username, на выходе будет массив с этими значениями
$chunks = explode('/', $request);
// на всякий случай проверяем, что у нас есть корневой ресурс для пользователей, страница users
if (!$users = $modx->getObject('modResource', ['id' => 571])) {
$modx->log(modX::LOG_LEVEL_ERROR, 'Entry point resource for users not found.');
return false;
}
// а теперь обрабатываем нам запрос.
switch ($chunks[0]) {
// сверяем первую часть ссылки с алиасом нашего ресурса для пользователей, должны совпадать
case $users->get('alias'):
// еще одна проверка существования ресурса (наверное можно удалить, взял пример из реального проекта)
if (!$usersSection = $modx->findResource($chunks[0])) {
return false;
}
// у меня ссылки генерились с html, поэтому я вырезаю расширение перед поиском самого юзера
$userAlias = str_replace('.html', '', $chunks[1]);
// еще одна проверка + убираем концевые слеши и редиректим на нормальную ссылку
if ($chunks[1] != $userAlias || (isset($chunks[2]) && $chunks[2] == '')) {
$modx->sendRedirect($chunks[0] . '/' . $userAlias);
}
// пробуем найти пользователя по username из запроса, если не нашли, то посылаем 404 заголовок
// тут важно вручную послать страницу 404, иначе, если вернем просто ошибку, то у нас опять запустится обработчик
// 404 ошибки, опять запустится наш плагин, опять тут будет ошибка и привет бесконечный круг и ААААА! Ничего не работает!!!!!
if (!$user = $modx->getObject('modUser', ['id' => $userAlias])) {
$modx->sendForward($this->getOption('error_page'), $this->getOption('error_page_header', null, 'HTTP/1.0 404 Not Found'));
}
// пользоввателя нашли, теперь подгружаем его данные (профайл, расширенные поля и тд)
/** @var modUserProfile $profile */
$profile = $user->getOne('Profile');
$extended = $profile->get('extended');
// прописываем все наши данные в плейсхолдеры, чтобы потом на странице их вывести
$modx->setPlaceholders($user, 'user.');
$modx->setPlaceholders($profile, 'user.');
$modx->setPlaceholders($extended, 'user.');
// тут у меня еще момент, что пользователь может указать, что у него профиль приватный и его никому показывать нельзя,
// поэтому в таком случае тоже 404 возвращаем. Но можно удалить
// profile private, we should return not found error
// if (isset($extended['private']) && $extended['private'] == 1) {
// $modx->sendForward($this->getOption('error_page'), $this->getOption('error_page_header', null, 'HTTP/1.0 404 Not Found'));
// }
// ну и отправляем нашу страницу с шаблоном профиля пользователя, где уже выводим всю его подноготную
$modx->sendForward($usersSection);
break;
}Сделана по этому примеру:https://modx.pro/help/9820/Прошу помощи! Но так, чтобы не пришлось менять вид чанков и политики вызова данных пользователя на фронт! Заранее спасибо за любою помощь!
Комментарии: 40
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
После
Прописываем:
— в местах, где определяется «вкладка» дописать необходимые плейсхолдеры по вкусу и готово.
Если что-то не получится — могу выслать куда-нибудь готовый код плагина.
Пробовал вот такую бурду:
При этом использовал небольшой динамиский фрагмент шаблона, где по факту должно было происходить переключение контента! Но чет пошло не по плану :(
Вот полный код плагина:
Например:
1. Есть страница /users/ (список всех пользователей), со своим шаблоном, отображающий, допустим, всех пользователей.
2. В плагине, при совпадении шаблона адресного запроса, идет переадресация на /users/ методом sendForward + выставляются плейсхолдеры (допустим, user_id)
3. В шаблоне «списка всех пользователей» проверяем наличие этого плейсхолдеры и, исходя из результата, подставляем нужные данные:
Используя феном, можно так вообще кастомизировать виртуальную страницу без потери результативности, вплоть до сео. Вот, например, как реализована страница пользователя у меня:
Вот момента когда происходит вот это:
как впихнуть еще три виртуальные страницы Публикации, Коменты, Избранное в эту часть:
ведь с учетом работы плагина получается, что страница списка пользователей расположена по адресу:
а страница пользователя по адресу:
а вот виртуальные вкладки, например публикации:
вот первые два варианта уживаются так как вы и написали, собственно у меня так и было еще давно:
А вот как теперь сделать так, чтобы прийти к контенту на виртуальной странице:
— качаете какое-нибудь дополнение аля switch
— в плагине, в зависимости от совпадения, передаете плейсхолдер user_page_type
— создаете чанк с оформлением под каждый «тип» страницы (основная, список пользователей, комментарии, избранное)
— далее, в шаблоне списка пользователей:
(пояснение по поводу структуры чанков)
Дело в том, что первый раз установив плагин я обрадовался, т.к. по запросу например страницы:
mysite.ru/users/2/posts
он вроде бы сделал редирект и страница просто обновилась на странице пользователя, я подумал, что и должно быть, что вроде бы как надо теперь кастомизировать алиас для этих страничек! Да вот не тут то было, оказалось, что он так реагирует на все алиасы:
У меня вот вопрос, а ресурсы надо в админке создавать с этими алиасами? Может в этом дело :D
забыл то назначить ID…
вот теперь вы понимаете почему я не очень люблю феном и пхп, много закорючек!
а вот вопрос, как это можно к динамичности привести? Чтобы он не по айди вычислял страницу а по алиасу?
Но это лишние запросы к бд, т.е. итоговая скорость обработки будет ниже.
Вот плагин сбахал, тот что выше с вашими модификациями, на страницу чтобы вывести контент уже до банального образа дошел:
пробовал так же и вот этот вариант:
при чем когда загружаю странцу пользователя то вот это условие {case default} или {case 'main'} выполняется, т.е.
на странице по адресу:
выдает контент 000
А когда я пытаюсь перейти на другой алиас, напимер сюда
то условие {case 'posts'} не срабатывает и один фиг отображается то, что было на стартовой странице пользователя!
У меня вот вопрос, может плагин корявый и где то что то конфликтует? Или же его надо доконструировать, что бы начало работать это условие:
Но вот тогда почему не работает это:
чет я запутался вообще!
Если вам нужно получить плейсхолдер, используйте [[+value]]
Вот вы говорите [[+value]]! Да действительно, я чет тупанул, т.к. для [[*alias]] значение будет одно, потому как стоит символ "*" но вот как тогда должен выглядеть вызов, чтобы сработало то условие, которое мне нужно, а еще лучше расскажите подробнее как бы мне сделать, чтобы заработало это, вроде бы оно легче и быстрее:
Просто скажите может в плагине надо что то докалякать, чтобы это заработало? Потому как просто вставкой в шаблон это не работает, а всегда возвращает значение {case default} или {case 'main'}
— установить дополнение pdoTools
— включить для него системную настройку pdotools_fenom_parser
Но, без базовых знаний js у вас могут возникнуть побочные проблемы, в случае, если у вас в шаблонах или чанках где-то присутствуют {}.
Да, к слову. Вам будет не лишним принудительно отключить кэширование для страницы списка пользователей:
редактирование ресурса -> закладка настройки -> убрать галочку у
пункта «Кэшируемый»
В противном случае не делать ничего, чтобы в случае неподходящего запроса пользователя перехватывал роутер 404 ошибки.
Блин! А что именно допилить надо?
И кстати все что вы выше написали у меня установлено и включено, все же кое что у меня на феноме работает :D
— нужно пояснить, что изменилось?
и либо я чет не понял, но теперь на страницы пользователя вообще не заходит, потому как я стер свой плагин вот этот, скоторым хотя бы страница пользователя отображалась:
Посмотрите мой исходный пример и сравните со своим — у вас вначале происходит условие:
а после вы пытаетесь проверить на это:
— в моем же примере второе условие было ВНУТРИ первого.
но один фиг, это ломает мой вызов и перестает работать страница пользователя, т.е. выдает 404 и по ID и по Username
конечно может я что то не так делаю в плане адресной строки:
вызывают так (мой username — K.STARK)
не робит по всякому! Я уже запутался и вас запутал, и забадал! Вот думаю, может вы вышлите мне готовый вариант как у вас сделано и я попробую у себя интегрировать? Просто тот плагин что был до этого у меня для тсраницы пользователя был достаточно просто для понимания, ваще без заморочек. Поставил, плейсхолдеры с префикосм нафигачил и дело с концом! А тут… чет туплю сильно… но очень хочу разобраться!
Хоть плюсиками вас поддержу! :D
Выглядит он как вы описали:
При чем не работает даже страница пользователя
На каждую страницу пользователя создается отдельный ресурс, в котором ловятся плейсхолдеры
p.s. табуляция тут спадает(
Если выполнять $modx->sendForward(айди_страницы_404), то будет отдаваться некорректный код ответа, ну и последующие плагины на OnPageNotFound не будут корректно обрабатываться.
Чтобы не создавать дохрена ресурсов и не привязывать перехват алиасов к конкретному ресурсу по его индентификатору!
Потому как у меня несколько контекстов и на каждом присутствует данная модель списка и страниц пользователя и поэтому бабахать дофига ресурсов и на каждый конекст плагин, чет не очень хочется, перспективы хреновые, потому черт ногу сломит!
И тем не менее, спасибо!
…
и на общей странице через fenom выводи нужный контент
p.s. уходи от контекстов, если сайт только разрабатывается. для двух языков еще нормально, но потом будет каша из огромного количества ресурсов + по дизайну сложно что-то экстра конкретное сделать для страницы с определенным ID (3 языка = перечисление трёх id и т.д.)
А то что вы предлагаете уже пробовал выше, говорю ж не работает :(
Если плагин и все страницы (username/posts, username/comments и т.д.) работают +
если установлен pdoTools и в настройках сайта значения: pdotools_fenom_default, pdotools_fenom_modx, pdotools_fenom_parser,pdotools_fenom_php = ДА, то с помощью Fenom это будет примерно так:
{if $page_type == 'comments'}
[[$чанк_комментов]] или контент
{elseif $page_type == 'favorites'}
[[$чанк_избранного]] или контент
{/if}
Шаблонизатор Fenom
или просто подставляете нужный чанк на странице одной строчкой:
или
1. Адрес страницы пользователя выглядит так: mysite.com/users/[[+идентификатор пользователя]]
2. В плагине учтены моменты с динамической. Ко всем алиасам со значением users применяется работа данного плагина, а так же формируются вкладки.
3. В плагине учтена динамика для вкладок. (См. выше)
Т.е.
Тема с плейсхолдерами конечно мне понятна, но как это технически организовывается? Добавляются ли значения в плагин или нет? Мне нужен просто готовый плагин с готовым вызовом, как это делается! Я ж говорю, дубина я совсем, если давать мне все по кусочкам, умею только разбирать и собираться обратно пока :(
Заранее спасибо!
если fenom включен, то на странице профиля примерно так (наобум):
p.s. в чанке плейсхолдеры через [[!+плейсхолдер]], либо вызывать чанк через {$_modx->getChunk(…
:D
Попробуйте в плагине выше заменить:
На это:
А вообще, правильнее было бы убрать суффикс '.html' для документов.
как бы мне его заменить на динамическое определение страницы по алиасу:
users
:D