Контактная информация

По всем интересующим вас вопросам связывайтесь при помощи контактной информации приведенной на этой странице!

telegram: @Accusser
skype: metsof
email: accusser@gmail.com

В социальных сетях...

Форма обратной связи

Авторизация

Профили пользователей MODX Revolution. Создание и редактирование персонального профиля определенным пользователем

Сайдбар

Профили пользователей MODX Revolution. Создание и редактирование персонального профиля определенным пользователем

25 сент. 2013

Что нужно достичь?

1. Пользователи определённой группы должны иметь возможность создавать общедоступный профиль.2. Персона, создавшая профиль, должна иметь возможность редактирования этого профиля с помощью пользовательского интерфейса. Причем возможность редактирования должна быть доступна только для этой персоны.3. Имя профиля должно быть именем пользователя (username), нередактируемым.4. Профиль по умолчанию должен содержать персональную информацию о каждом пользователе: имя пользователя (username), полное имя, email, дополнительные поля.5. Должна быть возможность использовать безопасную граватар-систему для пользовательского изображения, вместо использования возможности загрузки изображений непосредственно на сервер.6. В профиле должны быть дополнительные «фишки», не предоставляемые по умолчанию в личном профиле MODx.7. Url профиля должен быть максимально коротким.8. Необходимо использовать возможности и стабильность MODx, некоторые из существующих расширений.9. Все это должно быть простым и гибким.

Необходимые инструменты.

1. «Мозги» MODx2. Самая последняя версия Login3. Самая последняя версия Profile4. Самая последняя версия Articles5. Самая последняя версия Newspublisher6. Любой граватар-сниппет7. Сниппет IF

Почему…

Login? Это очень просто. Ведь нам нужно создать авторизацию на сайте.Profile? Этот сниппет поможет отобразить профиль пользователя по умолчанию, содержащий username, полное имя (fullname), email и т.д. Эти данные являются обычными данными для MODx.Gravatar? Можно использовать существующие расширения из репозитория, если считаете их несовершенными – напишите свои, это просто.IF? В целях более логичного изложения об этом немного позже.Articles Это расширение целиком не нужно. Но некоторые возможности, предоставляемые им, мы используем.

Плюсы данного решения:

1. Articles обладает замечательной лендинг-страницей, которая выполнит работу любых getResources по обобщению существующих профилей.2. Articles «очистит» url, с помощью этого расширения можно легко сконфигурировать вид url.3. Даже если вы создали миллиард профилей, их можно просмотреть в Articles Container, а не забивать этой информацией Resource Tree.

И минусы...

1. Если не сделать хак Articles Extra, то будет достаточно затруднительно сделать так, чтобы профиль имел дочерний объект, т.е. блог.2. Ресурс, создаваемый Articles иногда незначительно, а иногда и очень сильно отличается от обычных ресурсов, иначе говоря, он зависит от этого расширения.

Newspublisher? Если удастся найти более подходящий ресурс с интерфейсом для задания/редактирования, умеющего работать с правами доступа, то нет необходимости использовать это расширение.

Шаг 1. Контейнер профиля.

Подготовительные действия:1. Создадим Articles Container, с именем profile/, словно планируется создать блог. Основная идея заключается в том, что каждый созданный профиль будет подобен сообщению, посту. Container будет родительским по отношению к ним.2. Убедимся, что данный новый ресурс принадлежит к группе ресурсов, а группе пользователей даны соответствующие права доступа, это необходимо, если хотели бы защитить эту область.3. Добавьте код в шаблон Articles Container и воспользуйтесь полученными данными, или добавьте код в шаблонную переменную (template variable) со значением по умолчанию @INHERIT, добавив к шаблону, например, в sidebar:
<code>[[!Profile? &user=`[[*createdby]]`]]
<img src="[[!Gravatar? &email=`[[+email]]`]]" />
Username: [[+username]]
Full Name: [[+fullname]]
My State: [[+state]]
My Country: [[+country]]
Comment: [[+comment]]</code>
*createdby: сниппет !Profile выводит информацию только о персоне, создавшей страницу.Примечание: Полученные данные уже занесены в базу данных.Чтобы позволить пользователям добавлять данные другого типа, видео, музыку, используйте Template Variables.

Шаг 2. Форма ввода.

Воспользуйтесь Newspublisher для создания/редактирования ресурсов внутри Articles Container. Необходимо получить правильные id ресурса и шаблона.1. Создайте два обычных ресурса, create-my-profile.html и edit-my-profile.html с чанком
[[$NewsPublisherProfileForm]]
:
<code>[[!NewsPublisher? &parentid=`127` //the id of the Articles Container
&template=`12` //the id of the template you wish the new profiles to have
&classkey=`Article`
&hidemenu=`1`
&show=`pagetitle,introtext,content`
&initrte=`1`
&rtcontent=`1`
&published=`1` //set to zero if the admin, wants to approve each profile
&required=`pagetitle,introtext`]]</code>
Теперь у нас есть форма для создания нового профиля в Articles Container.Нам потребуется две таких формы для создания и редактирования, использование одной вполне возможно, но это неудобно.

