Что нужно достичь?
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=`1`]] <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=`shynkshy` &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" 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
Мы создадим для вас такой сайт, который подойдет именно в вашем случае и станет отличным инструментом привлечения клиентов и увеличения продаж.
Перенос сайта на MODX
Работа по переносу сайта на MODX осуществляется в максимально короткие сроки. Стоимость зависит от сложности переносимого сайта
Продвижение сайта на MODX
Если вы хотите получить быстрые и ощутимые результаты, подняться в топ в минимальные сроки, то доверьте нам продвижение своего сайта.