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

ср, 21.04.2010 10:47 :: olk

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

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

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

  1. function cctracker_menu() {
  2. // Здесь мы проверяем установлен ли модуль трэкер, и если нет
  3. // то в качестве базовых путей подставляем стандартные пути трэкера
  4.   if (module_exists('tracker')) {
  5.     $base_page = 'cctracker';
  6.     $base_track = 'cctrack';
  7.   }
  8.   else {
  9.     $base_page = 'tracker';
  10.     $base_track = 'track';
  11.   }
  12.   $items['admin/settings/cctracker'] = array(
  13.     'title' => 'Cctracker',
  14.     'page callback' => 'drupal_get_form',
  15.     'page arguments' => array('cctracker_settings'),
  16.     'access arguments' => array('administer site configuration'),
  17.     'type' => MENU_NORMAL_ITEM,
  18.     'file' => 'cctracker.admin.inc',
  19.   );
  20. // Вместо функции cctracker_page в качестве коллбэка
  21. // используем функцию врапер cctracker_track.
  22. // отвечает за вывод на странице трэкера
  23.    $items[$base_page] = array(
  24.     'title' => 'Recent posts',
  25.     'page callback' => 'cctracker_track',
  26.     'page arguments' => array(NULL, 'all'),
  27.     'access arguments' => array('access content'),
  28.     'file' => 'cctracker.page.inc',
  29.   );
  30.  
  31.   $items[$base_page . '/all'] = array(
  32.     'title' => 'All recent posts',
  33.     'type' => MENU_DEFAULT_LOCAL_TASK,
  34.   );
  35.   $items[$base_page . '/my-recent-posts/%user_uid_optional'] = array(
  36.     'title' => 'My recent posts',
  37.     'page arguments' => array(2, 'my-recent-posts'),
  38.     'access callback' => '_cctracker_myrecent_access',
  39.     'access arguments' => array(2),
  40.     'type' => MENU_LOCAL_TASK,
  41.   );
  42.   $items[$base_page . '/my-posts/%user_uid_optional'] = array(
  43.     'title' => 'My posts',
  44.     'page arguments' => array(2, 'my-posts'),
  45.     'access callback' => '_cctracker_myrecent_access',
  46.     'access arguments' => array(2),
  47.     'type' => MENU_LOCAL_TASK,
  48.   );
  49.   $tab_types = variable_get('cctracker_tab_types', array());
  50.   foreach ($tab_types as $key => $value) {
  51.   if ($value) {
  52.     $items[$base_page . '/' . $key] = array(
  53.       'title' => check_plain(node_get_types('name', $value)),
  54.       'page arguments' => array(1, 'tab-types'),
  55.       'access arguments' => array('access content'),
  56.       'type' => MENU_LOCAL_TASK,
  57.      );
  58.    }
  59.   }
  60.    $items['user/%user/' . $base_track . '/posts'] = array(
  61.     'title' => 'Posts of current user',
  62.     'type' => MENU_DEFAULT_LOCAL_TASK,
  63.     'weight' => -1,
  64.   );
  65. // В качестве коллбэка используем функцию врапер cctracker_track_user
  66. // Отвечает за вывод трэкера на странице профиля пользователя
  67.   $items['user/%user/' . $base_track ] = array(
  68.     'title' => 'Track posts',
  69.     'page callback' => 'cctracker_track_user',
  70.     'page arguments' => array(1, 'my-posts'),
  71.     'access callback' => '_cctracker_user_access',
  72.     'access arguments' => array(1),
  73.     'type' => MENU_LOCAL_TASK,
  74.     'file' => 'cctracker.page.inc',
  75.     'weight' => 10,
  76.   );
  77.   $items['user/%user/' . $base_track . '/my-recent-posts'] = array(
  78.     'title' => 'Recent posts of current user',
  79.     'page callback' => 'cctracker_track_user',
  80.     'page arguments' => array(1, 'my-recent-posts'),
  81.     'access callback' => '_cctracker_user_access',
  82.     'access arguments' => array(1),
  83.     'type' => MENU_LOCAL_TASK,
  84.     'file' => 'cctracker.page.inc',
  85.     'weight' => -1,
  86.   );
  87.   return $items;
  88. }
  89.  
  90. function _cctracker_user_access($account) {
  91.   return user_view_access($account) && user_access('access content');
  92. }
Добавим в файл cctracker.page.inc две функции: первая будет отвечать за вывод непосредственно на странице трэкера, вторая за его вывод в профиле пользователя. При этом обе функции вызывают нашу старую функцию cctracker_page перед этим установив правильный заголовок страницы. Сами же эти функции вызываются через хук menu в качестве коллбэков элементов меню.

Шаг номер 21:

  1. function cctracker_track($account, $tp) {
  2.   switch ($tp) {
  3.     case 'my-posts':
  4.     drupal_set_title(t('My posts'));
  5.     break;
  6.     case 'my-recent-posts':
  7.     drupal_set_title(t('My recent posts'));
  8.     break;
  9.     case 'tab-types':
  10.     drupal_set_title(check_plain(node_get_types('name', $account)));
  11.     break;
  12.   }
  13.  return  cctracker_page($account, $tp);
  14. }
  15.  
  16. function cctracker_track_user($account, $tp) {
  17.   if (is_object($account)) {
  18.     drupal_set_title($account->name);
  19.     return cctracker_page($account, $tp);
  20.   }
  21.   else {
  22.     drupal_set_message(t('user not found'));
  23.     print theme('page', ' ');
  24.   }
  25. }

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

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

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