[solved] enable/disable пункты меню

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

Аватар пользователя wanders.32 wanders.32 25 июня 2008 в 14:55

проблема такая: если при создании страницы назначить ей пункт меню - он, соответственно, появится, но независимо от того, активна нода или неактивна.
и еще один нюанс - а где, вернее как сделать пункт меню disabled? таблица меню в базе имеет поля mid,pid,path,title,description,weight,type - собственно флага включен/выключен не вижу:-/
благо, т.к в проекте редактирование нод и включение/выключение их идет не через админку друпала, а через модуль, проблему с выключением меню решить можно. вот только не знаю, как его выключать-то, где и какой флаг ставить неактивным

Комментарии

Аватар пользователя wanders.32 wanders.32 25 июня 2008 в 16:01
function menu_confirm_disable_item_submit($form_id, $form_values) {
  $type = $form_values['item']['type'];
  $type &= ~MENU_VISIBLE_IN_TREE;
  $type &= ~MENU_VISIBLE_IN_BREADCRUMB;
  $type |= MENU_MODIFIED_BY_ADMIN;
 
  db_query('UPDATE {menu} SET type = %d WHERE mid = %d', $type, $form_values['mid']);
  drupal_set_message(t('The menu item has been disabled.'));
  drupal_goto('admin/build/menu');
}

функция из menu.module. константы - флаги, в $type хранится 8битное значение флагов, в базу сохраняется в десятиричной системе. собственно, с этим разобрались, теперь последний (риторический) вопрос: почему тогда в {node} есть поле active, а в {menu} такая вот херь?)

Аватар пользователя wanders.32 wanders.32 25 июня 2008 в 18:17

function mm_process_status($value, $uid) {
$sql = "UPDATE {node} n SET n.status = '%d' WHERE n.nid = %d";
$res = db_query($sql, $value == 'true' ? 1 : 0, $uid);
//начало: $value - выключаем/включаем ноду, и меню, связанное с ней соответственно.
$item = db_fetch_array(db_query("SELECT mid,type FROM {menu} WHERE path = 'node/%d'", $uid));
$type = $item['type'];
if($value == 'false'){
//права, вырубить меню
$type &= ~MENU_VISIBLE_IN_TREE;
$type &= ~MENU_VISIBLE_IN_BREADCRUMB;
$type |= MENU_MODIFIED_BY_ADMIN;
//конец прав
}
else if($value == 'true'){
//права, включить меню
$type |= MENU_VISIBLE_IN_TREE;
$type |= MENU_VISIBLE_IN_BREADCRUMB;
$type |= MENU_MODIFIED_BY_ADMIN;
//конец прав
}
db_query('UPDATE {menu} SET type = %d WHERE mid = %d', $type, $item['mid']);
menu_rebuild();
}
функция, выключающая ноду и ее пункт меню вместе с ней. проверок на наличие меню нет - пункт меню всегда есть по спецификации-)

1 беда осталась - если нода по умолчанию неактивная - то есть премодерация нод, то пункт меню все равно создается и сразу активен:-/

Аватар пользователя LAN_DRUPAL LAN_DRUPAL 25 июня 2008 в 18:30

при создании пункта меню, вроди только тип прописать, и менюшка не будет. Вроди.

$items[] = array(
        'path' => 'ecoevent',
        'title' => t('Title'),
        'callback' => 'event_content',
        'callback arguments' => array('list'),
        'access' => user_access('access content'),
        'type' => MENU_VISIBLE_IN_TREE); (или что то в этом роде)
Аватар пользователя wanders.32 wanders.32 27 июня 2008 в 17:07

эт не то создание меню, речь идет о автоматическом создании пунка при создании ноды, Menu settings - опция такая есть