API menu system D7

Главные вкладки

Аватар пользователя mialpet mialpet 11 марта 2013 в 2:26

Здравствуйте!
История моя получится немножко длинной и запутанной. В общем пытаюсь разобраться как в друпле работать с меню "программным" способом и вообще рассчитываю пользоваться друплом (или друпалом наверное правельней сказать) как 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();
    }
?>

Комментарии

Аватар пользователя mialpet mialpet 11 марта 2013 в 12:12

Я уже с закрытыми глазами кэш сбросить могу, рука на автомате все движения делает, другими словами не помогает это.

Аватар пользователя mialpet mialpet 13 марта 2013 в 19:05

Косяк подкрался незаметно, в общем не надо писать такое

"mialpet" wrote:
'menu_name' => FALSE,        'weight' => FALSE,

даже если
"mialpet" wrote:
'type' => MENU_CALLBACK,

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