_menu_link_move_children
includes/menu.inc, строка 2153
- Версии
- 6
_menu_link_move_children($item, $existing_item)
Обновляет дочерние элементы ссылки меню, которая перемещается.
Имя меню, родительские элементы (p1 - p6) и глубина обновляются для всех дочерних элементов ссылки, плюс обновляется статус 'has_children'
предыдущего "родителя".
Связанные темы
Код
<?php
function _menu_link_move_children($item, $existing_item) {
$args[] = $item['menu_name'];
$set[] = "menu_name = '%s'";
$i = 1;
while ($i <= $item['depth']) {
$p = 'p'. $i++;
$set[] = "$p = %d";
$args[] = $item[$p];
}
$j = $existing_item['depth'] + 1;
while ($i <= MENU_MAX_DEPTH && $j <= MENU_MAX_DEPTH) {
$set[] = 'p'. $i++ .' = p'. $j++;
}
while ($i <= MENU_MAX_DEPTH) {
$set[] = 'p'. $i++ .' = 0';
}
$shift = $item['depth'] - $existing_item['depth'];
if ($shift < 0) {
$args[] = -$shift;
$set[] = 'depth = depth - %d';
}
elseif ($shift > 0) {
// The order of $set must be reversed so the new values don't overwrite the
// old ones before they can be used because "Single-table UPDATE
// assignments are generally evaluated from left to right"
// see: http://dev.mysql.com/doc/refman/5.0/en/update.html
$set = array_reverse($set);
$args = array_reverse($args);
$args[] = $shift;
$set[] = 'depth = depth + %d';
}
$where[] = "menu_name = '%s'";
$args[] = $existing_item['menu_name'];
$p = 'p1';
for ($i = 1; $i <= MENU_MAX_DEPTH && $existing_item[$p]; $p = 'p'. ++$i) {
$where[] = "$p = %d";
$args[] = $existing_item[$p];
}
db_query("UPDATE {menu_links} SET ". implode(', ', $set) ." WHERE ". implode(' AND ', $where), $args);
// Check the has_children status of the parent, while excluding this item.
_menu_update_parental_status($existing_item, TRUE);
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии