Поддержка типов Profile2 в panels

Недавно познакомился с модулем panels и ctools. Оба модули круты, хоть немного и не доведены до кондиции, но возможностей добавляют массу.

Так вот пытаясь вывести несколько полей пользователя из профиля созданного через profile2 столкнулся с тем, что page manager из набора ctools умеет работать с разными сущностями, но без поддержки типов. С мыслью «яжпрограммист» решил это исправить.

Первым делом пишем модуль! Назвал profile2_types_panels. Вообще с названием модулей проблем не возникает, в отличии от css-классов например. Info файл:

name = Profile2 types panels support
description = Provide ctools relation with support of profile2 types in panel pages.
core = 7.x

dependencies[] = ctools

И сразу же первый и единственный хук — hook_ctools_plugin_directory():

/**
 * Implements hook_ctools_plugin_directory().
 */
function profile2_types_panels_ctools_plugin_directory($owner, $plugin_type) {
  if ($owner == 'ctools' && !empty($plugin_type)) {
    return "plugins/$plugin_type";
  }
}

Тут говорим где ctools должен искать плагин, все по документации.
А дальше добавляем пару плагинов…

Первый — plugins/contexts/profile2.inc

 t('Profile2'),
  'description' => t('A profile2 entity.'),
  'context' => 'custom_user_management_context_create_profile2',
  'keyword' => 'profile2',
  'context name' => 'profile2',
);

/**
 * [email protected]}
 */
function custom_user_management_context_create_profile2($empty, $profile2 = NULL) {
  $context = new ctools_context(array(
    'user',
    'entity:user',
    'profile2',
    'entity:profile2',
  ));
  $context->plugin = 'profile2';

  if (!empty($profile2)) {
    $context->data = $profile2;
  }
  return $context;
}

Подтягивает правильный контекст когда нужно.
И второй плагин — plugins/relationships/profile2_from_user.inc

 t('Profile2 from user'),
  'keyword' => 'profile2',
  'description' => t('Adds a profile2 type from a user context.'),
  'required context' => new ctools_context_required(t('User'), 'user'),
  'context' => 'profile2_types_panels_profile2_from_user_context',
  'edit form' => 'profile2_types_panels_profile2_from_user_settings_form',
  'defaults' => array('type' => 'main'),
);

/**
 * Return a new context based on an existing context.
 */
function profile2_types_panels_profile2_from_user_context($context, $conf) {
  // If unset it wants a generic, unfilled context, which is just NULL.
  if (empty($context->data) || !isset($context->data->uid)) {
    return ctools_context_create_empty('profile2');
  }

  $profile = profile2_load_by_user($context->data, $conf['type']);
  return ctools_context_create('profile2', $profile);
}

/**
 * Settings form for the relationship.
 */
function profile2_types_panels_profile2_from_user_settings_form($form, &$form_state) {
  $conf = $form_state['conf'];

  $options = array();
  foreach (profile2_get_types() as $type => $info) {
    $options[$type] = $info->label;
  }

  $form['type'] = array(
    '#type' => 'select',
    '#title' => t('Select Profile2 Type'),
    '#options' => $options,
    '#default_value' => $conf['type'],
  );

  return $form;
}

А тут добавляем связь с профилем с выбором типа.
А теперь самое интересное, делаем пейджу контекстом пользователя, ну или используем стандартную user_view и добавляем связь.
profile2 ctools relationship example
И теперь можно добавлять поле с выбранной связью.
profile2 ctools panels field with relations example

Поддержка типов Profile2 в panels: 5 комментариев

  1. animous

    Ошибка при создании мини-панели
    Fatal error: Cannot redeclare profile2_from_user_context() (previously declared in \sites\all\modules\profile2\plugins\relationships\profile2.inc:25) in \sites\all\modules\profile2_types_panels\plugins\relationships\profile2_from_user.inc on line 33

    1. zviryatko Автор записи

      Поправил код, нужно просто к функции profile2_from_user_context добавить префикс, например название модуля.

    2. zviryatko Автор записи

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

    1. zviryatko Автор записи

      Все еще в черновике, никак не могу дописать, что именно тебя интересует?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *