Пишем модуль под Drupal. Часть 9. Выводим трэкер в профиле пользователя

ср, 21.04.2010 10:47 :: olk

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

В файле cctracker.module изменим наш хук menu и добавим вспомогательную функцию _cctracker_user_access, отвечающую за доступ к трэкеру профиля пользователя.

Шаг номер 20:
Меняем функция cctracker_menu.

function cctracker_menu() {
// Здесь мы проверяем установлен ли модуль трэкер, и если нет
// то в качестве базовых путей подставляем стандартные пути трэкера
  if (module_exists('tracker')) {
    $base_page = 'cctracker';
    $base_track = 'cctrack';
  }
  else {
    $base_page = 'tracker';
    $base_track = 'track';
  }
  $items['admin/settings/cctracker'] = array(
    'title' => 'Cctracker',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('cctracker_settings'),
    'access arguments' => array('administer site configuration'),
    'type' => MENU_NORMAL_ITEM,
    'file' => 'cctracker.admin.inc',
  );
// Вместо функции cctracker_page в качестве коллбэка
// используем функцию врапер cctracker_track.
// отвечает за вывод на странице трэкера
   $items[$base_page] = array(
    'title' => 'Recent posts',
    'page callback' => 'cctracker_track',
    'page arguments' => array(NULL, 'all'),
    'access arguments' => array('access content'),
    'file' => 'cctracker.page.inc',
  );

  $items[$base_page . '/all'] = array(
    'title' => 'All recent posts',
    'type' => MENU_DEFAULT_LOCAL_TASK,
  );
  $items[$base_page . '/my-recent-posts/%user_uid_optional'] = array(
    'title' => 'My recent posts',
    'page arguments' => array(2, 'my-recent-posts'),
    'access callback' => '_cctracker_myrecent_access',
    'access arguments' => array(2),
    'type' => MENU_LOCAL_TASK,
  );
  $items[$base_page . '/my-posts/%user_uid_optional'] = array(
    'title' => 'My posts',
    'page arguments' => array(2, 'my-posts'),
    'access callback' => '_cctracker_myrecent_access',
    'access arguments' => array(2),
    'type' => MENU_LOCAL_TASK,
  );
  $tab_types = variable_get('cctracker_tab_types', array());
  foreach ($tab_types as $key => $value) {
  if ($value) {
    $items[$base_page . '/' . $key] = array(
      'title' => check_plain(node_get_types('name', $value)),
      'page arguments' => array(1, 'tab-types'),
      'access arguments' => array('access content'),
      'type' => MENU_LOCAL_TASK,
     );
   }
  }
   $items['user/%user/' . $base_track . '/posts'] = array(
    'title' => 'Posts of current user',
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => -1,
  );
// В качестве коллбэка используем функцию врапер cctracker_track_user
// Отвечает за вывод трэкера на странице профиля пользователя
  $items['user/%user/' . $base_track ] = array(
    'title' => 'Track posts',
    'page callback' => 'cctracker_track_user',
    'page arguments' => array(1, 'my-posts'),
    'access callback' => '_cctracker_user_access',
    'access arguments' => array(1),
    'type' => MENU_LOCAL_TASK,
    'file' => 'cctracker.page.inc',
    'weight' => 10,
  );
  $items['user/%user/' . $base_track . '/my-recent-posts'] = array(
    'title' => 'Recent posts of current user',
    'page callback' => 'cctracker_track_user',
    'page arguments' => array(1, 'my-recent-posts'),
    'access callback' => '_cctracker_user_access',
    'access arguments' => array(1),
    'type' => MENU_LOCAL_TASK,
    'file' => 'cctracker.page.inc',
    'weight' => -1,
  );
  return $items;
}

function _cctracker_user_access($account) {
  return user_view_access($account) && user_access('access content');
}

Добавим в файл cctracker.page.inc две функции: первая будет отвечать за вывод непосредственно на странице трэкера, вторая за его вывод в профиле пользователя.
При этом обе функции вызывают нашу старую функцию cctracker_page перед этим установив правильный заголовок страницы. Сами же эти функции вызываются через хук menu в качестве коллбэков элементов меню.

Шаг номер 21:

function cctracker_track($account, $tp) {
  switch ($tp) {
    case 'my-posts':
    drupal_set_title(t('My posts'));
    break;
    case 'my-recent-posts':
    drupal_set_title(t('My recent posts'));
    break;
    case 'tab-types':
    drupal_set_title(check_plain(node_get_types('name', $account)));
    break;
  }
 return  cctracker_page($account, $tp);
}

function cctracker_track_user($account, $tp) {
  if (is_object($account)) {
    drupal_set_title($account->name);
    return cctracker_page($account, $tp);
  }
  else {
    drupal_set_message(t('user not found'));
    print theme('page', ' ');
  }
}

Теперь мы можем отключить на странице настройки модулей стандартный модуль tracker.

На этом можно было-бы и закончить, но каждый уважающий себя программист, должен доводить дело до конца. Поэтому в следующей части мы займемся приведением нашего кода в соответствие со стандартами программирования под Друпал, и дополним его описанием в формате понятном Доксигену (Doxygen formatting conventions) и добавим несколько не обязательных, но желательных хуков.

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