View source
<?php
function menu_features_api() {
return array(
'menu_custom' => array(
'name' => t('Menus'),
'default_hook' => 'menu_default_menu_custom',
'feature_source' => TRUE,
'default_file' => FEATURES_DEFAULTS_INCLUDED,
),
'menu_links' => array(
'name' => t('Menu links'),
'default_hook' => 'menu_default_menu_links',
'feature_source' => TRUE,
'default_file' => FEATURES_DEFAULTS_INCLUDED,
),
'menu' => array(
'name' => t('Menu items'),
'default_hook' => 'menu_default_items',
'default_file' => FEATURES_DEFAULTS_INCLUDED,
'feature_source' => FALSE,
),
);
}
function menu_features_export($data, &$export, $module_name = '') {
$pipe = array();
foreach ($data as $path) {
$pipe['menu_links'][] = "features:{$path}";
}
return $pipe;
}
function menu_custom_features_export_options() {
$options = array();
$result = db_query("SELECT * FROM {menu_custom}");
while ($row = db_fetch_array($result)) {
$options[$row['menu_name']] = $row['title'];
}
return $options;
}
function menu_custom_features_export($data, &$export, $module_name = '') {
$export['dependencies']['features'] = 'features';
$export['dependencies']['menu'] = 'menu';
$pipe = array();
$map = features_get_default_map('menu_custom', 'menu_name');
foreach ($data as $menu_name) {
if (isset($map[$menu_name]) && $map[$menu_name] != $module_name) {
$export['dependencies'][$map[$menu_name]] = $map[$menu_name];
}
else {
$export['features']['menu_custom'][$menu_name] = $menu_name;
}
}
return $pipe;
}
function menu_custom_features_export_render($module, $data) {
$code = array();
$code[] = ' $menus = array();';
$code[] = '';
$translatables = array();
foreach ($data as $menu_name) {
$result = db_query("SELECT menu_name, title, description FROM {menu_custom} WHERE menu_name = '%s'", $menu_name);
while ($row = db_fetch_array($result)) {
$export = features_var_export($row, ' ');
$code[] = " // Exported menu: {$menu_name}";
$code[] = " \$menus['{$menu_name}'] = {$export};";
$translatables[] = $row['title'];
$translatables[] = $row['description'];
}
}
if (!empty($translatables)) {
$code[] = features_translatables_export($translatables, ' ');
}
$code[] = '';
$code[] = ' return $menus;';
$code = implode("\n", $code);
return array(
'menu_default_menu_custom' => $code,
);
}
function menu_custom_features_revert($module) {
menu_custom_features_rebuild($module);
}
function menu_custom_features_rebuild($module) {
if ($defaults = features_get_default('menu_custom', $module)) {
foreach ($defaults as $menu) {
$existing = db_result(db_query("SELECT menu_name FROM {menu_custom} WHERE menu_name = '%s'", $menu['menu_name']));
drupal_write_record('menu_custom', $menu, $existing ? array(
'menu_name',
) : array());
}
}
}
function menu_links_features_export_options() {
$menu_links = array();
foreach (array_reverse(menu_get_menus()) as $menu_name => $menu_title) {
$data = array();
$cid = 'links:' . $menu_name . ':all-cid:0';
$cache = cache_get($cid, 'cache_menu');
if ($cache && isset($cache->data)) {
$cache = cache_get($cache->data, 'cache_menu');
if ($cache && isset($cache->data)) {
$data = $cache->data;
}
}
else {
$data['tree'] = menu_tree_data(db_query("\n SELECT m.load_functions, m.to_arg_functions, m.access_callback, m.access_arguments, m.page_callback, m.page_arguments, m.title, m.title_callback, m.title_arguments, m.type, m.description, ml.*\n FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path\n WHERE ml.menu_name = '%s'\n ORDER BY p1 ASC, p2 ASC, p3 ASC, p4 ASC, p5 ASC, p6 ASC, p7 ASC, p8 ASC, p9 ASC", $menu_name));
$data['node_links'] = array();
menu_tree_collect_node_links($data['tree'], $data['node_links']);
$tree_cid = _menu_tree_cid($menu_name, $data);
if (!cache_get($tree_cid, 'cache_menu')) {
cache_set($tree_cid, $data, 'cache_menu');
}
cache_set($cid, $tree_cid, 'cache_menu');
}
$GLOBALS['menu_admin'] = TRUE;
menu_tree_check_access($data['tree'], $data['node_links']);
$GLOBALS['menu_admin'] = FALSE;
_menu_links_features_export_options_recurse($data['tree'], $menu_name, '--', $menu_links);
}
return $menu_links;
}
function _menu_links_features_export_options_recurse($tree, $menu_name, $indent, &$menu_links) {
foreach ($tree as $data) {
if ($data['link']['hidden'] >= 0) {
$title = $indent . ' ' . truncate_utf8($data['link']['title'], 30, TRUE, FALSE);
if ($data['link']['hidden']) {
$title .= ' (' . t('disabled') . ')';
}
$menu_links[menu_links_features_identifier($data['link'])] = "{$menu_name}: {$title}";
if ($data['below']) {
_menu_links_features_export_options_recurse($data['below'], $menu_name, $indent . '--', $menu_links);
}
}
}
}
function menu_links_features_identifier($link) {
return isset($link['menu_name'], $link['link_path']) ? "{$link['menu_name']}:{$link['link_path']}" : FALSE;
}
function menu_links_features_export($data, &$export, $module_name = '') {
$export['dependencies']['features'] = 'features';
$export['dependencies']['menu'] = 'menu';
$pipe = array();
$map = features_get_default_map('menu_links', 'menu_links_features_identifier');
foreach ($data as $identifier) {
if ($link = features_menu_link_load($identifier)) {
if (isset($map[$identifier]) && $map[$identifier] != $module_name) {
$export['dependencies'][$map[$identifier]] = $map[$identifier];
}
else {
$export['features']['menu_links'][$identifier] = $identifier;
}
if (!in_array($link['menu_name'], array(
'features',
'primary-links',
'secondary-links',
'navigation',
'admin',
'devel',
))) {
$pipe['menu_custom'][] = $link['menu_name'];
}
}
}
return $pipe;
}
function menu_links_features_export_render($module, $data) {
$code = array();
$code[] = ' $menu_links = array();';
$code[] = '';
$translatables = array();
foreach ($data as $identifier) {
if ($link = features_menu_link_load($identifier)) {
if (!empty($link['plid']) && ($parent = menu_link_load($link['plid']))) {
$link['parent_path'] = $parent['link_path'];
}
unset($link['plid']);
unset($link['mlid']);
$code[] = " // Exported menu link: {$identifier}";
$code[] = " \$menu_links['{$identifier}'] = " . features_var_export($link, ' ') . ";";
$translatables[] = $link['link_title'];
}
}
if (!empty($translatables)) {
$code[] = features_translatables_export($translatables, ' ');
}
$code[] = '';
$code[] = ' return $menu_links;';
$code = implode("\n", $code);
return array(
'menu_default_menu_links' => $code,
);
}
function menu_links_features_revert($module) {
menu_links_features_rebuild($module);
}
function menu_links_features_rebuild($module) {
if ($menu_links = features_get_default('menu_links', $module)) {
menu_links_features_rebuild_ordered($menu_links);
}
}
function menu_links_features_rebuild_ordered($menu_links, $reset = FALSE) {
static $ordered;
static $all_links;
if (!isset($ordered) || $reset) {
$ordered = array();
$unordered = features_get_default('menu_links');
if ($unordered) {
do {
$current = count($unordered);
foreach ($unordered as $key => $link) {
$identifier = menu_links_features_identifier($link);
$parent = isset($link['parent_path']) ? "{$link['menu_name']}:{$link['parent_path']}" : '';
if (empty($parent) || !empty($parent) && !isset($unordered[$parent]) && !isset($ordered[$parent])) {
$ordered[$identifier] = 0;
$all_links[$identifier] = $link;
unset($unordered[$key]);
}
elseif (isset($ordered[$parent])) {
$ordered[$identifier] = $ordered[$parent] + 1;
$all_links[$identifier] = $link;
unset($unordered[$key]);
}
}
} while (count($unordered) < $current);
}
asort($ordered);
}
foreach (array_keys($ordered) as $identifier) {
$link = $all_links[$identifier];
$existing = features_menu_link_load($identifier);
if (!$existing || in_array($link, $menu_links)) {
if ($existing) {
$link['mlid'] = $existing['mlid'];
}
if (!empty($link['parent_path']) && ($parent = features_menu_link_load("{$link['menu_name']}:{$link['parent_path']}"))) {
$link['plid'] = $parent['mlid'];
}
else {
$link['plid'] = 0;
}
menu_link_save($link);
}
}
}
function features_menu_link_load($identifier) {
list($menu_name, $link_path) = explode(':', $identifier, 2);
$result = db_query("SELECT menu_name, mlid, plid, link_path, router_path, link_title, options, module, hidden, external, has_children, expanded, weight FROM {menu_links} WHERE menu_name = '%s' AND link_path = '%s'", $menu_name, $link_path);
while ($link = db_fetch_array($result)) {
$link['options'] = unserialize($link['options']);
return $link;
}
return FALSE;
}