Создание социальной сети на Drupal

Рассмотрим из каких модулей и с помощью каких приемов мы можем сделать социальную сеть на друпале. Некоторые вещи потребуют создания своего модуля, поэтому сразу скачайте заготовку mymodule.zip куда будете писать код.

Содержание статьи


Список используемых модулей


Профиль

Самый лучший модуль для профиля по моему мнению это - Content Profile.
Вместе с дополнительными модулями для CCK вы сможете создать профиль любого вида.


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
  • Местоположение
    1. Создайте новый словарь таксономии Местоположение
    2. Импортируйте базу городов в словарь как написано здесь или используйте модуль Taxonomy CSV import/export, файл для импорта, тип файла Hierarchical tree structure.
    3. Создайте 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).: поставить галочку
    4. Далее в настройках 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 мы скрываем и при сохранении будем менять значение на имя пользователя используя код в модуле:

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;
  }
}


Темизация профиля

Темизировать будем в 2 этапа:

  1. Перекрытие стандартного шаблона пользователя.
    В 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 функции влияют на работоспособность других модулей, если вы не уверены в их целесообразности можете их удалить.
  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. Желательно сделать поле Фамилия обязательным для заполнение, чтобы не было конфликтов.

Вывод профиля пользователя на главной странице, а для анонимного пользователя показ формы логина

  1. Добавте такой код в 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);
        }
      }
    }
  2. В настройках 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

  1. Создаем новое представление View name: friends, View type: User relationship.
  2. Добавляем отображение типа 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
    • Filters:
      • Добавляем фильтр User: Active и настраиваем его:
        • Relationship: requestee
        • Active: Yes
      • Добавляем фильтр User relationships: Relationship status и настраиваем его:
        • Status: Approved
      • Добавляем фильтр User relationships: Relationship type и настраиваем его:
        • Relationship types: Friend
    • 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: пустое поле
  3. Добавляем отображение типа page.
    • Basic settings:
      • Name: Друзья
    • Page settings:
      • Path: friends/list
      • Menu:
        • Type: Default menu tab
        • Title: Все друзья
        • Weight: 1
        • Parent menu item: Already exists
  4. Добавляем отображение типа block.
    • Basic settings:
      • Name: Друзья (блок)
      • 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
    • Fields:
      • Изменим поле Content: Фотография (field_profile_photo):
        Жмем кнопку Override,
        • Format: photo-50x50 image
    • Sort criteria:
      Жмем кнопку Override,
      • Добавляем сортировку Global: Random
  5. Добавляем отображение типа page.
    • 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
  6. Добавляем отображение типа block.
    • 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
    • Fields:
      • Изменим поле Content: Фотография (field_profile_photo):
        Жмем кнопку Override,
        • Format: photo-50x50 image
    • Sort criteria:
      Жмем кнопку Override,
      • Добавляем сортировку Global: Random
  7. Добавляем отображение типа page.
    • 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
    • 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
    • Filters:
      Жмем кнопку Override,
      • Изменяем фильтр User: Active:
        • Relationship: requester
      • Изменяем фильтр User relationships: Relationship status:
        • Status: Pending
    • Fields:
      Жмем кнопку Override,
      • Изменяем поле User: Name:
        • Relationship: requester


Темизация 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.

<div id="block-<?php print $block->module .'-'. $block->delta; ?>" class="clear-block block block-<?php print $block->module ?>">

<?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_1 h2.title,
#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.

  $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

Сначала удалим с помощью хука список участников беседы:

function mymodule_privatemsg_view_messages_alter(&$content) {
  unset($content['participants']);
}

