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

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

skype: metsof
email: accusser@gmail.com

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

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

Авторизация

MODX статьи, уроки и готовые решения для MODX Revo

Сайдбар

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

25 сент. 2013

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


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

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


1. «Мозги» MODx
2. Самая последняя версия Login
3. Самая последняя версия Profile
4. Самая последняя версия Articles
5. Самая последняя версия Newspublisher
6. Любой граватар-сниппет
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="http://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="http://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="http://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>

Надеюсь, вы нашли всё это полезным, по крайней мере, теперь у вас есть преставление о том, как решать задачи подобного рода.

Подпишитесь на рассылку! Никакого спама, только обновления!!!

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


    Услуги по MODX Revolution

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

    Техническая оптимизация сайта

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

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

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

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

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

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

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