Инструменты пользователя

Инструменты сайта


software:development:demo:cms:ucms:creating_sample_install_php_edit_colors_comment

Комментарии Файл edit_colors.php

edit_colors.php
<?php
/**
 * Редактор цветов для install.css
 * Центрированное окно 700px, работа с default_install.css, без JS.
 */
 
$cssDir      = __DIR__ . '/css/';             // Путь к директории со стилями
$cssFile     = $cssDir . 'install.css';        // Путь к рабочему файлу CSS
$defaultFile = $cssDir . 'default_install.css'; // Путь к эталонному файлу (бэкапу)
$message     = '';                             // Переменная для вывода уведомлений пользователю
 
// 1. Карта соответствия цветов и названий элементов (HEX => Понятное имя)
$colorNames = [
    '#f4f7f6' => 'Фон страницы',
    '#333'    => 'Основной текст',
    '#808080' => 'Цвет заголовка',
    '#e3ffec' => 'Фон карточки',
    '#bddbc5' => 'Линии таблицы',
    '#2e7d32' => 'Текст статуса ОК',
    '#666'    => 'Цвет ссылок и подсказок',
    '#ffdce0' => 'Фон блока ошибки',
    '#d32f2f' => 'Текст ошибки и акценты',
    '#888'    => 'Текст подвала (footer)',
    '#f9f9f9' => 'Фон строк редактора'
];
 
// 2. Обработка действий формы при отправке данных (метод POST)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
 
    // Если нажата кнопка "Сохранить"
    if (isset($_POST['save'])) {
        $currentCss = file_get_contents($cssFile); // Читаем текущее содержимое CSS
        foreach ($_POST['colors'] as $oldColor => $newColor) { // Перебираем массив измененных цветов
            // Проверяем через регулярное выражение, является ли введенная строка HEX-кодом
            if (preg_match('/^#[a-fA-F0-9]{3,6}$/', $newColor)) {
                // Заменяем старый код цвета на новый во всем тексте CSS
                $currentCss = str_replace($oldColor, $newColor, $currentCss);
            }
        }
        file_put_contents($cssFile, $currentCss); // Записываем обновленный CSS обратно в файл
        $message = '<span style="color: #2e7d32;">Изменения сохранены!</span>'; // Успешное сообщение
    } 
 
    // Если нажата кнопка "Цвет по умолчанию" (сброс)
    elseif (isset($_POST['reset'])) {
        if (file_exists($defaultFile)) { // Проверяем, существует ли эталонный файл
            copy($defaultFile, $cssFile); // Копируем содержимое эталона в рабочий файл
            $message = '<span style="color: #1976d2;">Восстановлены цвета по умолчанию.</span>';
        } else {
            $message = '<span style="color: #d32f2f;">Ошибка: файл default_install.css не найден!</span>';
        }
    } 
 
    // Если нажата кнопка "Отмена"
    elseif (isset($_POST['cancel'])) {
        header("Location: install.php"); // Перенаправляем пользователя на главную страницу установки
        exit; // Прекращаем выполнение скрипта
    }
}
 