В свою тему в template.php:
function ИМЯТЕМЫ_privatemsg_list_field__last_updated($thread) {
  $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:
function mymodule_preprocess_privatemsg_view(&$vars) {
  $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 в папку с темой.
<?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 в тему:
.privatemsg-view-pager {
    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 раздела описывать подробно описывать не буду, там всё достаточно понятно.

Рейтинги


Уведомления

Все вышеперечисленные модули так или иначе интегрированы с молулем Rules. С помощью него можно создавать реакции на события, такие как: создание определенного материала, предложение дружбы и тд. Но почти в каждом модуле есть и собственная система уведомлений, можно использовать и её.

Меню пользователя

В меню добавим ссылки:

  • Моя страница
  • Мои друзья
  • Мои сообщения
  • Настройки аккаунта

Нужно определить в модуле блок, копируем код:

function mymodule_block($op = 'list', $delta = 0, $edit = array()) {
  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 в тему:
a.user-edit-link {
  color:#777777;
  float:right;
}

Поместите блок в левый регион и в его настройках сделайте видимым только для зарегистрированных пользователей.

Стена

Стену сделаем из комментариев к ноде профиля пользователя. Для того чтобы добавить комментарии на страницу с профилем добавим в функцию mymodule_preprocess_user_profile код:

if (function_exists('comment_bonus_api_comment_render')) {
  $variables['wall'] = comment_bonus_api_comment_render($profile);
}
elseif (function_exists('comment_render')) {
  $variables['wall'] = comment_render($profile);
}

и в шаблоне user-profile.tpl.php выведем эту переменную:
<div class="wall"><h3>Стена</h3><?php print $wall; ?></div>


Настройка комментариев

В настройках типа 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 в папку с вашей темой и удалите строку:

<?php if ($node->type != 'forum'): ?>
  <h2 class="comments"><?php print t('Comments'); ?></h2>
<?php endif; ?>

Следующим шагом темизируем вывод комментариев, для этого в mymodule.module добавим:
function mymodule_preprocess_comment(&$vars) {
  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<?php print ($comment->new) ? ' comment-new' : ''; print ' '. $status; print ' '. $zebra; ?>">
  <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 в тему:
.wall h3 {
  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:
if ($form_id == 'comment_form') {
  $form['comment_filter']['comment']['#title'] = '';
  $form['comment_filter']['comment']['#rows'] = 3;
  unset($form['_author'], $form['preview']);
}

В следующей части рассмотрим контент в социальных сетях.

Комментарии

спасибо!

Статья супер, у меня сейчас задача вывести 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 вместо отправить комментарий вывести - написать на стену (например)?

в самом конце статьи код для изменения формы комментов, туда же внутрь в условия добавить:

if (arg(0) == 'user') {
  $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) выполнить запрос

UPDATE node SET comment = 2 WHERE type = "profile"

2) можно создать в профиле специальную вкладку для таках настроек. Туда добавлять поля типа int поля в виде чекбокса
потом в коде где задается переменная $wall добавить условие типа
if ($profile->field_profile_show_wall[0]['value']) {
//тут задается переменная
}

Вашу схему 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.. может кто подскажет куда это писать?

Неиспользуемое поле title мы скрываем и при сохранении будем менять значение на имя пользователя используя код в модуле:
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;
  }
}

function mymodule_privatemsg_view_messages_alter(&$content) {
  unset($content['participants']);
}

if (function_exists('comment_bonus_api_comment_render')) {
  $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.module или в user-profile.tpl.php чтобы изменить кодировку на UTF-8???

Всё, не надо... решилось в 1 нажатие кнопки:) Это называется залип на проблеме... Самый тупой вопрос...

У меня дак нету такого в mymodule

Удалим лишнее на форме. В mymodule_form_alter:
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

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

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

со стеной я вам подсказать не могу.

почти правильно, должно получиться так:

function mymodule_form_alter(&$form, $form_state, $form_id) {
  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']);
  }
}

спасибо! помогли)
у меня тока вопрос с переменной для коментариев остался
пробовал вывести как:

<?php if ($profile_comment): ?><td><div class="wall"><h3>Стена</h3><?php print $wall; ?></div></td><?php print $profile_comment; ?><?php endif; ?>

ничего неполучилось
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.

Ругается на

  function render($display_id = NULL) {
    $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 напрямую в базе, то он возвращает все данные из профиля (имя, фамилию, фото).
Проблема в длинных алиасах полей, вот запрос:

SELECT user_relationships.rid AS rid,
   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

вывести разные...

<div class="box">

<?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_phone'] = $profile->field_profile_phone[0]['safe'];
  $variables['profile_mymail'] = $profile->field_profile_mymail[0]['safe'];
  $variables['profile_skype'] = $profile->field_profile_skype[0]['safe'];

а в юзер темпл пхпп следующее:

<?php if ($profile_phone || $profile_mymail || $profile_skype): ?>
    <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_phone'] = $profile->field_profile_phone[0]['safe'];
  $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<?php print ($comment->new) ? ' comment-new' : ''; print ' '. $status; print ' '. $zebra; ?>">
  <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. как решить проблему?

Починил, сносом модуля и установкой его заново с обновлением базы поле сноса

для 7друпала планируется такая же статья?

Поясните пожалуйста в чем моя проблема, если я вкл. все модули, дополнил библиотеки jQuery. Стоит views 2.12 (предлагает 2.16 пока не ставлю). Все пункты четко по описанию, но уже на создании полей какая то проблема, вместо profile у меня profiles вроде одно и тоже, создаю список но 1) группы, правильно не создаются 2) фото, не работает (нет такой в списке возможных) 3) машинное имя предлагается вместо (field_profile_х), просто (profile_х) ну я по дописывал)) лучше не стало. Объясните что не так? Вот так получился список
Список вкл. модулей

