Вопросы по JohnCMS 9.x

11.6K
.
Simba, Спасибо. нашёл уже еле
.
Leopard
КоляН, Yes Karma Off.
.
Металлович
вот делаю  я  редактор  аваторов  для  Johncms 9.7  а  именно  создание  папок,  удаление  папок  и  проблема  у  меня  возникла в том  что  когда  создаю папку  то  ва  неё  перейти  не  могу,  а в существующую  папку  перейти  могу  
<?php

/**
 * This file is part of JohnCMS Content Management System.
 */

declare(strict_types=1);

defined('_IN_JOHNCMS') || die('Error: restricted access');

/**
 * @var Johncms\System\Legacy\Tools $tools
 * @var Johncms\System\Users\User $user
 * @var Johncms\Api\ViewInterface $view
 */

$title = __('Avatars');
$nav_chain->add($title, '?act=avatars');
$data = [];

// Проверка прав: используем метод getUserData() или прямое обращение
// Если у тебя в базе rights = 9, то это условие точно сработает
$userRights = $user->isValid() ? (int)$user->rights : 0;
$isAdmin = ($userRights >= 7);

// --- ОТЛАДКА (Удали эту строку, когда увидишь кнопки) ---
// echo '<div style="background:#eee; padding:5px; font-size:10px;">Твой ID: '.$user->id.' | Права: '.$userRights.' | Админ: '.($isAdmin ? 'ДА' : 'НЕТ').'</div>';

// --- БЛОК АДМИНИСТРИРОВАНИЯ ---
if ($isAdmin) {
    // Создание папки
    if (isset($_POST['add_cat'])) {
        $folder = preg_replace("/[^a-z0-9\-_]/i", "", $_POST['folder_name']);
        $name = htmlspecialchars(trim($_POST['display_name']));
        if (!empty($folder)) {
            $target = ASSETS_PATH . 'avatars/' . $folder;
            if (!is_dir($target)) {
                mkdir($target, 0777, true);
                file_put_contents($target . '/name.txt', $name);
            }
        }
    }

    // Загрузка PNG
    if (isset($_POST['up_avatar']) && $id) {
        $target_dir = ASSETS_PATH . 'avatars/' . $id . '/';
        if (is_dir($target_dir) && isset($_FILES['file'])) {
            $ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
            if ($ext === 'png') {
                $files = glob($target_dir . "*.png");
                $max = 0;
                foreach ($files as $f) {
                    $num = (int)basename($f, '.png');
                    if ($num > $max) $max = $num;
                }
                move_uploaded_file($_FILES['file']['tmp_name'], $target_dir . ($max + 1) . '.png');
            }
        }
    }

    // Удаление папки
    if (isset($_GET['del_cat']) && $id) {
        $del_path = ASSETS_PATH . 'avatars/' . $id;
        if (is_dir($del_path)) {
            array_map('unlink', glob("$del_path/*.*"));
            rmdir($del_path);
            header('Location: ?act=avatars');
            exit;
        }
    }
}

// --- ВИЗУАЛЬНАЯ ЧАСТЬ ---

if ($id && is_dir(ASSETS_PATH . 'avatars/' . $id)) {
    // Просмотр категории или установка аватара
    $avatar = isset($_GET['avatar']) ? (int)$_GET['avatar'] : false;

    if ($user->isValid() && $avatar && is_file(ASSETS_PATH . 'avatars/' . $id . '/' . $avatar . '.png')) {
        // Установка (обработка POST)
        if (isset($_POST['submit'])) {
            if (@copy(ASSETS_PATH . 'avatars/' . $id . '/' . $avatar . '.png', UPLOAD_PATH . 'users/avatar/' . $user->id . '.png')) {
                echo $view->render('system::pages/result', [
                    'title' => $title, 'type' => 'alert-success', 'message' => __('Avatar applied'),
                    'back_url' => '../profile/?act=edit', 'back_url_name' => __('Continue')
                ]);
            }
        } else {
            // Форма подтверждения
            echo $view->render('help::confirm', [
                'title' => __('Set Avatar'), 'page_title' => __('Set Avatar'),
                'data' => [
                    'form_action' => '?act=avatars&id='.$id.'&avatar='.$avatar,
                    'message' => __('Set this image?'),
                    'img' => '../assets/avatars/'.$id.'/'.$avatar.'.png',
                    'back_url' => '?act=avatars&id='.$id,
                    'submit_btn_name' => __('Save')
                ]
            ]);
        }
    } else {
        // Список аватаров в папке
        $name_f = ASSETS_PATH . 'avatars/' . $id . '/name.txt';
        $cat_name = is_file($name_f) ? file_get_contents($name_f) : $id;
        $nav_chain->add($cat_name);

        if ($isAdmin) {
            echo '<div class="alert alert-info m-2">
                <form action="?act=avatars&id='.$id.'" method="post" enctype="multipart/form-data">
                    <h6>Загрузить в: '.$cat_name.'</h6>
                    <input type="file" name="file" accept="image/png" required>
                    <button type="submit" name="up_avatar" class="btn btn-sm btn-success">OK</button>
                    <a href="?act=avatars&id='.$id.'&del_cat=1" class="btn btn-sm btn-danger float-right" onclick="return confirm(\'Удалить папку?\')">Удалить категорию</a>
                </form>
            </div>';
        }

        $per_page = 48;
        $files = glob(ASSETS_PATH . 'avatars/' . $id . '/*.png');
        $total = count($files);
        $items = [];
        for ($i = $start; $i < ($start + $per_page) && $i < $total; $i++) {
            $items[] = [
                'picture' => '../assets/avatars/' . $id . '/' . basename($files[$i]),
                'set_url' => $user->isValid() ? '?act=avatars&id='.$id.'&avatar='.basename($files[$i], '.png') : ''
            ];
        }

        echo $view->render('help::avatar_list', [
            'title' => $cat_name, 'page_title' => $cat_name,
            'data' => [
                'items' => $items, 'total' => $total,
                'pagination' => $tools->displayPagination('?act=avatars&id='.$id.'&', $start, $total, $per_page),
                'back_url' => '?act=avatars'
            ]
        ]);
    }
} else {
    // Главная: список всех категорий
    if ($isAdmin) {
        echo '<div class="card m-2 p-2 bg-light">
            <form action="?act=avatars" method="post">
                <div class="form-row">
                    <div class="col"><input type="text" name="folder_name" placeholder="Папка (eng)" class="form-control form-control-sm" required></div>
                    <div class="col"><input type="text" name="display_name" placeholder="Название (RU)" class="form-control form-control-sm" required></div>
                    <div class="col-auto"><button type="submit" name="add_cat" class="btn btn-sm btn-primary">Создать</button></div>
                </div>
            </form>
        </div>';
    }

    $dirs = glob(ASSETS_PATH . 'avatars/*', GLOB_ONLYDIR);
    $items = [];
    foreach ($dirs as $d) {
        $fid = basename($d);
        $nf = $d . '/name.txt';
        $items[] = [
            'url' => '?act=avatars&id=' . $fid,
            'name' => is_file($nf) ? file_get_contents($nf) : $fid,
            'count' => count(glob($d . '/*.png'))
        ];
    }

    echo $view->render('help::avatars', [
        'title' => $title, 'page_title' => $title,
        'data' => ['items' => $items, 'back_url' => '/']
    ]);
}
Всего: 263