В этой части мы избавимся от стандартного модуля tracker и организуем вывод трэкера с сообщениями пользователя в его профиль. А заодно проделаем не большой трюк, чтобы не потерять ссылки на поисковиках относящиеся стандартному трэкеру. Также мы поправим вывод заголовков.
В файле cctracker.module изменим наш хук menu и добавим вспомогательную функцию _cctracker_user_access, отвечающую за доступ к трэкеру профиля пользователя.
Шаг номер 20:
Меняем функция 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 перед этим установив правильный заголовок страницы. Сами же эти функции вызываются через хук menu в качестве коллбэков элементов меню.
Шаг номер 21:
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) и добавим несколько не обязательных, но желательных хуков.