Делаю на основе этой полезной статьи личный кабинет пользователя. Некоторое время не мог понять как выводить аватар из профиля в других нодах, вместо стандартного. Потом нашел. Ниже приведу PHP код как это сделать. Его нужно вставить в файл node.tpl.php в том месте где должен быть аватар.

<?php
$profile = content_profile_load('profile', $node->uid);
if ($profile->field_profile_photo[0]['fid']) {
print $photo = theme('imagecache', 'photo-50x50', $profile->field_profile_photo[0]['filepath']);
}
else {
print $photo = theme('imagecache', 'photo-50x50', 'sites/default/files/profile_photos/default.png');
}
?>

--разобрался--

Помогите пожалуйста когда включаю mymodule больше не заходит в модули и вылетает ошибка Fatal error: Maximum execution time of 30 seconds exceeded in Z:\home\gamesarea\www\includes\common.inc on line 578 что делать я уже и не знаю................

Можно было предположить что у тебя слабая система, превышается время выполнения 30сек, прекращается в целях безопасности. Но жалоба на common наводит на мысль что ты просто сделал ошибку. Попытайся просто потихоньку внимательно пойти с самого начала. Или дай контакт я тебе скину это сырье посмотришь где ошибки делаешь (Может найдешь мои)))))

Если можно вот на электронную почту скинуть - dantes21212121@gmail.com , буду очень благодарен.

Здравствуйте )

Спасибо за чудесную сатью в принципе все получается все работает... Но дошел до пункта "Вывод ссылки "Отправить сообщение" на странице пользователя" И решил сразу отчистить кеш и создать профиль. И посмотреть что хоть получается... В итоге См. Картинку! проблему с текстом устранить не сложно...
А вот редактирование не высветилось... Почему?

Проверьте кодировку в базе данных сайта либо в шаблонах должна быть UTF-8 обычно это из-за кодировки.

Я в курсе что все гениальное просто ) Но это баг от составляющих денвера он частер любит а я на ютф-8 В стандартной установке кажется файл my.ini ... Вопрос был не в этом. А в редактировании. Ссылок на редактирование нет...

Дабавил все модули а тип profile не появился. С чем это может быть связано?

Пожалуйста список вкл. модулей в студию... Или скриншот. И ДА profile - не равно CP. Я хотел бы услышать что нибудь про Content Profile . Понимаете?

Ну я в принципе понял)) 1 - Пожалуйста сверни хотя б скрины или убери их в ссылки. А то тут такое не любят))
2 - Пройди по такому пути http://название твоего сайта/admin/content/types есть ли там Profile - (A user profile built as content.)

