Рассмотрим из каких модулей и с помощью каких приемов мы можем сделать социальную сеть на друпале. Некоторые вещи потребуют создания своего модуля, поэтому сразу скачайте заготовку mymodule.zip куда будете писать код.
Содержание статьи
- Список используемых модулей
- Профиль
- Друзья
- Личные сообщения
- Рейтинги
- Уведомления
- Меню пользователя
- Стена
Список используемых модулей
- AJAX Comments (6.x-1.x-dev)
- CCK Fieldgroup Tabs (6.x-1.2)
- Comment Bonus API (6.x-1.0)
- Content Profile (6.x-1.0)
- Content Taxonomy (6.x-1.0-rc2)
- Date (6.x-2.8)
- Date API (6.x-2.8)
- Date Popup (6.x-2.8)
- Date Timezone (6.x-2.8)
- Hierarchical Select (6.x-3.8)
- Hierarchical Select Content Taxonomy (6.x-3.8)
- Hierarchical Select Taxonomy (6.x-3.8)
- ImageAPI (6.x-1.10)
- ImageAPI GD2 (6.x-1.10)
- ImageCache (6.x-2.0-beta12)
- ImageCache UI (6.x-2.0-beta12)
- ImageField (6.x-3.10)
- Image crop (6.x-1.0)
- Link (6.x-2.9)
- Mymodyle (6.x-1.0)
- Private messages (6.x-2.x-dev)
- RealName (6.x-1.4)
- UR-Views (6.x-1.2)
- UR-API (6.x-1.2)
- UR-UI (6.x-1.2)
- Views (6.x-3.0)
- Views UI (6.x-3.0)
- Content (6.x-2.9)
- Fieldgroup (6.x-2.9)
- Option Widgets (6.x-2.9)
- Text (6.x-2.9)
- FileField (6.x-3.10)
- Tabs (6.x-1.3)
- jQuery UI (6.x-1.5)
Профиль
Самый лучший модуль для профиля по моему мнению это - Content Profile.
Вместе с дополнительными модулями для CCK вы сможете создать профиль любого вида.
- Imagefield + Image crop, Imagecache - для аватар и фотографий.
- Fieldgroup и CCK Fieldgroup Tabs - для группировки полей и выводом их в табах.
- Link - для ссылок на сайты.
- Date - для указания дат, например: День рождения.
- Content Taxonomy и Hierarchical Select - для поля адреса страна > регион > город.
Cоздание профиля
После установки Content Profile появится новый тип нод profile, его и будем использовать.
В настройках типа: оставляем пустым поле Body field label, чтобы скрыть стандартное поле body; ставим галочку Use this content type as a content profile for users. Не забудьте установить права доступа к create profile content и edit own profile content для зарегистрированных пользователей.
Теперь добавим поля:
-
Имя
Label: Имя
Field name: field_profile_name
Type: Text
Form element: Text field -
Фамилия
Label: Фамилия
Field name: field_profile_surname
Type: Text
Form element: Text field -
Пол
Label: Пол
Field name: field_profile_sex
Type: Text
Form element: Select list
Allowed values list: мужской
женский -
Дата рождения
Label: Дата рождения
Field name: field_profile_birthday
Type: Date (модуль Date)
Form element: Text Field with Date Pop-up calendar (модуль Date Popup, включен в Date)
Input format: 29/09/2011
Years back and forward: -70:0
Granularity: Year, Month, Day
Time zone handling: No time zone conversion -
Местоположение
- Создайте новый словарь таксономии Местоположение
- Импортируйте базу городов в словарь как написано здесь или используйте модуль Taxonomy CSV import/export, файл для импорта, тип файла Hierarchical tree structure.
- Создайте cck поле:
Label: Местоположение
Field name: field_profile_location
Type: Content Taxonomy Fields (модуль Content Taxonomy)
Form element: Hierarchical Select (модуль Hierarchical Select Content Taxonomy)
Vocabulary: Местоположение
Save values additionally to the core taxonomy system (into the 'term_node' table).: поставить галочку - Далее в настройках HS по адресу
admin/content/node-type/profile/fields/field_profile_location/hs_config:
Resizable: Enabled
-
Телефон
Label: Телефон
Field name: field_profile_phone
Type: Text
Form element: Text field -
Сайт
Label: Сайт
Field name: field_profile_site
Type: Link (модуль Link)
Form element: Link
Link Title: No Title
Link Target: Open link in new window
Rel Attribute: nofollow -
О себе
Label: О себе
Field name: field_profile_about
Type: Text
Form element: Text area (multiple rows) -
Интересы
Label: Интересы
Field name: field_profile_interests
Type: Text
Form element: Text area (multiple rows)
Rows: 2 -
Фотография
Label: Фотография
Field name: field_profile_photo
Type: File (модуль Filefield)
Form element: Image with cropping (модуль Image crop)
The resolution to crop the image onto: 200x300
Minimum resolution for Images: 200x300
File path: profile_photos
После создания полей, добавьте 4 группы:
-
Основное
Label: Основное
Group name: group_main
Style: Tabs
Поля: Имя, Фамилия, Пол, Дата рождения, Местоположение -
Интересы
Label: Интересы
Group name: group_interests
Style: Tabs
Поля: Интересы, О себе -
Контакты
Label: Контакты
Group name: group_contact
Style: Tabs
Поля: Телефон, Сайт -
Фотография
Label: Фотография
Group name: group_photo
Style: Tabs
Поля: Фотография
Примерно то, что должно получиться:

Неиспользуемое поле title мы скрываем и при сохранении будем менять значение на имя пользователя используя код в модуле:
if ('profile_node_form' == $form_id) {
$form['title']['#type'] = 'value';
$form['title']['#required'] = FALSE;
}
}
function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
if ($node->type == 'profile' && $op == 'presave') {
$node->title = $node->name;
}
}
Темизация профиля
Темизировать будем в 2 этапа:
- Перекрытие стандартного шаблона пользователя.
В mymodule.module пишем код:
// перекрываем callback функцию
function mymodule_menu_alter(&$items) {
$items['user/%user_uid_optional']['page callback'] = 'mymodule_user_view';
}
// в отличии от стандартной, здесь нет загрузки стандартного профиля
function mymodule_user_view($account) {
drupal_set_title(check_plain($account->name));
return theme('user_profile', $account);
}
// убераем стандартные preprocess функции профиля
function mymodule_theme_registry_alter(&$theme_registry) {
$theme_registry['user_profile']['preprocess functions'] = array('mymodule_preprocess_user_profile');
}
Первые 2 функции влияют на работоспособность других модулей, если вы не уверены в их целесообразности можете их удалить. -
Теперь займемся темизацией. В mymodule.module добавляем preproсess функцию:
function mymodule_preprocess_user_profile(&$variables) {
global $user;
$account = $variables['account'];
// загружаем профиль пользователя из content_profile
$profile = content_profile_load('profile', $account->uid);
$profile = node_build_content($profile);
$variables['profile'] = $profile;
// создаем переменные для простых полей
$variables['profile_name'] = $profile->field_profile_name[0]['safe'];
$variables['profile_surname'] = $profile->field_profile_surname[0]['safe'];
$variables['profile_sex'] = $profile->field_profile_sex[0]['safe'];
// день рождения
if ($profile->field_profile_birthday[0]['value']) {
$date = date_convert($profile->field_profile_birthday[0]['value'], 'datetime', 'datestamp');
$variables['profile_birthday'] = format_date($date, 'custom', 'j F Y');
}
$variables['profile_phone'] = $profile->field_profile_phone[0]['safe'];
// ссылка на сайт
if ($profile->field_profile_site[0]['url']) {
$variables['profile_site'] = l($profile->field_profile_site[0]['display_title'], $profile->field_profile_site[0]['display_url'], array('attributes' => $profile->field_profile_site[0]['attributes']));
}
$variables['profile_about'] = $profile->field_profile_about[0]['safe'];
$variables['profile_interests'] = $profile->field_profile_interests[0]['safe'];
// местоположение
if ($profile->field_profile_location[0]['value']) {
$parents = taxonomy_get_parents_all($profile->field_profile_location[0]['value']);
foreach (array_reverse($parents) as $parent) {
$location[] = l($parent->name, taxonomy_term_path($parent));
}
if (!empty($location)) $loc = implode(', ', $location);
$variables['profile_location'] = $loc;
}
// переменная для отображаемого имени пользователя
if ($variables['profile_name'] && $variables['profile_surname']) {
$variables['display_name'] = $variables['profile_name'] .' '. $variables['profile_surname'];
}
elseif ($variables['profile_name']) {
$variables['display_name'] = $variables['profile_name'];
}
else {
$variables['display_name'] = $account->name;
}
// меняем заголовок страницы
drupal_set_title($variables['display_name']);
if ($profile->field_profile_photo[0]['filepath']) {
$variables['profile_photo'] = theme('image', $profile->field_profile_photo[0]['filepath']);
}
else {
// если пользователь не загрузил фотографию, покажем стандартную
$variables['profile_photo'] = theme('image', 'sites/default/files/profile_photos/default.png');
}
// переменная для региона профиля
$variables['profile_region'] = theme('blocks', 'profile_region');
$user_actions = array();
if ($user->uid == $account->uid) {
// Редактировать страницу
$user_actions[] = l('Редактировать страницу', "user/$account->uid/profile/profile", array('query' => drupal_get_destination()));
// Редактировать страницу
if ($profile->field_profile_photo[0]['filepath']) {
$user_actions[] = l('Изменить фотографию', "user/$account->uid/profile/profile", array('query' => drupal_get_destination(), 'fragment' => 'tabset-tab-5'));
}
else {
$user_actions[] = l('Загрузить фотографию', "user/$account->uid/profile/profile", array('query' => drupal_get_destination(), 'fragment' => 'tabset-tab-5'));
}
}
//в этот массив позже добавим ссылки: Отправить сообщение, добавить в друзья и тд.
if (!empty($user_actions)) {
$variables['user_actions'] = theme('item_list', $user_actions);
}
}
Скопируйте в папкуsites/default/files/profile_photosкартинку default.png для показа на месте фотографии если пользователь её не загрузил.
В профиле мы будем выводить регион под фотографией для блоков, таких как: друзья, видео, фото, заметки.
В prepocess функцию мы уже добавили соответствующий код, теперь в файле темы *.info нужно добавить регион. Так как я использую garland мне пришлось вдобавок прописать там и стандартные регионы:
regions[profile_region] = Profile Region
regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer
Создайте файл user-profile.tpl.php в папке с вашей темой и поместите туда код:
<div class="profile">
<div class="profile-left"><?php print $profile_photo; ?><?php print $user_actions; ?><?php print $profile_region; ?></div>
<div class="profile-right">
<?php if ($profile_sex || $profile_birthday || $profile_location): ?>
<div class="profile-group">
<div class="profile-group-label"><?php print $variables['display_name']; ?><?php if (node_access('update', $profile)) print l('Редактировать', "user/$account->uid/profile/profile", array('fragment' => 'tabset-tab-2')); ?></div>
<div class="profile-group-content">
<table>
<?php if ($profile_sex): ?><tr><td class="field-label">Пол</td><td><?php print $profile_sex; ?></td></tr><?php endif; ?>
<?php if ($profile_birthday): ?><tr><td class="field-label">День рождения</td><td><?php print $profile_birthday; ?></td></tr><?php endif; ?>
<?php if ($profile_location): ?><td class="field-label">Местоположение</td><td><?php print $profile_location; ?></td></tr><?php endif; ?>
</table>
</div>
</div>
<?php endif; ?>
<?php if ($profile_phone || $profile_site): ?>
<div class="profile-group">
<div class="profile-group-label">Контактные данные<?php if (node_access('update', $profile)) print l('Редактировать', "user/$account->uid/profile/profile", array('fragment' => 'tabset-tab-4')); ?></div>
<div class="profile-group-content">
<table>
<?php if ($profile_phone): ?><tr><td class="field-label">Телефон</td><td><?php print $profile_phone; ?></td></tr><?php endif; ?>
<?php if ($profile_site): ?><td class="field-label">Сайт</td><td><?php print $profile_site; ?></td></tr><?php endif; ?>
</table>
</div>
</div>
<?php endif; ?>
<?php if ($profile_about || $profile_interests): ?>
<div class="profile-group">
<div class="profile-group-label">Личная информация<?php if (node_access('update', $profile)) print l('Редактировать', "user/$account->uid/profile/profile", array('fragment' => 'tabset-tab-3')); ?></div>
<div class="profile-group-content">
<table>
<?php if ($profile_interests): ?><tr><td class="field-label">Интересы</td><td><?php print $profile_interests; ?></td></tr><?php endif; ?>
<?php if ($profile_about): ?><td class="field-label">О себе</td><td><?php print $profile_about; ?></td></tr><?php endif; ?>
</table>
</div>
</div>
<?php endif; ?>
</div>
</div>
Добавим немного css в нашу тему:
.profile-group-label {
font-weight:bold;
font-size:14px;
font-family: Arial;
}
.profile-group-label a {
font-size:12px;
float:right;
font-size: 10px;
}
.profile-group .field-label {
width:200px;
color:#777777;
}
.profile-left {
float:left;
width:200px;
}
.profile-right {
margin-left:220px;
overflow: hidden;
}
Вот так должен выглядеть профиль после темизации.

