не добавляются пункты меню

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

Аватар пользователя KenSv KenSv 29 апреля 2009 в 17:14

Прошу не пинать ногами, drupal только начал осваивать Smile
Решил взяться сразу за написание модуля, т.к. был нужен готовый каркас интранет-сайта для работы с базой данных.
Первая же проблема, с которой столкнулся - не появляются в основном меню пункты, добавленные мною в hook_menu.
Модуль включен, играл с весом...результат плачевный. Начал возиться с меню потому, что есть мною написанное приложение
на Delphi, которое хотел бы переложить на web-технологию. Опыт работы с базой данных/php/html есть, поэтому решил
разобраться со спецификой drupal-а...

/**
* Display menu for module magmain
*
*/

function magmain_menu(){
        $items = array();
       
        $items['magmain'] = array(
                'title' => 'Shops',
                'description' => 'Магазины Magmain',
                'page_callback' => 'magmain',
                'access arguments' => array('access content'),
                'type' => MENU_NORMAL_ITEM,
        );
        $items['magmain/zayav'] = array(
                'title' => 'Zayavka',
                'description' => 'Заявки Magmain',
                'page_callback' => 'zayav',
                'access arguments' => array('access content'),
                'type' => MENU_NORMAL_ITEM,
        );

        return $items;
} // function magmain_menu

Понимаю, что где-то ошибка, но не знаю, как посмотреть отладочную информацию.
Drupal брал в архиве с этого сайта. ОС Debian lenny.
Возможно что-то наплужил с правами, хотя установка прошла без проблем.
В таблице MySQL пункты меню есть, но почему-то были с атрибутом hide=-1
Может кто направит на путь истинный? Smile

Комментарии

Аватар пользователя glu2006 glu2006 29 апреля 2009 в 17:45

1-e http://drupal.org/project/devel - для дебага
2-е кирилица в коде - зло (это мое мнение).
3-е 'page_callback' => 'magmain' есть в модуле функция с именем magmain ? которая пусть даже и не делает ничего?
4-е меню кешируется поэтому чистить кеш обязательно после каждого изменения в пунктах меню.

Аватар пользователя KenSv KenSv 30 апреля 2009 в 9:41

"glu2006" wrote:
1-e http://drupal.org/project/devel - для дебага

Спасибо, попробую
"glu2006" wrote:
2-е кирилица в коде - зло (это мое мнение).

Согласен, я начинал без нее до того, как запостить сообщение.
"glu2006" wrote:
3-е 'page_callback' => 'magmain' есть в модуле функция с именем magmain ?

был вот такой вариант:

function magmain_hello() {
    return t('Hello!');
}

function magmain_menu() {
    $items['magmain']=array(
        'page callback' => 'magmain_hello',
        'type' => MENU_NORMAL_ITEM,
        'title' => 'MagMain',
        'weight' => 10,
    );

    return $items;
} //  magmain_menu()

"glu2006" wrote:
4-е меню кешируется поэтому чистить кеш обязательно после каждого изменения в пунктах меню.

Кэш браузера? А как-нибудь очистить, не затрагивая весь кэш...только связанное с друпалом...возможно?
А как это пользователям объяснять, если вносить изменения в структуру время от времени? Я их одним словом кэш убью Smile
Неужели это необходимое условие при каждом изменении в модуле? Зависит ли это от типа браузера?
Я пробовал отключение/установку модуля, полагая, что при этом должны выполняться все необходимые операции.

Посмотрел API...
«Versions
4.6 – 5
hook_menu($may_cache)
6 – 7
hook_menu()
»
У меня друпал 6.06. В предыдущих версиях можно было указать, кэшировать меню или нет...если я правильно понял?

Аватар пользователя glu2006 glu2006 30 апреля 2009 в 10:06

По умолчанию меню в друпале как и вьюсы кешируются всегда не зависимо от того хотите вы этого или нет.

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

Аватар пользователя KenSv KenSv 30 апреля 2009 в 10:49

Понял, спасибо. Таблицу в базе очистил (мне такой способ ближе Smile )Результата пока нет...
Модуль devel сейчас ставлю и буду разбираться
Залез в Производительность...Режим кэширования: Отключено

Аватар пользователя glu2006 glu2006 30 апреля 2009 в 12:04

А так?

<?php
function magmain_menu(){
    
$items = array();
 
    
$items['magmain'] = array(
        
'title'    => 'Shops',
        
'description' => 'Магазины Magmain',
        
'page callback' => 'magmain',
        
'access arguments' => array('access content'),
        
'type' => MENU_NORMAL_ITEM,
    );
    
$items['magmain/zayav'] = array(
        
'title'    => 'Zayavka',
        
'description' => 'Заявки Magmain',
        
'page callback' => 'zayav',
        
'access arguments' => array('access content'),
        
'type' => MENU_NORMAL_ITEM,
    );
 
    return 
$items;
// function magmain_menu
?>
Аватар пользователя KenSv KenSv 30 апреля 2009 в 13:52

glu2006, огромное СПАСИБО!!! Появился в меню раздел Shops
Уже полдела Smile Теперь нет подменю Zayavka...
Странно, что в первом куске кода "page_callback", а во втором "page callback"
И второй вариант тоже не работал. Глянул в описание API hook_menu:
menu_name и MENU_NORMAL_ITEM
и в тоже время page callback
Как-то в разнобой Smile
Брал примеры из разных книжек...А они сканированные...Разницу не углядел

Аватар пользователя glu2006 glu2006 30 апреля 2009 в 14:15

KenSv wrote:
glu2006, огромное СПАСИБО!!! Появился в меню раздел Shops
Уже полдела Smile Теперь нет подменю Zayavka...
Странно, что в первом куске кода "page_callback", а во втором "page callback"
И второй вариант тоже не работал. Глянул в описание API hook_menu:
menu_name и MENU_NORMAL_ITEM
и в тоже время page callback
Как-то в разнобой Smile
Брал примеры из разных книжек...А они сканированные...Разницу не углядел

Обращайте внимание для какой ветки друпала тот или иной пример, поскольку организация меню в 5-ке и 6-ке сильно отличаются.

Аватар пользователя KenSv KenSv 30 апреля 2009 в 15:03

glu2006, читал про проблемы совместимости версий drupal-а...это немного пугает, т.к.
привык работать по принципу сделал хорошо один раз и забыл Smile
В виндовом приложении у меня древовидное меню формируется из базы данных. Для того, чтобы реализовать что-то похожее в друпале
нужно видимо писать свой блок с php-кодом? Или есть что-то подобное... может есть примеры реализации, ссылки? Смотрел каталог расширений для
drupal...закопаться можно, а описание новичку не всегда дает представление о функционале и возможностях.

Аватар пользователя KenSv KenSv 4 мая 2009 в 13:39

посмотрел в выходные на домашнем компе исходник модуля. В нем "page callback" без знака подчеркивания.
После очистки кэша drupal все заработало (причем с иерархическим меню).
Вывод: очистка кэша была ключевым моментом для решения проблемы.
Еще раз спасибо, glu2006

Аватар пользователя mrBF mrBF 7 июня 2011 в 23:55

А вот такой вопрос есть (druapl 7): в main-menu есть пункт "Вход/регистрация" после авторизации пользователя она должна исчезнуть, а вместо нее появиться "мой аккаунт". Беда вот в чем - она не меняется! пока не очистишь cache. код хука приблизительно такой

<?php
function user_welcome_menu()
  {
    global 
$user;
        
    if (isset(
$user->uid))
    {
      
$items["user/$user->uid"] = array(
            
'title' => t('Мой аккаунт'),
            
'access arguments' => array('access content'),
            
'menu_name' => 'navigation',
            
'type' => MENU_NORMAL_ITEM,
        );
    }
    else
    {
      
$items['user/register'] = array(
            
'title' => t('Вход/Регистрация'),
            
'access arguments' => array('access content'),
            
'menu_name' => 'navigation',
            
'type' => MENU_NORMAL_ITEM,
        );
    }
    
menu_cache_clear('main-menu');  
    return 
$items;
   
  }
?>
Аватар пользователя mrBF mrBF 8 июня 2011 в 12:33

а как это реализовать можно не подскажите? на drupal.org реализовано что-похожее. может очищать принудительно кэш данного меню?