View file dpanel/menu.editor.php

File size: 13.9Kb
<?php

include_once '../sys/inc/start.php';
dpanel::check_access();
$doc = new document(6);
$groups = groups::load_ini();
$doc->title = __('Редактор меню');

$menu_files = (array) glob(H . '/sys/ini/menu.*.ini');
$menus = array();
foreach ($menu_files as $menu_path) {
    if (!preg_match('#menu\.(.+?)\.ini$#ui', $menu_path, $m))
        continue;
    $menus[] = $m[1];
}

if (!empty($_GET['menu'])) {
    $menu = (string) $_GET['menu'];

    if (!in_array($menu, $menus)) {
        $doc->err(__('Запрошенное меню не найдено'));
        exit;
    }
    $doc->title = __('Меню "%s" - редактирование', $menu);
    $m_obj = new menu($menu);

    if (!empty($_GET['item'])) {
        $item_name = (string) $_GET['item'];
        if (!isset($m_obj->menu_arr[$item_name])) {
            $doc->err(__('Ошибка при выборе пункта меню'));
        }

        $item = $m_obj->menu_arr[$item_name];
        $doc->title = __('Меню "%s" - %s', $menu, $item_name);
        if (!empty($_POST['delete'])) {
            if (empty($_POST['captcha']) || empty($_POST['captcha_session']) || !captcha::check($_POST['captcha'], $_POST['captcha_session'])) {
                $doc->err(__('Проверочное число введено неверно'));
            } else {
                $ini = ini::read(H . '/sys/ini/menu.' . $menu . '.ini', true);
                unset($ini[$item_name]);
                if (ini::save(H . '/sys/ini/menu.' . $menu . '.ini', $ini, true)) {
                    $doc->msg(__('Пункт меню успешно удален'));
                } else {
                    $doc->err(__('Ошибка при сохранении файла'));
                }
                header('Refresh: 1; url=?menu=' . urlencode($menu) . '&amp;' . passgen());
                $doc->ret(__('Меню "%s"', $menu), '?menu=' . urlencode($menu) . '&amp;' . passgen());
                $doc->ret(__('Список меню'), '?' . passgen());
                $doc->ret(__('Админка'), './?' . passgen());
                exit;
            }
        }
        if (!empty($_POST['save'])) {
            $name = text::input_text(@$_POST['name']);
            $url = text::input_text(@$_POST['url']);
            $icon = text::input_text(@$_POST['icon']);
            $razdel = (int) !empty($_POST['razdel']);
            $is_vip = (int) !empty($_POST['is_vip']);
            $group = (int) @$_POST['group'];
            $position = (int) @$_POST['position'];
            if (empty($name)) {
                $doc->err(__('Название не может быть пустым'));
            } elseif ($name != $item_name && isset($m_obj->menu_arr[$name])) {
                $doc->err(__('Выбранное название меню уже занято'));
            } else {
                $ini = ini::read(H . '/sys/ini/menu.' . $menu . '.ini', true);
                if ($name != $item_name) {
                    unset($ini[$item_name]);
                }



                $ini[$name] = array('url' => $url,
                    'icon' => $icon,
                    'razdel' => $razdel,
                    'is_vip' => $is_vip,
                    'group' => $group
                );
                arraypos::setPosition($ini, $name, $position);
                if (ini::save(H . '/sys/ini/menu.' . $menu . '.ini', $ini, true)) {
                    $doc->msg(__('Изменения успешно приняты'));
                } else {
                    $doc->err(__('Ошибка при сохранении файла'));
                }
                header('Refresh: 1; url=?menu=' . urlencode($menu) . '&amp;' . passgen());
                $doc->ret(__('Меню "%s"', $menu), '?menu=' . urlencode($menu) . '&amp;' . passgen());
                $doc->ret(__('Список меню'), '?' . passgen());
                $doc->ret(__('Админка'), './?' . passgen());
                exit;
            }
        }



        if (isset($_GET['act']) && $_GET['act'] == 'delete') {
            $doc->title = __('Удаление пункта %s', $item_name);
            $form = new form('?menu=' . urlencode($menu) . '&amp;item=' . urlencode($item_name) . '&amp;' . passgen());
            $form->captcha();
            $form->button(__('Удалить'), 'delete');
            $form->display();
        } else {

            $form = new form('?menu=' . urlencode($menu) . '&amp;item=' . urlencode($item_name) . '&amp;' . passgen());

            $form->text('name', __('Название'), $item_name);
            $form->text('position', __('Позиция'), arraypos::getPosition($m_obj->menu_arr, $item_name));
            $form->text('url', __('Ссылка'), $item['url']);

            $icons = (array) glob(H . '/sys/images/icons/*.png');
            $options = array();
            $options[] = array('', '[' . __('Отсутствует') . ']');
            foreach ($icons as $icon_path) {
                $icon = str_replace(H . '/sys/images/icons/', '', filesystem::unixpath($icon_path));
                $options[] = array($icon, $icon, $icon == @$item['icon']);
            }
            $form->select('icon', __('Иконка'), $options);

            $form->checkbox('razdel', __('Разделитель'), @$item['razdel']);
            $form->checkbox('is_vip', __('Только для VIP'), @$item['is_vip']);

            $options = array();
            foreach ($groups as $group => $value) {
                $options[] = array($group, $value['name'], $group == @$item['group']);
            }
            $form->select('group', __('Для группы (и выше)') . '*', $options);
            $form->bbcode('* ' . __('Регулируется только отображение ссылки'));
            $form->button(__('Применить'), 'save');
            $form->display();
        }

        $doc->ret(__('Меню "%s"', $menu), '?menu=' . urlencode($menu) . '&amp;' . passgen());
        $doc->ret(__('Список меню'), '?' . passgen());
        $doc->ret(__('Админка'), './?' . passgen());
        exit;
    }

    if (isset($_GET['item_add'])) {
        $doc->title = __('Новый пункт меню %s', $menu);
        if (!empty($_POST['create'])) {
            $name = text::input_text(@$_POST['name']);
            $url = text::input_text(@$_POST['url']);
            $icon = text::input_text(@$_POST['icon']);
            $razdel = (int) !empty($_POST['razdel']);
            $is_vip = (int) !empty($_POST['is_vip']);
            $group = (int) @$_POST['group'];
            $position = (int) @$_POST['position'];
            if (empty($name)) {
                $doc->err(__('Название не может быть пустым'));
            } elseif (isset($m_obj->menu_arr[$name])) {
                $doc->err(__('Выбранное название меню уже занято'));
            } else {
                $ini = ini::read(H . '/sys/ini/menu.' . $menu . '.ini', true);


                $ini[$name] = array('url' => $url,
                    'icon' => $icon,
                    'razdel' => $razdel,
                    'is_vip' => $is_vip,
                    'group' => $group
                );
                arraypos::setPosition($ini, $name, $position);
                if (ini::save(H . '/sys/ini/menu.' . $menu . '.ini', $ini, true)) {
                    $doc->msg(__('Изменения успешно приняты'));
                } else {
                    $doc->err(__('Ошибка при сохранении файла'));
                }
                header('Refresh: 1; url=?menu=' . urlencode($menu) . '&amp;' . passgen());
                $doc->ret(__('Меню "%s"', $menu), '?menu=' . urlencode($menu) . '&amp;' . passgen());
                $doc->ret(__('Список меню'), '?' . passgen());
                $doc->ret(__('Админка'), './?' . passgen());
                exit;
            }
        }

        $form = new form('?menu=' . urlencode($menu) . '&amp;item_add&amp;' . passgen());
        $form->text('name', __('Название'));
        $form->text('position', __('Позиция'), count($m_obj->menu_arr) + 1);
        $form->text('url', __('Ссылка'), 'http://');

        $icons = (array) glob(H . '/sys/images/icons/*.png');
        $options = array();
        $options[] = array('', '[' . __('Отсутствует') . ']');
        foreach ($icons as $icon_path) {
            $icon = str_replace(H . '/sys/images/icons/', '', filesystem::unixpath($icon_path));
            $options[] = array($icon, $icon);
        }
        $form->select('icon', __('Иконка'), $options);

        $form->checkbox('razdel', __('Разделитель'));
        $form->checkbox('is_vip', __('Только для VIP'));

        $options = array();
        foreach ($groups as $group => $value) {
            $options[] = array($group, $value['name']);
        }
        $form->select('group', __('Для группы (и выше)') . '*', $options);
        $form->bbcode('* ' . __('Регулируется только отображение ссылки'));
        $form->button(__('Создать'), 'create');
        $form->display();


        $doc->ret(__('Меню "%s"', $menu), '?menu=' . urlencode($menu) . '&amp;' . passgen());
        $doc->ret(__('Список меню'), '?' . passgen());
        $doc->ret(__('Админка'), './?' . passgen());
        exit;
    }



    if (isset($_GET['sortable'])) {

        $ini = ini::read(H . '/sys/ini/menu.' . $menu . '.ini', true);
        $doc->clean();

        //echo $_POST['sortable'];
        $sortable = explode(',', $_POST['sortable']);

        foreach ($sortable as $position => $key) {
            //$key = base64_decode($key);
            // echo "$position $key\n";
            arraypos::setPosition($ini, $key, $position + 1);
        }

        header('Content-type: application/json');
        if (ini::save(H . '/sys/ini/menu.' . $menu . '.ini', $ini, true)) {
            echo json_encode(array('result' => 1, 'description' => __('Порядок пунктов меню успешно сохранен')));
        } else {
            echo json_encode(array('result' => 0, 'description' => __('Не удалось сохранить порядок пунктов в меню')));
        }


        exit;
    }



    if (isset($_GET['up']) || isset($_GET['down'])) {
        $ini = ini::read(H . '/sys/ini/menu.' . $menu . '.ini', true);

        if (isset($_GET['up'])) {
            $item_name = $_GET['up'];
            if (misc::array_key_move($ini, $item_name, - 1)) {
                $doc->msg(__('Пункт "%s" успешно перемещен вверх', $item_name));
            } else {
                $doc->err(__('Пункт "%s" уже находится вверху', $item_name));
            }
        }

        if (isset($_GET['down'])) {
            $item_name = $_GET['down'];
            if (misc::array_key_move($ini, $item_name, 1)) {
                $doc->msg(__('Пункт "%s" успешно перемещен вниз', $item_name));
            } else {
                $doc->err(__('Пункт "%s" уже находится внизу', $item_name));
            }
        }
        if (ini::save(H . '/sys/ini/menu.' . $menu . '.ini', $ini, true)) {
            $doc->msg(__('Изменения успешно приняты'));
        } else {
            $doc->err(__('Ошибка при сохранении файла'));
        }
        $m_obj = new menu($menu);
    }


    $listing = new listing();

    $position = 0;
    foreach ($m_obj->menu_arr as $name => $item) {
        $position++;

        $post = $listing->post();
        $post->id = $name;
        $post->url = '?menu=' . urlencode($menu) . '&amp;item=' . urlencode($name);
        $post->title = for_value($name);

        $post->icon(@$item['icon']);

        $post->action('up', '?menu=' . urlencode($menu) . '&amp;up=' . urlencode($name) . '&amp;' . passgen());
        $post->action('down', '?menu=' . urlencode($menu) . '&amp;down=' . urlencode($name) . '&amp;' . passgen());
        $post->action('delete', '?menu=' . urlencode($menu) . '&amp;item=' . urlencode($name) . '&amp;act=delete&amp;' . passgen());



        if (empty($item['razdel'])) {
            $post->content = __('Ссылка') . ": $item[url]\n";
            if (!empty($item['icon'])) {
                $icon = array('size' => 'small', 'src' => '/sys/images/icons/' . $item['icon']);
            }
        } else {
            $post->content = "[b]" . __('Разделитель') . "[/b]\n";
            $post->hightlight = true;
        }

        if (!empty($item['for_vip'])) {
            $post->content .= __('Только для [b]VIP[/b]-пользователей') . "\n";
        }

        if (!empty($item['group'])) {
            $post->content .= __('Только для группы [b]%s[/b] (%s)', groups::name($item['group']), $item['group']) . " \n";
        }
        $post->content = output_text($post->content);
    }


    $listing->sortable = '?sortable&amp;menu=' . urlencode($menu);
    $listing->display(__('Меню пусто'));

    $doc->act(__('Добавить пункт'), '?menu=' . urlencode($menu) . '&amp;item_add&amp;' . passgen());


    $doc->ret(__('Список меню'), '?' . passgen());
    $doc->ret(__('Админка'), './?' . passgen());
    exit;
}


$listing = new listing();
foreach ($menus as $menu) {
    $post = $listing->post();
    $post->title = for_value($menu);
    $post->url = '?menu=' . urlencode($menu);
    $post->icon('menu.editor');
}
$listing->display(__('Нет меню для редактирования'));


$doc->ret(__('Админка'), './?' . passgen());
?>