Замена логина пользователя на Имя Фамилия
Для этого понадобиться модуль Realname. Установите его. Затем на странице admin/user/realname/module выбирете Content Profile.
После на старнице admin/user/realname/fields выделите поля Имя и Фамилия, Name Pattern: %1 %2. Желательно сделать поле Фамилия обязательным для заполнение, чтобы не было конфликтов.
Вывод профиля пользователя на главной странице, а для анонимного пользователя показ формы логина
- Добавте такой код в mymodule.module:
/**
* Implementation of hook_menu().
*/
function mymodule_menu() {
$items = array();
$items['mymodule_frontpage'] = array(
'page callback' => 'mymodule_page',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
return $items;
}
function mymodule_page() {
global $user;
module_load_include('inc', 'user', 'user.pages');
if ($user && user_access('user_view_access')) {
drupal_set_title(user_page_title($user));
return user_view($user);
}
else {
//Если хотите сделать как вконтакте, то пишите ниже return 'тектст приветствия.';
//Затем поместите блок логина в левый регион и сделайте её видимой только анонимам.
return drupal_get_form('user_login');
}
}
// эта функция нужна для замены ссылок на главную страницу
function custom_url_rewrite_outbound(&$path, &$options, $original_path) {
global $user;
if ($user) {
if ($path == '' || $path == 'mymodule_frontpage') {
$path = 'user/' . $user->uid;
}
}
}
// редирект пользователя с ноды профиля на сам профиль пользователя
function mymodule_init() {
if ($node = menu_get_object()) {
if ($node->type == 'profile') {
drupal_goto('user/'. $node->uid);
}
}
} - В настройках
admin/settings/site-informationза главную страницу установить mymodule_frontpage.
Друзья
User Relationships - модуль хорошо интегрирован с views и позволит создавать различные списки друзей.
Включим модули UR-API, UR-UI, UR-Views. Установим права доступа для зарегистрированных пользователей: can have relationships, maintain own relationships.
На странице admin/user/relationships/add создадим тип отношений для друзей Name: Friend.
На странице admin/user/relationships/settings уберем галочку Allow multiple relationships
Друзей мы будем показывать в списках с маленькими аватарами, поэтому создадим 2 imagecache правила:
-
photo-50x50
Preset Namespace: photo-50x50
Action: Scale And Crop 50x50 -
photo-100x100
Preset Namespace: photo-100x100
Action: Scale And Crop 100x100
После настройки модуля создадим представление для списков друзей.
Настройка views
- Создаем новое представление View name: friends, View type: User relationship.
- Добавляем отображение типа page.
- Basic settings:
- Name: Друзья
- Title: Друзья
- Use pager: Yes
- Items to display: 25
- Page settings:
- Path: friends
- Relationships:
- Добавляем отношение User relationships: Requestee user
- Добавляем отношение User relationships: Requester user
- Добавляем отношение Node: Content Profile и настраиваем его:
- Relationship: requestee
- Content type: profile
- Arguments:
- Добавляем аргумент User relationships: Requester user и настраиваем его:
- Validator options:
- Validator: User
- Type of user argument to allow:: Only allow numeric UIDs
- Action to take if argument is not present: Provide default argument
- Default argument type: User ID from logged in user
- Validator options:
- Добавляем аргумент User relationships: Requester user и настраиваем его:
- Filters:
- Добавляем фильтр User: Active и настраиваем его:
- Relationship: requestee
- Active: Yes
- Добавляем фильтр User relationships: Relationship status и настраиваем его:
- Status: Approved
- Добавляем фильтр User relationships: Relationship type и настраиваем его:
- Relationship types: Friend
- Добавляем фильтр User: Active и настраиваем его:
- Fields:
- Добавляем поле Content: Фотография (field_profile_photo) и настраиваем его:
- Relationship: Content Profile
- Label: None
- Format: photo-100x100 image
- Добавляем поле Content: Имя (field_profile_name) и настраиваем его:
- Relationship: Content Profile
- HTML element: - None -
- Wrapper HTML element: - None -
- Label: None
- Format: Default
- Добавляем поле Content: Фамилия (field_profile_surname) и настраиваем его:
- Relationship: Content Profile
- HTML element: - None -
- Wrapper HTML element: - None -
- Label: None
- Format: Default
- Добавляем поле User: Name и настраиваем его:
- Relationship: requestee
- Label: пустое поле
- Добавляем поле Content: Фотография (field_profile_photo) и настраиваем его:
- Basic settings:
- Добавляем отображение типа page.
- Basic settings:
- Name: Друзья
- Page settings:
- Path: friends/list
- Menu:
- Type: Default menu tab
- Title: Все друзья
- Weight: 1
- Parent menu item: Already exists
- Basic settings:
- Добавляем отображение типа block.
- Basic settings:
- Name: Друзья (блок)
- Style:
Жмем кнопку Override,
- Basic settings:
- Style: Grid
- Number of columns: 3
Жмем кнопку Override, No
- Изменяем аргумент User relationships: Requester user:
Жмем кнопку Override- Action to take if argument is not present: Provide default argument
- Default argument type: User ID from URL
- Action to take if argument is not present: Provide default argument
- Изменим поле Content: Фотография (field_profile_photo):
Жмем кнопку Override,- Format: photo-50x50 image
Жмем кнопку Override,
- Добавляем сортировку Global: Random
- Basic settings:
- Name: Друзья онлайн
- Page settings:
- Path: friends/online
- Menu:
- Type: Menu tab
- Title: Друзья онлайн
- Weight: 2
- Parent menu item: Already exists
- Filters:
Жмем кнопку Override,- Добавляем еще один фильтр User: Last access и настраиваем его:
- Relationship: Content Profile
- Operator: Is greater than or equal to
- Value type: An offset from the current time such as....
- Value: -5 minutes
- Добавляем еще один фильтр User: Last access и настраиваем его:
- Basic settings:
- Name: Друзья онлайн (блок)
- Title:
Жмем кнопку Override, Друзья онлайн - Style:
Жмем кнопку Override,- Style: Grid
- Number of columns: 3
- Use pager:
Жмем кнопку Override, No - Items to display: 6
- Arguments:
- Изменяем аргумент User relationships: Requester user:
Жмем кнопку Override- Action to take if argument is not present: Provide default argument
- Default argument type: User ID from URL
- Action to take if argument is not present: Provide default argument
- Изменяем аргумент User relationships: Requester user:
- Fields:
- Изменим поле Content: Фотография (field_profile_photo):
Жмем кнопку Override,- Format: photo-50x50 image
- Изменим поле Content: Фотография (field_profile_photo):
- Sort criteria:
Жмем кнопку Override,- Добавляем сортировку Global: Random
- Basic settings:
- Name: Заявки
- Page settings:
- Path: friends/request
- Menu:
- Type: Menu tab
- Title: Заявки
- Weight: 3
- Parent menu item: Already exists
- Relationships:
Жмем кнопку Override,- Изменяем отношение Node: Content Profile:
- Relationship: requester
- Изменяем отношение Node: Content Profile:
- Arguments:
Жмем кнопку Override,- Удаляем аргумент User relationships: Requester user
- Добавляем аргумент User relationships: Requestee user и настраиваем его:
- Validator options:
- Validator: User
- Type of user argument to allow:: Only allow numeric UIDs
- Action to take if argument is not present: Provide default argument
- Default argument type: User ID from logged in user
- Validator options:
- Filters:
Жмем кнопку Override,- Изменяем фильтр User: Active:
- Relationship: requester
- Изменяем фильтр User relationships: Relationship status:
- Status: Pending
- Изменяем фильтр User: Active:
- Fields:
Жмем кнопку Override,- Изменяем поле User: Name:
- Relationship: requester
- Изменяем поле User: Name:
Темизация views
Темизировать мы надо 2 шаблона, где будем выводить поля "руками".
- views-view-fields--friends--block.tpl.php - шаблон для блоков.
код:
<?php
$uid = $row->users_user_relationships_uid;
$name = $fields['name']->raw;
// переменная для отображаемого имени пользователя
if ($fields['field_profile_name_value']->content && $fields['field_profile_surname_value']->content) {
$name = $fields['field_profile_name_value']->content .' '. $fields['field_profile_surname_value']->content;
}
elseif ($fields['field_profile_name_value']->content) {
$name = $fields['field_profile_name_value']->content;
}
$tmp = explode(' ', $name, 2);
if (count($tmp) == 2) {
$tmp[1] = '<small>'. $tmp[1] .'</small>';
}
$name = implode('<br/>', $tmp);
if ($fields['field_profile_photo_fid']->raw) {
$photo = $fields['field_profile_photo_fid']->content;
}
else {
$photo = theme('imagecache', 'photo-50x50', 'sites/default/files/profile_photos/default.png');
}
?>
<div class="friend-block">
<?php print l($photo, 'user/'. $uid, array('html' => TRUE));?>
<span class="user-name"><?php print l($name, 'user/'. $uid, array('html' => TRUE));?></span>
</div>
CSS в тему:
.block-views .view-friends td {
vertical-align:top;
}
.friend-block {
width: 50px;
text-align:center;
overflow: hidden;
}
.friend-block .user-name {
font-size:11px;
} - views-view-fields--friends--page.tpl.php - шаблон для страниц.
код:
<?php
$uid = $row->users_user_relationships_uid;
global $user;
if ($view->current_display == 'page_4') {
$uid = $row->users_user_relationships_1_uid;
}
$name = $fields['name']->raw;
// переменная для отображаемого имени пользователя
if ($fields['field_profile_name_value']->content && $fields['field_profile_surname_value']->content) {
$name = $fields['field_profile_name_value']->content .' '. $fields['field_profile_surname_value']->content;
}
elseif ($fields['field_profile_name_value']->content) {
$name = $fields['field_profile_name_value']->content;
}
if ($fields['field_profile_photo_fid']->raw) {
$photo = $fields['field_profile_photo_fid']->content;
}
else {
$photo = theme('imagecache', 'photo-100x100', 'sites/default/files/profile_photos/default.png');
}
?>
<div class="friend-page">
<div class="friend-left">
<?php print l($photo, 'user/'. $uid, array('html' => TRUE));?>
</div>
<div class="friend-right">
<span class="user-name"><?php print l($name, 'user/'. $uid, array('html' => TRUE));?></span>
<?php
$user_actions[] = l('Отправить сообщение', "messages/new/$uid", array('query' => drupal_get_destination()));
// разная сслыка в зависимоти от вида
if ($view->current_display == 'page_4') {
$user_actions[] = l('Добавить в друзья', "user/$user->uid/relationships/requested/$row->rid/approve", array('query' => drupal_get_destination(), 'attributes' => array('class' => 'user_relationships_popup_link')));
$user_actions[] = l('Отклонить заявку', "user/$user->uid/relationships/requested/$row->rid/disapprove", array('query' => drupal_get_destination(), 'attributes' => array('class' => 'user_relationships_popup_link')));
}
else {
$user_actions[] = l('Удалить из друзей', "user/$user->uid/relationships/$row->rid/remove", array('query' => drupal_get_destination(), 'attributes' => array('class' => 'user_relationships_popup_link')));
}
print theme('item_list', $user_actions);
?>
</div>
<div class="clear-block"></div>
</div>
CSS в тему:
.friend-page .friend-left {
float:left;
width:120px;
}
.friend-page {
border-bottom:1px solid #ddd;
padding:10px 0;
}
.views-row-first .friend-page {
padding-top:0;
}
.views-row-last .friend-page {
border:none;
padding-bottom:0;
}
.friend-page .friend-right .item-list {
float: right;
}
Теперь сделаем заголовок блока в виде ссылки на соответствующую страницу, для этого создадим два шаблона в папке темы: block-views-friends-block_1.tpl.php и block-views-friends-block_2.tpl.php. Код у них идентичный, кроме url, во втором блоке пишите friends/online.
<?php if (!empty($block->subject)): ?>
<h2 class="title">
<?php
global $user;
if ((arg(0) == 'user' && is_numeric(arg(1))) && $user->uid != arg(1)) {
$uid = arg(1);
print l($block->subject, 'friends/'. $uid);
}
else {
print l($block->subject, 'friends');
}
?>
</h2>
<?php endif;?>
<div class="content"><?php print $block->content ?></div>
</div>
CSS в тему:
#block-views-friends-block_2 h2.title {
font-family: Arial;
font-size: 14px;
font-weight: bold;
}
#block-views-friends-block_1 h2.title a,
#block-views-friends-block_2 h2.title a {
color:#494949;
}
#block-views-friends-block_1 table,
#block-views-friends-block_2 table {
margin:0;
}
Должно получиться нечто вроде этого.

Вывод ссылок на действия добавить в друзья на странице пользователя
Добавим ссылки Добавить в друзья и Удалить из друзей. В функцию mymodule_preprocess_user_profile добавим код, сразу после $user_actions = array();. Не забудьте в коде $ur_id = 1; изменить на id своего relationship.
// ссылки на добавление/удаление друзей
if (module_exists('user_relationships_api')) {
if (!user_access('can have relationships') || $user->uid != $account->uid) {
$existing_relationships = user_relationships_load(array('between' => array($user->uid, $account->uid)), array('sort' => 'rtid'));
if (!isset($existing_relationships[$ur_id])) {
$user_actions[] = l('Добавить в друзья', "relationship/{$account->uid}/request/$ur_id", array('query' => drupal_get_destination(), 'html' => TRUE, 'attributes' => array('class' => 'user_relationships_popup_link')));
}
elseif ($existing_relationships[$ur_id][0]->approved) {
$user_actions[] = l('Удалить из друзей', "user/{$account->uid}/relationships/{$existing_relationships[$ur_id][0]->rid}/remove", array('query' => drupal_get_destination(), 'attributes' => array('class' => 'user_relationships_popup_link')));
}
}
}
Личные сообщения
Privatemsg - модуль для личный сообщений. Установите 6.x-2.x-dev версию и включите права доступа для зарегистрированных пользователей read privatemsg, write privatemsg и delete privatemsg.
Модуль практически не нуждается в особых настройках, поэтому сразу приступим к темизации.
Темизация Privatemsg
Сначала удалим с помощью хука список участников беседы:
unset($content['participants']);
}
В свою тему в template.php:
$field = array();
$field['data'] = format_date($thread['last_updated'], 'custom', 'j F Y в H:i');
$field['class'] = 'privatemsg-list-date';
return $field;
}
Здесь немного поправили формат даты в колонке на странице
messages.Теперь будем темизировать сами сообщения, для этого в mymodule.module создадим функцию mymodule_preprocess_privatemsg_view:
$message = $vars['message'];
// загружаем профиль
$profile = content_profile_load('profile', $message['author']->uid);
// выводим фото пользователя
if ($profile->field_profile_photo[0]['fid']) {
$photo = theme('imagecache', 'photo-50x50', $profile->field_profile_photo[0]['filepath']);
}
else {
$photo = theme('imagecache', 'photo-50x50', 'sites/default/files/profile_photos/default.png');
}
// добавляем для неё переменную в шаблон privatemsg-view.tpl.php
$vars['author_picture'] = l($photo, 'user/'. $message['author']->uid, array('html' => TRUE));
}
Также добавим шаблон privatemsg-view.tpl.php в папку с темой.
//each file loads it's own styles because we cant predict which file will be loaded
drupal_add_css(drupal_get_path('module', 'privatemsg').'/styles/privatemsg-view.css');
?>
<div class="privatemsg-box-fb" id="privatemsg-mid-<?php print $mid; ?>">
<div class="left-column">
<div class="avatar-fb">
<?php print $author_picture; ?>
</div>
</div>
<div class="middle-column">
<div class="name">
<?php print $author_name_link; ?>
</div>
<div class="date">
<?php print format_date($message['timestamp'], 'custom', 'j M Y в H:i'); ?>
</div>
</div>
<div class="right-column">
<div class="message-body">
<?php print $message_body; ?>
</div>
<?php if ( isset($message_actions) ) : ?>
<div class="message-actions">
<?php print $message_actions; ?>
</div>
<?php endif ?>
</div>
<div class="clear-block bottom-border"></div>
</div>
и
CSS в тему:
margin: 20px 0 20px 200px;
}
.privatemsg-box-fb {
text-align: left;
}
.privatemsg-box-fb .avatar-fb {
margin: 5px;
text-align: center;
}
.privatemsg-box-fb .picture {
float: none;
padding: 0;
}
.left-column {
width:auto;
float: left;
}
.middle-column {
float: left;
text-align:left;
width: 150px;
}
.right-column {
margin:0 0 0 210px;
}
.bottom-border {
border-bottom:1px solid #E9EFF3;
margin:10px 0;
}
.message-actions ul {
padding:0;
font-size:11px;
}
.date {
font-size:10px;
margin:0;
color: #777777;
}
.name {
font-size:12px;
font-weight:bold;
margin:5px 0 0;
}
.message-body {
font-size:14px;
}
Темизированная страница сообщений:

Вывод ссылки "Отправить сообщение" на странице пользователя
Добавим в профиль ссылку "Отправить сообщение", для этого в функцию mymodule_preprocess_user_profile добавим код, сразу после $user_actions = array();.
if (module_exists('privatemsg')) {
if ($user->uid != $account->uid) {
if ($url = privatemsg_get_link(array($account))) {
$user_actions[] = l('Отправить сообщение', $url, array('query' => drupal_get_destination()));
}
}
}
Следующие 2 раздела описывать подробно описывать не буду, там всё достаточно понятно.
Рейтинги
- User Points + User Points Contributed modules - начисление баллов за различные действия.
- Vote Up/Down, Fivestar - голосование за ноды.
Уведомления
Все вышеперечисленные модули так или иначе интегрированы с молулем Rules. С помощью него можно создавать реакции на события, такие как: создание определенного материала, предложение дружбы и тд. Но почти в каждом модуле есть и собственная система уведомлений, можно использовать и её.
Меню пользователя
В меню добавим ссылки:
- Моя страница
- Мои друзья
- Мои сообщения
- Настройки аккаунта
Нужно определить в модуле блок, копируем код:
if ('list' == $op) {
$blocks['user-menu'] = array(
'info' => t('User menu'),
'cache' => BLOCK_NO_CACHE,
);
return $blocks;
}
elseif ('view' == $op) {
$block = array();
switch ($delta) {
case 'user-menu':
$block = mymodule_block_user_menu();
break;
}
return $block;
}
}
function mymodule_block_user_menu() {
global $user;
$links = array();
$links[] = l('Моя Страница', 'user/'. $user->uid) . l('ред.', 'user/'. $user->uid .'/profile/profile', array('attributes' => array('class' => 'user-edit-link')));
// Мои друзья
if (module_exists('user_relationships_api')) {
if (user_access('can have relationships') && user_access('maintain own relationships')) {
$ur_id = 1; // id relationship
$title = 'Мои Друзья';
$count = db_result(db_query("SELECT COUNT(rid) FROM {user_relationships} WHERE requestee_id = %d AND approved = 0 AND rtid = %d", $user->uid, $ur_id));
if ($count) {
$title .= " (<b>$count</b>)";
$links[] = l($title, 'friends/request', array('html' => TRUE));
}
else {
$links[] = l($title, 'friends');
}
}
}
// Мои сообщения
if (module_exists('privatemsg')) {
if (privatemsg_user_access('read privatemsg') || privatemsg_user_access('read all private messages') ) {
$title = 'Мои Сообщения';
if ($count = privatemsg_unread_count()) {
$title .= " (<b>$count</b>)";
}
$links[] = l($title, privatemsg_get_dynamic_url_prefix($user->uid), array('html' => TRUE));
}
}
$links[] = l('Настройки аккаунта', 'user/'. $user->uid .'/edit');
if (!empty($links)) {
$block['content'] = theme('item_list', $links);
}
return $block;
}
Добавим css в тему:
color:#777777;
float:right;
}
Поместите блок в левый регион и в его настройках сделайте видимым только для зарегистрированных пользователей.
Стена
Стену сделаем из комментариев к ноде профиля пользователя. Для того чтобы добавить комментарии на страницу с профилем добавим в функцию mymodule_preprocess_user_profile код:
$variables['wall'] = comment_bonus_api_comment_render($profile);
}
elseif (function_exists('comment_render')) {
$variables['wall'] = comment_render($profile);
}
и в шаблоне user-profile.tpl.php выведем эту переменную:
Настройка комментариев
В настройках типа profile:
- Default comment setting: Read/Write
- Comment subject field: Disabled
- Default comments per page: 300
- Preview comment: Optional
- Location of comment submission form: Display below post or comments
Не забудьте дать права на добавление комментариев зарегистрированным пользователям.
Настройка AJAX Comments
Далее установите dev версии модулей AJAX Comments и Comments bonus API.
На странице admin/settings/ajax_comments Form always expanded: поставить галочку, Default row count: 3, Content types: Profile.
Темизация вывода
Для начала скроем фразу "Сomments", для этого скопируйте файл comment-wrapper.tpl.php из папки модуля Comments bonus API в папку с вашей темой и удалите строку:
<h2 class="comments"><?php print t('Comments'); ?></h2>
<?php endif; ?>
Следующим шагом темизируем вывод комментариев, для этого в mymodule.module добавим:
if (isset($vars['node'])) {
$vars['template_files'][] = 'comment-'. $vars['node']->type;
}
if ($vars['node']->type == 'profile') {
$comment = $vars['comment'];
$profile = content_profile_load('profile', $comment->uid);
// выводим фото пользователя
if ($profile->field_profile_photo[0]['fid']) {
$photo = theme('imagecache', 'photo-50x50', $profile->field_profile_photo[0]['filepath']);
}
else {
$photo = theme('imagecache', 'photo-50x50', 'sites/default/files/profile_photos/default.png');
}
// добавляем для неё переменную в шаблон privatemsg-view.tpl.php
$vars['author_picture'] = l($photo, 'user/'. $comment->uid, array('html' => TRUE));
}
}
Теперь мы можем добавить шаблон комментария только для типа profile, в папке с темой comment-profile.tpl.php:
<div class="comment-left">
<div class="avatar"><?php print $author_picture ?></div>
</div>
<div class="comment-right">
<div class="user"><?php print $author ?></div>
<div class="content">
<?php print $content ?>
</div>
<div class="meta">
<div class="date"><?php print format_date($comment->timestamp, 'custom', 'j M Y в H:i') ?></div>
<?php if ($links): ?>
<div class="links"><?php print $links ?></div>
<?php endif; ?>
</div>
<div class="clear-block"></div>
</div>
</div>
CSS в тему:
font-family: Arial;
font-size: 14px;
font-weight: bold;
}
.wall #comments,
.wall #comments .comment {
margin:0;
padding:0;
border:none;
}
.wall #comments {
border-top: 1px solid #CCCCCC;
}
.wall #comments .comment {
padding:10px 0;
border-bottom: 1px solid #CCCCCC;
}
.wall .comment-left {
float:left;
}
.wall .comment-right {
margin-left:60px;
}
.wall .meta .date,
.wall .meta div.links {
float:left;
font-size: 10px;
}
.wall .meta .date {
margin-right:10px;
}
.wall .user {
font-weight:bold;
font-size:11px;
}
.wall .box h2,
.wall h2.title {
display:none;
}
Удалим лишнее на форме. В mymodule_form_alter:
$form['comment_filter']['comment']['#title'] = '';
$form['comment_filter']['comment']['#rows'] = 3;
unset($form['_author'], $form['preview']);
}
В следующей части рассмотрим контент в социальных сетях.





Комментарии (154)
спасибо!
Статья супер, у меня сейчас задача вывести field group tabs то есть вкладки я так понял тут это реализовано через preprocess ?
вкладки в профиле не выводятся, только на форме, совершенно стандартным способом
Прошу извинить, поясните, пожалуйста, когда пишется "views-view-fields--friends--block.tpl.php - шаблон для блоков." это значит, что надо создать файл с названием "views-view-fields--friends--block.tpl.php" или текущий "block.tpl.php" заменить пользовательским с нижеприведенным кодом?
создать, block.tpl.php - это шаблон для блока, а views-view-fields--friends--block.tpl.php шаблон для вывода ряда (тоесть группы полей одной сущности) из модуля views
Еще раз простите мою тупизну. То есть создается файл views-view-fields--friends--block.tpl.php и в него вписывается нижеследующий код?
да, не забудьте в настройках views в разделе Theme: Information нажать кнопку Rescan template files, там должно подсветиться имя этого шаблона
И еще на этапе создания views для друзей в предпросмотре представления появляться ошибка
user warning: Unknown column 'field_profile_photo_fid' in 'field list' query: SELECT COUNT(*) FROM (SELECT field_profile_photo_fid AS field_profile_photo_fid, field_profile_photo_list AS field_profile_photo_list, field_profile_photo_data AS field_profile_photo_data FROM user_relationships user_relationships LEFT JOIN users users_user_relationships ON user_relationships.uid = users_user_relationships.uid WHERE users_user_relationships.status = 0 ) count_alias in D:\xampp\htdocs\social\sites\all\modules\views\plugins\views_plugin_pager.inc on line 141.
Значит ли это, что я сделала какую-то ошибку?
скажите версии модулей views и user_relationships?
Views 6.x-3.0-alpha4
UR-API 6.x-1.0
попробуйте с 6.x-2.12, с 3й веткой какие-то проблемы
field_profile_about - одно и то же машинное название дважды. Система так не разрешает.
извините, О сайте нет такого поля, я ошибся в статье. Спасибо что заметили.
Извините, не очень понятна фраза
В настройках admin/settings/site-information за главную страницу установить mymodule_frontpage.
в смысле в поле
Default front page: *
http://localhost/social/user/1 node
The home page displays content from this relative URL. If unsure, specify "node".
Что надо ввести вместо node?
mymodule_frontpage
Ой, извините, раньше что-то не разрешало вписать этот адрес, а теперь разрешило. Переделываю просто еще раз с нуля все шаг за шагом. Спасибо!
при отправке в профиле сообщения на стену перекидывает на страницу профиля (не user_profles, а на страницу типа материала profile).
Как от этого избавится???
тут же написано самая последняя функция
Да да, пропустил это. Спасибо.
Вопросик как для типа материала profile вместо отправить комментарий вывести - написать на стену (например)?
в самом конце статьи код для изменения формы комментов, туда же внутрь в условия добавить:
$form['submit']['#value'] = 'Написать на стену';
}
нене, мне не кнопку самбита. а над формой текст отправить комментарий или комментировать и так как профиль с комментариями не вяжется - хотелось бы "Написать на стену"
никак не изменить, только скрыть средствами css
ну тогда скроется везде...
Переставила views на 2.12
На вот этом этапе создания страницы Друзья онлайн
В Relationship: разрешается только один вариант - "requestee"
при создании вида View type: User relationship выбрали? на форме там где название вида вводится
у меня тоже
Удаляем аргумент User relationships: Requester user
Удаляем аргумент User relationships: Requestee user и настраиваем его:
В смысле добавляем и настраиваем?
Но тогда "Type of user argument to allow:: Only allow numeric UIDs" - не видно такого
да добавить, и выше на ваши комментарии я дал ответ.
И не надо копировать сюда весь текст, делайте свои сообщения короткими. уважайте людей иначе последует бан.
и почему то исчезло под формой комментариев на "стене" плюшки - уведомить меня о новых комментариях. Было бы неплохо получать на ящик сообщения что кто то отписался на стене.
когда исчезло? телепатов тут нет, я не обещал совместимость с тысячами модулей
да, нет. я думал что что-то упустил. теперь ясно, что пока уведомлений о написанной на стене записи не реализовано.
спасибо за статью. усовершенствую код профиля своего.
И почему то у пользователей в их профиле нет стены (комментов) они их видят только у никнейма явл. администратором.
может в нодах их профилей стоят запрет на комменты?
все верно. так и было.
т.е. если раньше комменты были отключены. то у всех 100 000 человек не будут стены так? Вопросы (если можно сюда, можете списать балы если что) ... 1. как включить у всех профилей комменты 2. можно ли на друпале сделать как -то чтобы пользователь сам решал включить ему стену или отключить...
1) выполнить запрос
2) можно создать в профиле специальную вкладку для таках настроек. Туда добавлять поля типа int поля в виде чекбокса
потом в коде где задается переменная $wall добавить условие типа
//тут задается переменная
}
Вашу схему 2 использую для других целей, но я так думаю это решит лишь вопрос показывать не показывать (визуально) а показывать но не отписываться (закрыть отписку)?
т.е. 3 чекбокса дублирующие варианты комменты и на них подвесить изменения показа комментов. вот такое реализуемо?
можно это програмить надо
Спасибо. Все сделала. Все работает.
Спасибо большое за такой детальный разбор!
При создании меню пользователя получаю ошибку "Call to undefined function privatemsg_get_dynamic_url_prefix()".
попробуйте 6.x-2.x-dev версию privatemsg
Спасибо, проблема решена)
Можете так же подсказать версии модулей для аватаров? Для загрузки фотографии в профиль не отображаются изображения - и с этой проблемой сталкивался уже ранее.
Ещё столкнулся с такой проблемой: новые друзья добавляются в список сразу, до подтверждения, и зарегистрированные юзеры не могут удалить друга - только админ (просто висит загрузка ajax, а при отключении ajax в настройках модуля UR получаю страницу с запрещённым доступом).
И ещё: может, имеет смысл добавить поля в профайле в регистрацию?
проверьте права доступа модуля, и настройки, там есть галочки типа Requires Approval
Каким образом у вас блок с друзьями вписался так красиво под фотографией? В моём случае, определяя блоки "друзья", "друзья онлайн" в контент, они отвратительно располагаются под сообщениями на стене.
Ps проблема с удалением друзей осталась
наверно у вас в шаблоне user-profile.tpl.php не хватает divов, проверьте код, должны быть 2 колонки
<div class="profile-left">и<div class="profile-right">Спасибо, не обратил внимание на существование profile-region и выводил блоки в контент. Теперь всё отлично)
а у меня при просмотре профля выдает ошибку
warning: htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument in /home/wmpoorru/domains/wm-poor.ru/public_html/a/includes/bootstrap.inc on line 856.
warning: htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument in /home/wmpoorru/domains/wm-poor.ru/public_html/a/includes/bootstrap.inc on line 856.
это не относится к данной статье, ищите решение на drupal.org
поменял в mymodule.module на UTF8
Побольше бы таких постов. Спасибо.
Хмм..никто не отвечает. Получается что тема уже заезжана.
Ещё при попытке загрузить фоторафию выводит ошибку :
Произошла HTTP ошибка 0. \n/drupal/filefield/ahah/profile/field_profile_photo/0
При входе на страницу пользователя, падает центральная часть под левую, а правая под центральную (только в IE, другие браузеры нормально) использую тему Garland. В "Средства разработчика" указано что тип документов "совместимый", если явно указать "стандартный" то отображение нормально. как это явно прописать в page.tpl.php? Спасибо.
Реально одна из самых полезных статей(если не самая:)), что довелось читать за те пару месяцев, что изучаю Друпал.
Автору громадное спасибо за труды.
Отличная статья. Не хватает живого примера и сборка целиком? Кто поделится?
статья отличная! вот только про пользовательские фотоальбомы не сказано...
Действительно интересный материальчик. А Вы серьезно писать не подумывали? Думаю, у Вас бы получилось. По крайней мере, можно было бы очень посещаемый блог получить. Сейчас в интернете с уникальными интересными текстами проблема.
а через Panels сделать подобную страницу профиля не получится?
Получится сделать и этот вариант будет удобен для новичков
спасибо за ответ.
мне как новичку и незнающему php, именно такой вариант удобнее.
Все сделал один в один до стадии "Вот так должен выглядеть профиль после темизации." При загрузке страницы "Мой аккаунт" выходит ошибка "HTTP 500".
Убирал
// перекрываем callback функцию
function mymodule_menu_alter(&$items) {
$items['user/%user_uid_optional']['page callback'] = 'mymodule_user_view';
}
// в отличии от стандартной, здесь нет загрузки стандартного профиля
function mymodule_user_view($account) {
drupal_set_title(check_plain($account->name));
return theme('user_profile', $account);
}
открывается пустая страница.
В чем может быть проблема?
В дополнение к предыдущей записи. В отчете об ошибке в Друпале сообщение:
call_user_func_array() expects parameter 1 to be a valid callback, function 'mymodule_user_view' not found or invalid function name в файле Z:\home\drupal\www\includes\menu.inc в строке 349.
За помощь в решении данной проблемы готов перевести свое спасибо в ваш кошелек WM.
Проблему устранил, но все данные профиля расположены внизу, под фото, как было написано в одном из постов выше.
Привет! Спасибо за статью, очень помогла .
У меня есть проблемка одна - не отображается массив $user_actions на странице профиля. Не могу понять почему.
В user-profile.tpl стоит print $user_actions, и всё равно не отображает=(
Доделал до конца как написано в посте - все заработало.
Новый вопрос: как в личных сообщениях сделать так, чтобы месседжы отправлялись не usernam'у на имя и фамилию?
Все сделал как надо дошол до конечного пункта, "вот так должна выглядить страница"
Ну она у меня выглядит так.. сперва вот такая ошибка
warning: htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument in /home/spainbook/domains/spainbook.ru/public_html/includes/bootstrap.inc on line 856.
warning: htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument in /home/spainbook/domains/spainbook.ru/public_html/includes/bootstrap.inc on line 856.
ну и ниже Дефаулт фото - которое я загрузил в Профиль_юзерс. И ВСЁ. Почему именно так?
Всем привет.. это мой первый проект на Drupal.. может кто подскажет куда это писать?
function mymodule_form_alter(&$form, $form_state, $form_id) {
if ('profile_node_form' == $form_id) {
$form['title']['#type'] = 'value';
$form['title']['#required'] = FALSE;
}
}
function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
if ($node->type == 'profile' && $op == 'presave') {
$node->title = $node->name;
}
}
unset($content['participants']);
}
$variables['wall'] = comment_bonus_api_comment_render($profile);
}
elseif (function_exists('comment_render')) {
$variables['wall'] = comment_render($profile);
}
в свой модуль, для первого проекта сильно сложную тему взяли
Спс, ничего разберусь.. невпервой)
Вопросик по модулю views
использую версию 6.x-2.16 ...
Установливаю традиционо) в site/all/modules, далее включаю все компоненты модуля views.
Далее иду по адресу admin/build/views ... и мой проект радует меня белым экраном)
На Windows машине и на Linux ситуация аналогичная.
подробней можно посмотреть на ютуб:
http://www.youtube.com/watch?v=Pn7ELVRSvBY&feature=youtu.be
смотрите логи веб-сервера и php. пустая страница это обычно 50х ошибка.
Upd: кеш очистить после установки модулей, тоже помогает.
Вот на эти строчки жалуется:
http://imglink.ru/show-image.php?id=cde84744b13ec6f111819300030b62ad
ну там же английским по-белому написано: не могу открыть директорию sites/all/modules/views, доступ запрещен.
используйте chmod, chown или как-то еще поправьте права доступа на директории и файлы, чтобы веб-сервер мог к ним обращаться.
Вообшем права на папку поменял непомогло
перенес проект на Денвер все зароботало, отключил несколько модулей, захожу в Views и опять белый экран
Потом ОЧИСТИЛ в БД таблицы cache_* и sessions, все заработало
далее уже на Денвере отключил несколько модулей и опять белый эран в Views,очистил таблицы и опять все работает
в Ubuntu тоже самое! в log файле никаких ошибок!
В чем проблема?
у меня тоже на шестерке при установке-удалении, включении-отключении модулей такое случается временами. иногда помогает просто обновить страницу, а иногда приходится очищать кеш вручную, через drush cc all или в Admin menu.
использую views 6.x-2.16. У меня нет поля "Type of user argument to allow:: Only allow numeric UIDs". в чем может быть проблема?
p.s. большое спасибо за статью, очень полезная.
Вообщем с Views разобрался)
но после настройки Views на страницах Друзья, Друзья онлайн, Заявки и на странице профил где я включил (показывать в профиле в виде блока)
так же тематизировал шаблон и добавил нужное в Css
выводится вот такой код
http://imglink.ru/show-image.php?id=0fcbd532c30e33308be3f584abb3d8e6
http://imglink.ru/show-image.php?id=8fdaf12fb23087f3cee3fca58bb10b5d
в настройках views отладка включена?
У меня утановлен модуль Devel
отключил во вкладке Tools функкцию:
Enable views performance statistics via the Devel module
и запросов нестало
у меня такой вопрос - mymodule.module - это что за файл, он так называется или как то иначе? где он должен находиться, какой путь?
это файл, который вы должны создать, находиться он должен в папке mymodule, там же где и остальные модули, например, sites/all/modules
Неиспользуемое поле title мы скрываем и при сохранении будем менять значение на имя пользователя используя код в модуле:
Этот title как скрыть? в каком файле код менять?
В mymodule.module
mymodule_ в именах функций указывает на принадлежность этому модулю или теме. почитайте какую-нить статью по созданию модулей в друпале, тогда многое станет проще понять здесь.
function mymodule_...Статья хорошая, спасибо)
все сделал все работает тока на стене писать ничего нельзя
http://imglink.ru/show-image.php?id=ccee705661871b2ad4d59c66a554b020
и один вопрос по статье.. из любопытства.. А КНОПКА ВЫХОД ГДЕ))?
немогу решить вопрос с кодировкой ����� вот такие символы вместо Имя, Фамилия, Пол, Стена... а введённые данный нормально отображаются, куда копать?
Кодировку поменяйте в файле mymodule.module или в user-profile.tpl.php на UTF-8
спасибо! помог!
У меня дак нету такого в mymodule
if ($form_id == 'comment_form') {
$form['comment_filter']['comment']['#title'] = '';
$form['comment_filter']['comment']['#rows'] = 3;
unset($form['_author'], $form['preview']);
}
http://imglink.ru/show-image.php?id=e60eafac80904de6c7e3d65acad0af27
автор имел в виду, что нужно эти строки вставить в mymodule.
хех)
ну там просто написанно Удалить (Удалим лишнее на форме.)
нетак понял
вот туда хоть вставил? Все работает кроме стены
http://imglink.ru/show-image.php?id=503a65d2dcdfd446868f42a60550ca5f
просто это мой первый проект на данной CMS
для первого проекта это сложноватая статья. изучите хотя бы азы создания модулей в друпале, работу с хуками, темами, иначе решение каждой непонятной мелочи из этой статьи у вас будет отнимать массу времени.
да.. но вопрос так и остался отрытым
у меня тока со стеной проблемы
Я всегда делаю то, чего я не умею, чтобы этому научиться.
со стеной я вам подсказать не могу.
почти правильно, должно получиться так:
if ($form_id == 'profile_node_form') {
$form['title']['#type'] = 'value';
$form['title']['#required'] = FALSE;
}
if ($form_id == 'comment_form') {
$form['comment_filter']['comment']['#title'] = '';
$form['comment_filter']['comment']['#rows'] = 3;
unset($form['_author'], $form['preview']);
}
}
спасибо! помогли)
у меня тока вопрос с переменной для коментариев остался
пробовал вывести как:
ничего неполучилось
http://imglink.ru/show-image.php?id=34df24a821ff791955af0b1d5dfa9604
как быть)?
Пробавал деже так, результат аналогичный
http://imglink.ru/show-image.php?id=a7897b7109ca8d3556cf7d96b8d8eb4d
Ребята! в кого нормально все работает, пожалуйста поделитесь готовым решением!, а то ошибки уже замучили 8 раз уже все переделываю и постоянно одно и тоже, при перезагрузках радует белый экран и красным высвечивает всякие ошибки.
Пожалуйста выложите готовое решение в кого все норм работает, где то на файлообменик или яндекс файлы, желательно тему и модуль. а лучше весь сайт)
P.S.при запуске ссылку на ваш сайт гарантирую!
отлично все работает кроме отображения друзей на страничке.
Вопрос... этих друзей что нужно выводить блоком views и поставить отображение только на глав стран?
Подскажите плз. как это реализовать.
так я и не понял, готовое решение дали только pasha5282 или надо просить!? поделитесь со мной тоже! Пожалуста.
Подскажите, как быть.
Заработало!!! Спасибо!!! Кодировку поменял в mymodule.module!
не подключается блоки с темизацией для отображения друзей, block-views-friends-block_1.tpl.php и _2.tpl.php их просто не видит вюшка, как это исправить?, остальная темизация подключилась.
В настройках Views, в 3-м пункте:

3.Добавляем отображение типа page.
При установке (Page settings: Path: friends/list) возникает ошибка
Views 6.x-2.16
UR-API 6.x-1.1
как быть?
Решилась проблема
вместо views 6.x-2.16 поставил 6.x-2.12
У меня такая же проблема, но замена views на 2.12 не спасла.... что делать? в чем еще может быть загвоздка?
Ошибка:
user warning: Unknown column 'field_profile_photo_fid' in 'field list' query: SELECT user_relationships.rid AS rid, field_profile_photo_fid, field_profile_photo_list, field_profile_photo_data, RAND() AS _random FROM user_relationships user_relationships LEFT JOIN users users_user_relationships ON user_relationships.requestee_id = users_user_relationships.uid LEFT JOIN users users_user_relationships_1 ON user_relationships.requester_id = users_user_relationships_1.uid WHERE (users_user_relationships.status = 0) AND (user_relationships.requester_id = 9 ) ORDER BY _random ASC LIMIT 0, 6 in /home/****/public_html/sites/all/modules/views/includes/view.inc on line 810.Ругается на
$this->execute($display_id);
// Check to see if the build failed.
if (!empty($this->build_info['fail'])) {
return;
}
З.Ы. Версия views уже 6.х-2.16
Для views-6.x-2.16 вьюхи "Друзья" не выводят ничего кроме ника пользователя, хотя, если выполнить SQL-запрос из live preview напрямую в базе, то он возвращает все данные из профиля (имя, фамилию, фото).
Проблема в длинных алиасах полей, вот запрос:
node_users_user_relationships_node_data_field_profile_photo.field_profile_photo_fid AS node_users_user_relationships_node_data_field_profile_photo_field_profile_photo_fid,
node_users_user_relationships_node_data_field_profile_photo.field_profile_photo_list AS node_users_user_relationships_node_data_field_profile_photo_field_profile_photo_list,
node_users_user_relationships_node_data_field_profile_photo.field_profile_photo_data AS node_users_user_relationships_node_data_field_profile_photo_field_profile_photo_data,
node_users_user_relationships.nid AS node_users_user_relationships_nid,
node_users_user_relationships.type AS node_users_user_relationships_type,
node_users_user_relationships.vid AS node_users_user_relationships_vid,
node_users_user_relationships_node_data_field_profile_photo.field_profile_name_value AS node_users_user_relationships_node_data_field_profile_photo_field_profile_name_value,
node_users_user_relationships_node_data_field_profile_photo.field_profile_surname_value AS node_users_user_relationships_node_data_field_profile_photo_field_profile_surname_value,
users_user_relationships__realname.realname AS users_user_relationships__realname_realname,
users_user_relationships__realname.uid AS users_user_relationships__realname_uid
FROM user_relationships user_relationships
LEFT JOIN users users_user_relationships ON user_relationships.requestee_id = users_user_relationships.uid
LEFT JOIN users users_user_relationships_1 ON user_relationships.requester_id = users_user_relationships_1.uid
LEFT JOIN node node_users_user_relationships ON users_user_relationships.uid = node_users_user_relationships.uid AND node_users_user_relationships.type = 'profile'
LEFT JOIN content_type_profile node_users_user_relationships_node_data_field_profile_photo ON node_users_user_relationships.vid = node_users_user_relationships_node_data_field_profile_photo.vid
LEFT JOIN realname users_user_relationships__realname ON users_user_relationships.uid = users_user_relationships__realname.uid
WHERE (users_user_relationships.status <> 0) AND (user_relationships.approved = '1') AND (user_relationships.rtid in ('1')) AND (user_relationships.requester_id = 1)
Решается патчем.
Проблема описана _http://drupal.org/node/571548
А еще у меня никак не получается переопределить user_login... в том, что выводится нету регистрации и восстановления пароля.
Очень ценный урок, спасибо. Как с Вами связаться?
Извините конечно но какая версия друпал используется на данном примере. Спасибо.
6
А подскажите если некоторые поля я хочу показывать при клике - показать полностью информацию - кликнув ссылка изменялась бы на скрыть полную информацию...
много решений показать скрыть/показать div но как сделать что бы ссылка менялась без перезагрузки страницы ?
а профиле (profile ) можно скрыть??? В табах? что бы редактировать можно было бы... и просмотр и настройка акаунта тоже вывести там же где и редактирование... профиля... ???
можно, но не для этого урока
Подскажите что -то своими силами не выходит.
я раньше выводил поля сразу шаблоне профиля
типа
if ($profile->field_sex[0]['value'] == '1') {
print t('Пол: ');
print ('мужской');
}
else {
if ($profile->field_sex[0]['value'] == '2') {
print t('Пол: ');
print ('женский');
}
else { }
}
а у вас все делается через модуль и выводиться только переменная в шаблоне уже со значением...
как переделать
$variables['profile_sex'] = $profile->field_sex[0]['safe'];
для моего случая???
вопрос снимается. пригляделся к коду и нашел решение .
вопрос:
если юзер еще вообще не редактировал свое профиль как вывести картинку для фотографиии , а налагично как для недозаполненого профиля
$variables['profile_photo'] = theme('image', 'sites/default/files/profile_photos/default.png');
еще вопрос по темизации. если юзер не загрузил но сохранил свой профиль - дефолт грузится. если загурзил свою фоту. грузится. а если не заходил и не редактировал вообще свой профиль - не грузится дефолтное.
как решить такую загвоздку?
Давно хотел спросить про баг на созданной стене.
после добавления новых комментов они всегда остаются с меткой - new.
как сделать что бы после обновления страницы коменты были просмотренные :::????
у вас тут Отправить комментарий скрыт в CSS
А я пытаюсь через box.tpl.php
вывести разные...
<?php if ($node->type == 'profile') {
print '<h2>' .('Add post on wall') .'</h2>';
}
else {
print '<h2>' .('Add comment') .'</h2>';
}
?>
<div class="content"><?php print $content ?></div>
</div>
но не выходит для типа нод сделать... разное
почему ???
c Views 3 и
user_relationships от Information added by drupal.org packaging script on 2012-01-25, version = "6.x-1.1+1-dev", core = "6.x"
друзья не выводятся...
это у всех так или косяк в настройке???
Народ подскажите пожалуйста, у меня картинка для фото не обрезает
image_crop модуль стоит?
Да стоит
C вьюхой 3 решил вопрос. Правда без темизации блоков.
Один вопрос на который не нашел ответа.
1. как вывести сумму взамосвязей (друзей - пусть у нас только друзья) в хедере вьюхи (блок списка друзей)
2. как вывести сумму взамосвязей онлайн пользователей в хедере вьюхи (блока списка онлайн друзей)
код для друпал 7 не подходит?
Так как же быть с неработающей стеной? Кто-нибудь решил проблему?
Добавил в статью список модулей при который всё работает, только что сам всё пересобрал.
Видимо, у mymodule url должен быть другой, не _http://drupal.org/project/mymodule
в начале статьи для него заготовка есть
уже третий раз пробую. затычка на одном и том же месте
Page settings:
Path: friends/online
Menu:
Type: Menu tab
Title: Друзья онлайн
Weight: 2
Parent menu item: Already exists Already exists нет
Filters:
Жмем кнопку Override,
Добавляем еще один фильтр User: Last access и настраиваем его:
Relationship: Content Profile Content Profile то же нет, есть requestee и requester
Operator: Is greater than or equal to
Value type: An offset from the current time such as....
Value: -5 minutes
с меню ошибка, нет этого пункта, но он и не нужен
а по поводу Relationship, во 2м пункте в page мы добавили 3 штуки, так почему у вас на следующем шаге оказалось 2? тут вы ошиблись наверное
во 2м пункте и было 3 ,а потом почему то везде стало 2.
А как узнать id своего relationship ?
создайте заново, в чем проблема?
Вопрос я профиль разбил на две ноды то есть одна нода profile (где о человеке) и вторая нода - setting (разные настройки админа для каждого юзера).
вопрос как при переходе на форму (редактирования) setting заголовок был не Мой профиль а другой...
игрался с условиями в файле темплета и по типу материала и адресу ни хочет меняться заголовок на необходимый...
Подскажите пожалуйста. Никак не могу добавить дополнительные поля в профиле в контактах: емейл, скайп
Где я ошибся?
В модуль вставляю следующее
$variables['profile_mymail'] = $profile->field_profile_mymail[0]['safe'];
$variables['profile_skype'] = $profile->field_profile_skype[0]['safe'];
а в юзер темпл пхпп следующее:
<div class="profile-group">
<div class="profile-group-label">Контактные данные<?php if (node_access('update', $profile)) print l('Редактировать', "user/$account->uid/profile/profile", array('fragment' => 'tabset-tab-4')); ?></div>
<div class="profile-group-content">
<table>
<?php if ($profile_phone): ?><tr><td class="field-label">Телефон:</td><td><?php print $profile_phone; ?></td></tr><?php endif; ?>
<?php if ($profile_mymail): ?><tr><td class="field-label">Почта:</td><td><?php print $profile_mymail; ?></td></tr><?php endif; ?>
<?php if ($profile_skype): ?><tr><td class="field-label">Скайп:</td><td><?php print $profile_skype; ?></td></tr><?php endif; ?>
</table>
</div>
</div>
<?php endif; ?>
За ранее большое спасибо за помощь!
PS: "телефон" отображаеться, а мыло и скайп нет.
одно поле добавил сам "Профессия" эти два тоже делаю по аналогии, но нивкакую, кеш чистил.
$variables['profile_mymail'] = $profile->field_profile_mymail[0]['safe'];
$variables['profile_skype'] = $profile->field_profile_skype[0]['safe'];
так только для текстовых полей, если у вас нестандартные поля, то нужно смотреть какие в объекте $node значения.
Приношу извинения за свою тупость. Сидел за профилем до утра, уже голова не варила. У меня просто была ошибка в названиях. Благодарю за быстрый отклик.
Доброе утро!
У меня снова проблема. В профиле не отображаются "Редактировать страницу" "Изменить фотографию" ссылки на добавление/удаление друзей и отправить сообщения
В общем все ссылки, которые должны быть ниже фото, как я понял
Подскажите пожалуйста, в чем может быть проблема, или где я мог ошибиться? За ранее благодарен за помощь.
Такая мелочь несколько часов мозг выносила... в мумодуль поставил кодировку утф8 и все работает )))))))
А как сделать, что бы вместо ссылки "Отправить сообщение" поместить туду кнопку "Отправить сообщение"?
через css сделать нужный стиль
Еще вопрос. Когда на страничке своего друга нажимаешь на "Друзья" (Ссылка в названии блока с его друзьями) то попадаю на страницу моих друзей а не его, так должно быть, или я ошибся где то?
Как сделать, что бы можно было смотреть список друзей друга?
Ошибочка была, спасибо!
в статье заменил код для шаблона блоков тут код перед css котрый
Я правильно понял, код этого файла views-view-fields--friends--block.tpl.php нужно заменить?
Заменил его, все равно, попадаю на список своих друзей а не пользователя.
Вопрос такой: Как все выше перечисленное реализовать используя Profile 2 ? (Ясное дело это 7) Потому как мои познания закончились после создания собственного модуля (основы базы, файлов *.module и *.info) да я читал офф. мануал о создании первого модуля (от начала до конца, по практиковал)))
P.s
Буду весьма благодарен за отклик....
Здравствуйте уважаемые, сделал все по инструкции и в итоге у меня ничего не получилось(. В профиле пользователя выводит 2 ссылки: редактировать и загрузить фото и пустота...Сколько не пытался переделывать заново все тоже самое. Помогите пожалуйста, я сам новичок в друпале поэтому может быть что затупил на какой то мелочи, но вроде бы от инструкции не отступал. В чем может быть дело? модуль создал, код ввел, кэш чистил, update.php пробовал...вторые сутки вожусь никак не могу все до ума довести. Заранее благодарю за помощь
извиняюсь что не по теме но думаю многим тоже будет интересно узнать, а кто знает то пожалуйста подскажите как затемить комментарии чтобы выводилась аватарка допустим в блоге?
почему не работает темизация аватарок комментариев, аналогично как в profile для блога?
добавляю в mymodyle
function mymodule_preprocess_comment(&$vars) {
if (isset($vars['node'])) {
$vars['template_files'][] = 'comment-'. $vars['node']->type;
}
// подставляю blog на место profile
if ($vars['node']->type == 'blog') {
$comment = $vars['comment'];
$profile = content_profile_load('profile', $comment->uid);
// выводим фото пользователя
if ($profile->field_profile_photo[0]['fid']) {
$photo = theme('imagecache', 'photo-50x50', $profile->field_profile_photo[0]['filepath']);
}
else {
$photo = theme('imagecache', 'photo-50x50', 'sites/default/files/profile_photos/default.png');
}
// добавляем для неё переменную в шаблон comment-blog.tpl.php
$vars['author_picture'] = l($photo, 'user/'. $comment->uid, array('html' => TRUE));
}
}
Вывожу верстку в comment-blog.tpl.php
<div class="comment-left">
<div class="avatar"><?php print $author_picture ?></div>
</div>
<div class="comment-right">
<div class="user"><?php print $author ?></div>
<div class="content">
<?php print $content ?>
</div>
<div class="meta">
<div class="date"><?php print format_date($comment->timestamp, 'custom', 'j M Y в H:i') ?></div>
<?php if ($links): ?>
<div class="links"><?php print $links ?></div>
<?php endif; ?>
</div>
<div class="clear-block"></div>
</div>
</div>
Все выводится кроме аватарки подскажите как вывести аватарку. кеш чистил
Появилась проблема при создании вьюсов, перестали сохраняться выводит сообщения типа Display "По умолчанию" uses fields but there are none defined for it or all are excluded. как решить проблему?
Починил, сносом модуля и установкой его заново с обновлением базы поле сноса