// 3. Извлечение уникальных HEX-цветов из текущего рабочего CSS
$cssContent = file_exists($cssFile) ? file_get_contents($cssFile) : ''; // Читаем файл, если он есть
// Ищем все вхождения HEX-кодов цветов (от 3 до 6 символов после решетки)
preg_match_all('/#[a-fA-F0-9]{3,6}/', $cssContent, $matches);
// Оставляем только уникальные значения, чтобы не выводить один цвет дважды
$uniqueColors = array_unique($matches[0] ?? []); 
?>
 
 
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Редактирование цветов: install.css</title>
    <style>
    /* Стили для всей страницы */
    body { 
        background: #f0f2f5; /* Светло-голубой фон страницы (как в современных интерфейсах) */
        /* Список системных шрифтов для максимально быстрой загрузки и четкости */
        font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif; 
        margin: 0;           /* Убираем стандартные внешние отступы браузера */
        padding: 20px;       /* Внутренний отступ от краев экрана для контента */
    }
 
    /* Основное окно редактора (белая карточка) */
    .editor-window {
        width: 100%;         /* По умолчанию занимает всю доступную ширину */
        max-width: 700px;    /* Но не раздвигается шире 700 пикселей */
        margin: 0 auto;      /* Центрируем блок по горизонтали */
        background: #ffffff; /* Чисто белый фон карточки */
        padding: 20px;       /* Отступ от рамки до содержимого внутри */
        border-radius: 8px;  /* Скругление углов (8px — современный стандарт) */
        box-shadow: 0 10px 25px rgba(0,0,0,0.1); /* Мягкая тень для эффекта глубины */
        box-sizing: border-box; /* Чтобы padding не увеличивал общую ширину блока */
    }
 
    /* Заголовок внутри окна */
    h3 { 
        margin: 0 0 10px 0;  /* Обнуляем отступ сверху, оставляем 10px снизу */
        font-size: 18px;     /* Размер шрифта */
        color: #333;         /* Почти черный цвет текста */
        text-align: center;  /* Выравнивание по центру */
    }
 
    /* Сообщение о статусе сохранения/ошибке */
    .status-msg { 
        margin-bottom: 20px; /* Отступ до начала списка цветов */
        font-size: 14px;     /* Размер шрифта текста сообщения */
        font-weight: bold;   /* Делаем текст жирным для акцента */
        text-align: center;  /* Текст по центру */
    }
 
    /* Ряд с настройкой одного цвета */
    .color-row {
        display: flex;       /* Включаем гибкую верстку в строку */
        align-items: center; /* Выравниваем все элементы (превью, текст, инпут) по центру высоты */
        background: #f9f9f9; /* Очень светлый серый фон для каждой строки */
        margin-bottom: 8px;  /* Расстояние между строками */
        padding: 12px 15px;  /* Внутренние отступы внутри строки */
        border-radius: 5px;  /* Скругление углов строки */
        border: 1px solid #eee; /* Тонкая светлая рамка */
    }
 
    /* Маленький квадрат для предпросмотра цвета */
    .preview-box {
        width: 35px;         /* Фиксированная ширина */
        height: 25px;        /* Фиксированная высота */
        border: 1px solid #ccc; /* Серая рамка вокруг цвета */
        margin-right: 15px;  /* Отступ справа до названия */
        flex-shrink: 0;      /* Запрещаем браузеру сжимать квадрат при нехватке места */
    }
 
    /* Название редактируемого элемента */
    .label-text { 
        flex-grow: 1;        /* Занимает всё свободное пространство в строке */
        font-size: 14px;     /* Размер шрифта названия */
        color: #444;         /* Темно-серый цвет */
    }
 
    /* Поле ввода HEX-кода */
    input[type="text"] {
        width: 100px;        /* Фиксированная ширина поля */
        padding: 8px;        /* Внутренний отступ текста внутри поля */
        border: 1px solid #ccc; /* Серая рамка */
        border-radius: 4px;  /* Слегка скругленные углы */
        font-family: monospace; /* Моноширинный шрифт (как в коде) */
        text-align: center;  /* Текст внутри поля по центру */
    }
 
    /* Сетка для кнопок внизу */
    .button-group { 
        margin-top: 25px;    /* Отступ сверху от списка цветов */
        display: grid;       /* Включаем сетку */
        grid-template-columns: 1fr 1fr 1fr; /* Три равные колонки для кнопок */
        gap: 10px;           /* Расстояние между кнопками */
    }
 
    /* Общие стили для всех кнопок */
    button { 
        padding: 12px 5px;   /* Внутренние отступы (высота и ширина) */
        border: none;        /* Убираем стандартную рамку кнопки */
        border-radius: 4px;  /* Скругление углов */
        color: #fff;         /* Белый цвет текста */
        font-size: 13px;     /* Размер шрифта на кнопках */
        cursor: pointer;     /* Указатель мыши при наведении (палец) */
        width: 100%;         /* Кнопка занимает всю ширину своей колонки */
    }
 
    /* Индивидуальные цвета кнопок */
    .btn-save { background: #2e7d32; }   /* Зеленый фон для "Сохранить" */
    .btn-default { background: #1976d2; }/* Синий фон для "По умолчанию" */
    .btn-cancel { background: #d32f2f; }  /* Красный фон для "Отмена" */
 
    /* ПРАВИЛА ДЛЯ УЗКИХ ЭКРАНОВ (смартфоны до 600px) */
    @media (max-width: 600px) {
        .color-row {
            flex-wrap: wrap; /* Разрешаем элементам внутри строки переноситься на новую */
            justify-content: space-between;
        }
 
        .label-text {
            /* Занимает всю ширину за вычетом ширины квадрата превью */
            width: calc(100% - 60px); 
            margin-bottom: 10px; /* Отступ снизу перед инпутом */
        }
 
        input[type="text"] {
            width: 100%;     /* Инпут растягивается на всю ширину на новой строке */
            margin-top: 5px; /* Дополнительный отступ сверху */
        }
 
        .button-group {
            grid-template-columns: 1fr; /* Перестраиваем кнопки в одну колонку (одна под другой) */
        }
    }
</style>
 
 
 
</head>
<body>
 
<!-- Основной контейнер-оболочка (белое центрированное окно) -->
<div class="editor-window">
    <!-- Заголовок окна редактора -->
    <h3>Редактирование цветов: install.css</h3>
 
    <!-- Блок для вывода системных сообщений (например, "Изменения сохранены") -->
    <div class="status-msg"><?= $message ?></div>
 
    <!-- Форма для отправки данных методом POST на этот же скрипт -->
    <form method="POST">
 
        <?php if (empty($uniqueColors)): ?>
            <!-- Если массив цветов пуст (например, файл пустой или в нем нет HEX-кодов) -->
            <p>Цвета в файле не обнаружены.</p>
        <?php else: ?>
 
            <!-- Перебор найденных уникальных HEX-кодов цветов -->
            <?php foreach ($uniqueColors as $color): ?>
                <div class="color-row">
                    <!-- Квадратик предпросмотра: подставляем текущий цвет в атрибут style -->
                    <div class="preview-box" style="background: <?= $color ?>;"></div>
 
                    <div class="label-text">
                        <?php 
                            // Проверяем, есть ли понятное название для этого цвета в нашем словаре.
                            // strtolower нужен для совпадения ключей, если в CSS цвет написан как #FFF, а в массиве #fff.
                            echo isset($colorNames[strtolower($color)]) ? $colorNames[strtolower($color)] : "Цвет $color"; 
                        ?>:
                    </div>
 
                    <!-- Поле ввода: в атрибут name передаем исходный цвет как ключ, чтобы знать, что заменять в файле -->
                    <input type="text" name="colors[<?= $color ?>]" value="<?= $color ?>">
                </div>
            <?php endforeach; ?>
 
        <?php endif; ?>
 
        <!-- Нижний блок с управляющими кнопками -->
        <div class="button-group">
            <!-- Кнопка сохранения (отправляет массив измененных цветов) -->
            <button type="submit" name="save" class="btn-save">Сохранить</button>
 
            <!-- Кнопка сброса (запускает копирование из default_install.css) -->
            <button type="submit" name="reset" class="btn-default">Цвет по умолчанию</button>
 
            <!-- Кнопка отмены (выполняет редирект обратно на страницу установки) -->
            <button type="submit" name="cancel" class="btn-cancel">Отмена</button>
        </div>
    </form>
</div>
 
 
</body>
</html>
Только авторизованные участники могут оставлять комментарии.
software/development/demo/cms/ucms/creating_sample_install_php_edit_colors_comment.txt · Последнее изменение: VladPolskiy

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki