Здравствуйте!
История моя получится немножко длинной и запутанной. В общем пытаюсь разобраться как в друпле работать с меню "программным" способом и вообще рассчитываю пользоваться друплом (или друпалом наверное правельней сказать) как cmf, создавая свои системы управления под конкретные нужды, реализуя все в модулях.
Итак вот код в модуле mialpet_test:
<?php
/**
* Implements hook_menu().
*/
function mialpet_test_menu()
{
$items = array();
$items['front'] = array
(
'access callback' => TRUE,
'description' => t('Главная страница'),
'title' => FALSE,
'title callback' => FALSE,
'title arguments' => FALSE,
'page callback' => 'mialpet_test_front_page_callback',
'page arguments' => FALSE,
'type' => MENU_CALLBACK,
'menu_name' => FALSE,
'weight' => FALSE,
);
$items['about'] = array
(
'access callback' => TRUE,
'description' => t('Личная информация обо мне'),
'title' => t('Обо мне'),
'title callback' => FALSE,
'title arguments' => FALSE,
'page callback' => 'mialpet_test_about_page_callback',
'page arguments' => FALSE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'page_menu',
'weight' => 1,
);
$items['skills'] = array
(
'access callback' => TRUE,
'description' => t('Технологии которыми я владею'),
'title' => t('Навыки'),
'title callback' => FALSE,
'title arguments' => FALSE,
'page callback' => 'mialpet_test_skills_page_callback',
'page arguments' => FALSE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'page_menu',
'weight' => 2,
);
$items['portfolio'] = array
(
'access callback' => TRUE,
'description' => t('Разработанные веб-ресурсы'),
'title' => t('Портфолио'),
'title callback' => FALSE,
'title arguments' => FALSE,
'page callback' => 'mialpet_test_portfolio_page_callback',
'page arguments' => FALSE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'page_menu',
'weight' => 3,
);
$items['projects'] = array
(
'access callback' => TRUE,
'description' => t('Различные веб-проекты'),
'title' => t('Проекты'),
'title callback' => FALSE,
'title arguments' => FALSE,
'page callback' => 'mialpet_test_projects_page_callback',
'page arguments' => FALSE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'page_menu',
'weight' => 4,
);
$items['feedback'] = array
(
'access callback' => TRUE,
'description' => t('Пишите мне'),
'title' => t('Обратная связь'),
'title callback' => FALSE,
'title arguments' => FALSE,
'page callback' => 'mialpet_test_feedback_page_callback',
'page arguments' => FALSE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'page_menu',
'weight' => 5,
);
return $items;
}
function mialpet_test_front_page_callback()
{
$page_menu = '*Здесь должно быть меню на основные страницы сайта*';
/*
menu_rebuild();
menu_build_tree('page_menu');
menu_tree('page_menu');
menu_tree_page_data('page_menu');
menu_cache_clear('page_menu');
menu_reset_static_cache();
menu_router_build();
*/
$page_menu = menu_tree('page_menu');
return $page_menu; //'<pre>' . print_r($page_menu, 1) . '</pre>';
}
function mialpet_test_page_callback($page_name)
{
return 'This is ' . $page_name . ' page!';
}
function mialpet_test_about_page_callback()
{
return 'Должно быть не это!';
}
function mialpet_test_skills_page_callback()
{
return drupal_get_title();
}
function mialpet_test_portfolio_page_callback()
{
return drupal_get_title();
}
function mialpet_test_projects_page_callback()
{
return drupal_get_title();
}
function mialpet_test_feedback_page_callback()
{
return drupal_get_title();
}?>
История такая - есть главная страница и еще 5 страниц, на главной странице должно быть меню с ссылками на остальные страницы. Сначала меню называлось page-menu (не page_menu), даже не знаю каким чудом, но после перебора различных функций у меня все-таки получилось занести информацию в бд и увидеть свое меню на сайте. Но потом я решил изменить page callback в $items['about'] с 'mialpet_test_about_page_callback' на 'mialpet_test_page_callback' и ей добавил аргумент 'page arguments' => array(0). Что я только не писал и сколько раз не збрасывал кэш, все было бесполезно, коллбек не менялся! Потом и вовсе решил изменить название меню и теперь уже даже не получается занести информацию в бд, ведь у меня теперь новое меню, и все что я получаю на странице это пустой массив.
Подскажите пожалуйста:
- как занести информацию о новом меню?
- правильно-ли я понимаю что при создании нового меню drupal пробегает по всем массивам от hook_menu от всех модулей и ищет страницы с одинаковыми названиями меню?
- код чтобы друпал проверял (обновлял) информацию о менюшке (на случай если она измениться в исходнике), когда открывается страница с этим меню;
- в каких случаях надо использовать функции закоментированные в mialpet_test_front_page_callback()?
Вот нынешний код (изменился только массив в $items['about']):
<?php
/**
* Implements hook_menu().
*/
function mialpet_test_menu()
{
$items = array();
$items['front'] = array
(
'access callback' => TRUE,
'description' => t('Главная страница'),
'title' => FALSE,
'title callback' => FALSE,
'title arguments' => FALSE,
'page callback' => 'mialpet_test_front_page_callback',
'page arguments' => FALSE,
'type' => MENU_CALLBACK,
'menu_name' => FALSE,
'weight' => FALSE,
);
$items['about'] = array
(
'access callback' => TRUE,
'description' => t('Личная информация обо мне'),
'title' => t('Обо мне'),
'title callback' => FALSE,
'title arguments' => FALSE,
'page callback' => 'mialpet_test_page_callback',
'page arguments' => array(0),
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'page_menu',
'weight' => 1,
);
$items['skills'] = array
(
'access callback' => TRUE,
'description' => t('Технологии которыми я владею'),
'title' => t('Навыки'),
'title callback' => FALSE,
'title arguments' => FALSE,
'page callback' => 'mialpet_test_skills_page_callback',
'page arguments' => FALSE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'page_menu',
'weight' => 2,
);
$items['portfolio'] = array
(
'access callback' => TRUE,
'description' => t('Разработанные веб-ресурсы'),
'title' => t('Портфолио'),
'title callback' => FALSE,
'title arguments' => FALSE,
'page callback' => 'mialpet_test_portfolio_page_callback',
'page arguments' => FALSE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'page_menu',
'weight' => 3,
);
$items['projects'] = array
(
'access callback' => TRUE,
'description' => t('Различные веб-проекты'),
'title' => t('Проекты'),
'title callback' => FALSE,
'title arguments' => FALSE,
'page callback' => 'mialpet_test_projects_page_callback',
'page arguments' => FALSE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'page_menu',
'weight' => 4,
);
$items['feedback'] = array
(
'access callback' => TRUE,
'description' => t('Пишите мне'),
'title' => t('Обратная связь'),
'title callback' => FALSE,
'title arguments' => FALSE,
'page callback' => 'mialpet_test_feedback_page_callback',
'page arguments' => FALSE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'page_menu',
'weight' => 5,
);
return $items;
}
function mialpet_test_front_page_callback()
{
$page_menu = '*Здесь должно быть меню на основные страницы сайта*';
/*
menu_rebuild();
menu_build_tree('page_menu');
menu_tree('page_menu');
menu_tree_page_data('page_menu');
menu_cache_clear('page_menu');
menu_reset_static_cache();
menu_router_build();
*/
$page_menu = menu_tree('page_menu');
return $page_menu; //'<pre>' . print_r($page_menu, 1) . '</pre>';
}
function mialpet_test_page_callback($page_name)
{
return 'This is ' . $page_name . ' page!';
}
function mialpet_test_about_page_callback()
{
return 'Должно быть не это!';
}
function mialpet_test_skills_page_callback()
{
return drupal_get_title();
}
function mialpet_test_portfolio_page_callback()
{
return drupal_get_title();
}
function mialpet_test_projects_page_callback()
{
return drupal_get_title();
}
function mialpet_test_feedback_page_callback()
{
return drupal_get_title();
}?>
Комментарии
Сбросить кэш и друпал сам перестроит меню. И изменит его структуру, если вы что-то поменяли.
Сбросить кэш и друпал сам перестроит меню. И изменит его структуру, если вы что-то поменяли.
Я уже с закрытыми глазами кэш сбросить могу, рука на автомате все движения делает, другими словами не помогает это.
Косяк подкрался незаметно, в общем не надо писать такое
даже если
и друпал действительно будет как угодно переписывать базу и заново строить меню при сбросе кэша.
А функции закоментированные видимо нужны если строить какое-то невообразимо динамическое меню или при установке модуля может, фиг с ними в общем.