Да, нашел! Спасибо! Извеняюсь за свою тупость)

Ты не 1-ый и не последний ) У меня тупость была выше (в коментах) вопросы были, похлеще твоего ))))

Есть две важные проблемы:

1) Как создать группы или страницы как фейсбуке? Без них никак ни контент выложить, к себе нечего в профиль добавить...

2) bueditor не работает на стене... Ну или просто подскажите как правильно называется тип который используется на стене (как он правильно пишется?)
Прям как здесь на http://druit.ru !

+ Поиск с картинками пытался сделать так... Скопировал файл search-result.tpl в тему. В template.php добавил

f<?phpfunction garland_preprocess_search_result(&$vars, $hook) {
  $n = content_profile_load($vars['result']['profile']->uid);
  $n && ($vars['profile'] = $n);
}?>

в search-result.tpl дописал:

<dt class="title">
  <a href="<?php print $url; ?>"><?php print $title; ?></a>
</dt>
<dd>
  <?php if ($snippet) : ?>
    <p class="search-snippet">
       
        <? if (isset($profile->field_profile_photo[0]['filepath'])) { ?>
        <a href="<?php print $url; ?>" class="imagecache">
        <?php print $photo = theme('imagecache', 'photo-100x100', $profile->field_profile_photo[0]['filepath']); ?>
        </a>
        <?php } ?>
        <?php print $snippet; ?>
        </p>
  <?php endif; ?>
  <?php if ($info) : ?>
  <p class="search-info"><?php print $info; ?></p>
  <?php endif; ?>
</dd>

Но не выходит где я туплю?

P.S
Недавно пробовал на Views 6.x-2.16 тоже работает...

Не получается поставить переменную на "Настройки аккаунта". Вообще, какая переменная?

Меню пользователя
В меню добавим ссылки:

Моя страница
Мои друзья
Мои сообщения
Настройки аккаунта

Да здесь многое не досказано и все решалось путем проб и ошибок))). Секрет лишь в том что в вод переменных (мне кажется она есть в листинге)) делается в определенной последовательности. Если переставить код как написано сразу после $user_actions = array();. + то что было до этого то ничего не выйдет... Т.к вставить нужно после листинга №6 . А если еще и задействовать блок то может вылетать и будет ошибка...

Почему могут не отображаться фотки в сообщениях? все остальное по описанию работает...

и еще может кто поможет, как прописать в mymodules код для fivestar, точнее что именно необходимо прописывать? пока не получается у меня((

Там просто можно блок указать в тпл файле от профиля (который создавали) и он сам станет туда, его можно будет даже подкрепить к конкретному виду контента. Меня больше интересует как у вас друзья (сам блок заработал? Отображается?) Фото в сообщения самое простое! Внимательно поэтапно проверьте все ли выполнено Сообщения ) А вот с друзьями вы меня заинтриговали (На денве все работает но как только я выхожу на хост... Куча проклятий )))

P.S
Есть предложение биться вместе об лед)) Все таки легче, спишемся(Контакты в Л.С)? Обмен листингами и.т.д

для 7ки аналог кто нибудь собрал? а то уже 8 ка на носууу

Ех, не хочу быть скептиком но раскрою секрет... При умеренной посещаемости 20 - 40К в день (что не так много для хорошего соц проекта...) наша CMS начнет виснуть (Кол-во лишних запросов будет зашкаливать)) в итоге никак не обойтись без Yii, те кто реально наметились на удачный соц проект сразу с этого и начнут. А так пока это игрушка)

Драсте скиньте плизз готовое решение а то я делаю все как надо и модуль создал и во views все так как написанно сделал только появилась надпись My relatationship и вс е а там пусто скиньте плиз дамп чистой базы пожалуйста и модули какие нада я буду очень благодарен!

Огромное спасибо за статью.....за неделю сделал всё! Вот только не работают ссылки в "дружеском" меню....удалить из друзей....в заявках добавить или отклонить тоже не работают. Если кто знает подскажите в чем может быть причина. код ошибки: warning: Invalid argument supplied for foreach() in sites/all/modules/user_relationships/user_relationships_api/user_relationships_api.module on line 58.

доброго времени суток. Не знаю что делать. Вместо слов выходят символы ���������� ������. И не отображается Редактировать. Я новичок, подскажите, пожалуйста, как можно это исправить.

разобралась, изменила кодировку.

Добрый день. Ввиду острой необходимости использую views 3.x

При создании SQL запроса вашим видом получаю следующее

SELECT
node_users_user_relationships_node_data_field_avatar.field_avatar_fid AS node_users_user_relationships_node_data_field_avatar_field_a,
node_users_user_relationships_node_data_field_avatar.field_avatar_list AS node_users_user_relationships_node_data_field_avatar_field_a_1,
node_users_user_relationships_node_data_field_avatar.field_avatar_data AS node_users_user_relationships_node_data_field_avatar_field_a_2,
node_users_user_relationships.type AS node_users_user_relationships_type,
node_users_user_relationships.nid AS node_users_user_relationships_nid,
node_users_user_relationships.vid AS node_users_user_relationships_vid,
node_users_user_relationships_node_data_field_avatar.field_trener_name_value AS node_users_user_relationships_node_data_field_avatar_field_t

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 = 'training'

LEFT JOIN content_type_training node_users_user_relationships_node_data_field_avatar ON node_users_user_relationships.vid = node_users_user_relationships_node_data_field_avatar.vid
WHERE (.status <> 0) AND (user_relationships.approved = '1') AND (user_relationships.rtid in ('1')) AND (user_relationships.requester_id = 1 )

Ошибка находится в строчке:

WHERE (.status <> 0) AND (user_relationships.approved = '1') AND (user_relationships.rtid in ('1')) AND (user_relationships.requester_id = 1 )

Как вы видите перед полем .status не прописывается таблица node_users_user_relationships.

если данный запрос оформить по живому скулю без ошибки, то все выдается верно

Вопрос: где и что надо поправить, что бы данная таблица в запросе конектилась верно??

как решить проблему с друзьями.
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, 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 = 1 ) ) count_alias in /home/u184330023/public_html/sites/all/modules/views/plugins/views_plugin_pager.inc on line 141.
user warning: Unknown column 'field_profile_photo_fid' in 'field list' query: 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, 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 = 1 ) ORDER BY _random ASC LIMIT 0, 10 in /home/u184330023/public_html/sites/all/modules/views/plugins/views_plugin_query_default.inc on line 1150.

Замена views не помогла

Отличный пост. спасибо.
в продолжение есть такой вопрос, необходимо чтобы пользователь мог создавать у себя набор объектов с простыми характеристиками, название, картинка, описание, типизация. ну и соответственно необходимо как-то их показывать на странице пользователя и индивидуально, так же по ним должен работать поиск. как такое можно организовать ?

Когда ничего о себе не написано, линия продолжается наполовину фотки... и я пока дефаултную фотку не загрузил...
а так же стенка соединяется с фоткой.

и ещё одно

Woman all over the world prefer to carry bags over their shoulder. Bags New Women's Bags are not just a fashion statement but an immensely useful accessory. One can never leave home without basic things like keys, mobile phone, cash, and credit card. Also, for most woman lip balm, gloss, perfume, kohl etc may also be essential. Thus it becomes inevitable to carry a bag that is smart, trendy and useful.

And this clear plastic handbag the Tattoo Tote from Coach which is the one I like it most. Shaped in a transparent PVC tote bag, it measures larger overall, with the size of 24 inches in length, 12-1/2 inches height and 6-1/2 width. It has a detachable small leather pouch attached with a gold chain, as well Fashion Hats (http://www.imalls.me/item/Caps-Hats-7.html) as a ring inside to hold your small essentials such as keys, etc. The trim is made of leather and the strap is chain link threaded with leather. It looks elegant from a distance. And after closer look, its nice craftsmanship pleases me so much.