View source
<?php
function menu_configuration_api() {
return array(
'menu_custom' => array(
'name' => t('Menus'),
'default_hook' => 'menu_default_menu_custom',
'feature_source' => TRUE,
'default_file' => CONFIGURATION_DEFAULTS_INCLUDED,
),
'menu_links' => array(
'name' => t('Menu links'),
'default_hook' => 'menu_default_menu_links',
'feature_source' => TRUE,
'default_file' => CONFIGURATION_DEFAULTS_INCLUDED,
),
'menu' => array(
'name' => t('Menu items'),
'default_hook' => 'menu_default_items',
'default_file' => CONFIGURATION_DEFAULTS_INCLUDED,
'feature_source' => FALSE,
),
);
}
function menu_configuration_export($data, &$export, $module_name = '') {
$pipe = array();
foreach ($data as $path) {
$pipe['menu_links'][] = "configuration:{$path}";
}
return $pipe;
}
function menu_custom_configuration_export_options() {
$options = array();
$result = db_query("SELECT * FROM {menu_custom} ORDER BY title", array(), array(
'fetch' => PDO::FETCH_ASSOC,
));
foreach ($result as $menu) {
$options[$menu['menu_name']] = $menu['title'];
}
return $options;
}
function menu_custom_configuration_export($data, &$export, $module_name = '') {
$export['dependencies']['configuration'] = 'configuration';
$export['dependencies']['menu'] = 'menu';
$pipe = array();
$map = configuration_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];
}
$export['configuration']['menu_custom'][$menu_name] = $menu_name;
}
return $pipe;
}
function menu_custom_configuration_export_render($module, $data) {
$code = array();
$code[] = ' $menus = array();';
$code[] = '';
$translatables = array();
foreach ($data as $menu_name) {
$row = db_select('menu_custom')
->fields('menu_custom')
->condition('menu_name', $menu_name)
->execute()
->fetchAssoc();
if ($row) {
$export = configuration_var_export($row, ' ');
$code[] = " // Exported menu: {$menu_name}";
$code[] = " \$menus['{$menu_name}'] = {$export};";
$translatables[] = $row['title'];
$translatables[] = $row['description'];
}
}
if (!empty($translatables)) {
$code[] = configuration_translatables_export($translatables, ' ');
}
$code[] = '';
$code[] = ' return $menus;';
$code = implode("\n", $code);
return array(
'menu_default_menu_custom' => $code,
);
}
function menu_custom_configuration_revert($identifiers, $module_name = 'configuration') {
menu_custom_configuration_rebuild($identifiers, $module_name);
}
function menu_custom_configuration_rebuild($identifiers, $module_name = 'configuration') {
if ($defaults = configuration_get_default('menu_custom', $module_name)) {
foreach ($defaults as $identifier => $menu) {
if (in_array($identifier, $identifiers) || !empty($identifiers) && $identifiers[0] == '#import_all') {
menu_save($menu);
}
}
}
}
function menu_links_configuration_export_options() {
global $menu_admin;
$menu_admin = TRUE;
$menu_links = menu_parent_options(menu_get_menus(), array(
'mlid' => 0,
));
$options = array();
foreach ($menu_links as $key => $name) {
list($menu_name, $mlid) = explode(':', $key, 2);
if ($mlid != 0) {
$link = menu_link_load($mlid);
$identifier = menu_links_configuration_identifier($link);
$options[$identifier] = "{$menu_name}: {$name}";
}
}
$menu_admin = FALSE;
return $options;
}
function menu_links_configuration_identifier($link) {
return isset($link['menu_name'], $link['link_path']) ? "{$link['menu_name']}:{$link['link_path']}" : FALSE;
}
function menu_links_configuration_export($data, &$export, $module_name = '') {
$export['dependencies']['configuration'] = 'configuration';
$export['dependencies']['menu'] = 'menu';
$pipe = array();
$map = configuration_get_default_map('menu_links', 'menu_links_configuration_identifier');
foreach ($data as $identifier) {
if ($link = configuration_menu_link_load($identifier)) {
if (isset($map[$identifier]) && $map[$identifier] != $module_name) {
$export['dependencies'][$map[$identifier]] = $map[$identifier];
}
$export['configuration']['menu_links'][$identifier] = $identifier;
if (!in_array($link['menu_name'], array(
'configuration',
'primary-links',
'secondary-links',
'navigation',
'admin',
'devel',
))) {
$pipe['menu_custom'][] = $link['menu_name'];
}
}
}
return $pipe;
}
function menu_links_configuration_export_render($module, $data) {
$code = array();
$code[] = ' $menu_links = array();';
$code[] = '';
$translatables = array();
foreach ($data as $identifier) {
if ($link = configuration_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}'] = " . configuration_var_export($link, ' ') . ";";
$translatables[] = $link['link_title'];
}
}
if (!empty($translatables)) {
$code[] = configuration_translatables_export($translatables, ' ');
}
$code[] = '';
$code[] = ' return $menu_links;';
$code = implode("\n", $code);
return array(
'menu_default_menu_links' => $code,
);
}
function menu_links_configuration_revert($module, $module_name = 'configuration') {
menu_links_configuration_rebuild($module, $module_name);
}
function menu_links_configuration_rebuild($identifiers, $module_name = 'configuration') {
if ($menu_links = configuration_get_default('menu_links', $module_name)) {
$links = array();
foreach ($identifiers as $identifier) {
if (array_key_exists($identifier, $menu_links) || !empty($identifiers) && $identifiers[0] == '#import_all') {
$links[$identifier] = $menu_links[$identifier];
}
}
menu_links_configuration_rebuild_ordered($links);
}
}
function menu_links_configuration_rebuild_ordered($menu_links, $reset = FALSE) {
static $ordered;
static $all_links;
if (!isset($ordered) || $reset) {
$ordered = array();
$unordered = configuration_get_default('menu_links');
if ($unordered) {
do {
$current = count($unordered);
foreach ($unordered as $key => $link) {
$identifier = menu_links_configuration_identifier($link);
$parent = isset($link['parent_path']) ? "{$link['menu_name']}:{$link['parent_path']}" : '';
if (empty($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 = configuration_menu_link_load($identifier);
if (!$existing || in_array($link, $menu_links)) {
if ($existing) {
$link['mlid'] = $existing['mlid'];
}
if (!empty($link['parent_path']) && ($parent = configuration_menu_link_load("{$link['menu_name']}:{$link['parent_path']}"))) {
$link['plid'] = $parent['mlid'];
}
else {
$link['plid'] = 0;
}
menu_link_save($link);
}
}
}
function configuration_menu_link_load($identifier) {
list($menu_name, $link_path) = explode(':', $identifier, 2);
$link = db_select('menu_links')
->fields('menu_links', array(
'menu_name',
'mlid',
'plid',
'link_path',
'router_path',
'link_title',
'options',
'module',
'hidden',
'external',
'has_children',
'expanded',
'weight',
))
->condition('menu_name', $menu_name)
->condition('link_path', $link_path)
->execute()
->fetchAssoc();
if ($link) {
$link['options'] = unserialize($link['options']);
return $link;
}
return FALSE;
}
function configuration_check_menu_links($identifier) {
$from_activestore =& drupal_static('configuration_from_activestore');
$component = 'menu_links';
if (file_exists("config://configuration.menu_links.inc")) {
include_once drupal_realpath("config://configuration.menu_links.inc");
module_load_include('inc', 'configuration', "configuration.export");
$code = menu_links_configuration_export_render('configuration', array(
$identifier,
));
eval(array_pop($code));
$menu_links_code = configuration_menu_default_menu_links();
if (empty($menu_links)) {
configuration_set_status($component, $identifier, CONFIGURATION_TRACKED_DATASTORE_ONLY);
}
configuration_update_component_status($component, $identifier, $menu_links, $menu_links_code, $from_activestore);
}
}
function configuration_hash_menu_links($identifier) {
module_load_include('inc', 'configuration', 'configuration.export');
$data = menu_links_configuration_export_options();
$code = menu_links_configuration_export_render('configuration', array(
$identifier,
));
eval(array_pop($code));
return md5(serialize($menu_links[$identifier]));
}
function configuration_check_menu_custom($identifier, $from_activestore = FALSE) {
$from_activestore =& drupal_static('configuration_from_activestore');
$component = 'menu_custom';
if (file_exists("config://configuration.menu_custom.inc")) {
include_once drupal_realpath("config://configuration.menu_custom.inc");
module_load_include('inc', 'configuration', 'configuration.export');
$code = menu_custom_configuration_export_render('configuration', array(
$identifier,
));
eval(array_pop($code));
$menus_code = configuration_menu_default_menu_custom();
if (empty($menus)) {
configuration_set_status($component, $identifier, CONFIGURATION_TRACKED_DATASTORE_ONLY);
}
$config = configuration_get_configuration();
$return = '';
$component = 'menu_custom';
$status = $config[$component][$identifier]['status'];
$md5_datastore = is_array($menus_code) && array_key_exists($identifier, $menus_code) ? md5(serialize($menus_code[$identifier])) : '';
$md5_activestore = is_array($menus_code) && array_key_exists($identifier, $menus_code) ? md5(serialize($menus[$identifier])) : '';
if ($from_activestore == TRUE && $md5_datastore != $md5_activestore) {
$status = $status | CONFIGURATION_ACTIVESTORE_OVERRIDDEN;
configuration_set_status($component, $identifier, $status);
}
if ($md5_activestore == $md5_datastore) {
$status = CONFIGURATION_IN_SYNC;
configuration_set_status($component, $identifier, $status);
configuration_set_hash($component, $identifier, $md5_activestore);
}
if ($md5_activestore != $md5_datastore) {
$status = $status | CONFIGURATION_DATASTORE_OVERRIDDEN;
configuration_set_status($component, $identifier, $status);
}
if ($md5_datastore == $config[$component][$identifier]['hash']) {
$status = $status & ~CONFIGURATION_DATASTORE_OVERRIDDEN;
configuration_set_status($component, $identifier, $status);
}
if ($status != CONFIGURATION_IN_SYNC) {
$configuration[$component][$identifier]['activestore'] = is_array($menus_code) && array_key_exists($identifier, $menus_code) ? $menus[$identifier] : '';
$configuration[$component][$identifier]['datastore'] = is_array($menus_code) && array_key_exists($identifier, $menus_code) ? $menus_code[$identifier] : '';
cache_set("{$component}:{$identifier}", $configuration, 'cache_configuration');
}
}
}
function configuration_hash_menu_custom($identifier) {
module_load_include('inc', 'configuration', 'configuration.export');
$data = menu_custom_configuration_export_options();
$code = menu_custom_configuration_export_render('configuration', array(
$identifier,
));
eval(array_pop($code));
return md5(serialize($menus[$identifier]));
}