Шаг 3. Предотвратим возможность редактирования Джоном профиля Марии.

Нам нужно сделать профиль приватным. Нам нужен определённый код, который будет определять, кто есть кто.
К счастью, в Newspublisher есть встроенная кнопка « Редактировать», которую мы будем скрывать или отображать.1. Создадим чанк, edit-own-profile, и вызовем его где-нибудь в шаблоне профиля.2. Добавьте в чанк
[[$edit-own-profile]]
<code>[[!Profile]]
[[!If? &subject=`[[+username]]`
&operator=`EQ`
&operand=`[[*createdby:userinfo=`username`]]`
&then=`[[NpEditThisButton?
&np_id=`200`]]` //the id of resource, edit-my-profile.html
&else=``]]
]]</code>
3. Выполнится проверка имени пользователя (username), того, кто создал данную страницу и того, кто просматривает страницу. При их совпадении кнопка «Редактировать» будет отображаться, при несовпадении – нет.

Шаг 4. Добавление имени профиля пользователя в url

По умолчанию Newspublisher оставляет все поля в форме незаполненными, и оставляет возможность их заполнения, включая заголовок страницы, page title, который используется, если иное не указано, как псевдоним источника.1. Нам нужно, что бы каждый раз, когда пользователь возвращается на страницу, в поле заголовка страницы было указано имя пользователя.2. Не просто заранее заполнено, а чтобы было доступно только для чтения, не позволяя пользователю изменить имя файла профиля пользователя.3. В шаге 5 указано, как производится очистка значения по умолчанию и вводится имя пользователя.4. Найдем папку Newspublisher и в ней найдем чанк npTextTpl (обязательно сделайте дубликат этого чанка)
<code><div id="np-[[+npx.fieldName]]-container" class="np-text">
[[+np.error_[[+npx.fieldName]]]]
<label class="fieldlabel" for="np-[[+npx.fieldName]]"
[[+npx.readonly]] title="[[+npx.help]]">[[+npx.caption]]:
</label>
<input name="[[+npx.fieldName]]" class="text"
id="np-[[+npx.fieldName]]" type="text"
[[*id:is=`199`:or:is=`200`:then=`value="[[lowercaseUsername]]"
//explained later (forcing all usernames to be uniform)
readonly="readonly"`:else=`value="[[+np.[[+npx.fieldName]]]]"`]]
maxlength="[[+npx.maxlength]]" />
</div></code>
5. В тэге input должны быть только новые данные. Если ID ресурса 199 или 200 (create-my-profile.html и edit-my-profile.html соответственно) и далее в таком же духе и имеют статус «только для чтения» или иной, верните его к нормальному состоянию, не упустите это! Возможно, что Newspublisher будет использоваться и для других целей, а не только для создания и редактирования профиля.6. Внимание: этот чанк влияет на все поля, отмеченные как 'text'. Поэтому было бы лучше иметь только одно текстовое поле в форме, Page Title, а другие шаблонные переменные (template variables) задать как textareas, текстовые области.

Шаг 5. «Очистка» странных ИмЁн_ПользователЕЙ

Расширение MODx Articles создает url определенным образом, и согласно настройкам все буквы должны быть в нижнем регистре, прописными, пробелы должны заменяться дефисом и т.д. Нам нужно очистить все имена пользователей, привести их к одному виду в соответствии с правилами создания url.1. Вернемся к шагу 4. Сниппет lowercaseUsername используется вместо +username для того, чтобы вводимые данные соответствовали правилам.2. Пробелы и знаки подчеркивания в именах пользователя должны быть заменены дефисом.3. Все буквы преобразуются к нижнему регистру.4. Хотя MODx обладает соответствующими инструментами для этих целей, я предпочитаю вот этот простой сниппет:
<p>[[lowercaseUsername]]</p>
<code>$username = $modx->user->get('username');
$lower = $username;
$lower = strtolower($lower);
$xters = array(" ", "_");
$lowerdash = str_replace($xters, "-", $lower);
echo $lowerdash;</code>
5. В $xters можно добавить столько «странных» символов, сколько пользователи только смогут придумать для ввода. Заключите каждый символ в двойные кавычки и разделите запятыми.

Шаг 6. Добавим странице create-my-profile.html немного интеллекта.

Нужно, чтобы пользователь видел эту страницу только раз, точнее, создавал профиль один раз, это мы достигнем таким образом:1. Предотвратим непосредственный доступ к странице. Сделайте вызов сниппета ProfileReferralLinkToCreate в верхней части страницы.
[[ProfileReferralLinkToCreate]]
<code>$url = $modx->makeUrl(127);
$refer = $_SERVER['HTTP_REFERER'];
if ($refer == '')
{
$modx->sendRedirect($url);
}</code>
Хотя это не очень эффективное и легко преодолеваемое решение, это все таки поможет. При прямом доступе будет происходить редирект к profile/ (Articles Container)2. Сделаем проверку, имеет ли пользователь профиль. Это более эффективно. Даже не будет показываться форма для создания профиля.
ProfilePageIdgetResourceTpl содержит
<code>[[!If?
&subject=`[ [!<a class="myClass" href="https://www.modx.cc/documentation/additions/getresources/">getResources</a>?
&parents=`337`
&where=`{"createdby:=":[ [!+modx.user.id]]}`
&showHidden=`true`
tpl=`ProfilePageIdgetResourceTpl`]]`
&operator=`isempty`
&then=`[ [$NewsPublisherProfileForm]]`
&else=`YOU have an active profile already: <a href="/profile/[[lowercaseUsername]]">profile/[[lowercaseUsername]]</a>`
]]
<p>The ProfilePageIdgetResourceTpl contains</p>

    [[+id]]</code>
Внимание: Cниппет
[[lowercaseUsername]]
очень удобен для генерации ссылок на профиль.

Шаг 7. Добавим странице edit-my-profile.html немного интеллекта.

После создания профиля, эта страница становится неимоверно важной. Newspublisher создает и редактирует профиль с помощью одних и тех же форм и кода, и если к этой странице будет получен непосредственный доступ или доступ с другой страницы, и не через
[[NpEditThisButton]]
конкретного профиля, то может произойти попытка создать новый профиль, а не отредактировать.1. Помните, что Page Title field уже есть, дубликат ресурса может появиться если расширение newspublisher «пропустит» это.2. Немного отличающийся от create-my-profile.html ресурс. Добавьте его в верхнюю часть страницы.
[[ProfileReferralLinkToEdit]]
<code>$url = $modx->makeUrl(127);
$refer = $_SERVER['HTTP_REFERER'];
$myusername = $modx->user->get('username');
$mylower = $myusername;
$mylower = strtolower($mylower);
$myxters = array(" ", "_");
$mylowerdash = str_replace($myxters, "-", $mylower);
$site_url = $modx->config['site_url'];
$full_url = "".$site_url."profile/".$mylowerdash."/";
if ($refer !== $full_url)
{
$modx->sendRedirect($url);
die();
}</code>
Хотя идентификатор ссылающейся страницы может быть подделан, в большинстве случаев это работает нормально.3. Этот код очищает username пользователя и подготавливает полный url к странице пользователя.4. Далее эти данные сопоставляются с url страницы, с которой пришел пользователь. Если пользователь пришел непосредственно со станицы edit-profile.html или с любой другой страницы, отличной от страницы пользователя, произойдет мгновенный редирект на Articles Container, и форма входа не будет показана.5. Далее, мы можем сделать сообщение, что пользователь имеет активный профиль, могут быть шансы, что edit-my-profile.html хочет создать профиль, а не отредактировать его.
<code>[[!If?
&subject=`[ [!<a class="myClass" href="https://www.modx.cc/documentation/additions/getresources/">getResources</a>?
&parents=`127`
&where=`{"createdby:=":[ [!+modx.user.id]]}`
&showHidden=`true`
&tpl=`ProfilePageIdgetResourceTpl`]]`
&operator=`EQ`
&operand=``
&then=`please fill out the details`
&else=`Your active profile is: <a href="/profile/[ [lowercaseUsername]]">profile/[ [lowercaseUsername]] </a>`
]]</code>

Шаг 8. Создание «умной» ссылки для создания или редактирования профиля.

1. Для пользователя без профиля ссылка будет читаться как «Создать профиль» (Create Public Profile)2. Для пользователя с профилем ссылка будет читаться как «Редактировать профиль» (Edit Public Profile)
<code>[[!If?
&subject=`[ [!<a class="myClass" href="https://www.modx.cc/documentation/additions/getresources/">getResources</a>?
&parents=`127`
&where=`{"createdby:=":[ [!+modx.user.id]]}`
&showHidden=`true` &tpl=`ProfilePageIdgetResourceTpl`]]`
&operator=`EQ`
&operand=``
&then=`<a href="[ [~199]]">Create Public Profile</a>`
&else=`<a href="[ [~200]][ [lowercaseUsername]]">Edit Public Profile</a>`
]]</code>
Надеюсь, вы нашли всё это полезным, по крайней мере, теперь у вас есть преставление о том, как решать задачи подобного рода.






Комментарии ()


    Услуги по MODX Revolution

    Посмотреть все услуги

    Оптимизация сайта

    Подробнее & Заказать

    Создание сайта на MODX Revolution

    Подробнее & Заказать

    Перенос сайта на MODX Revolution

    Подробнее & Заказать

    Продвижение сайта на MODX

    Подробнее & Заказать