Редактор темы

Реклама
Реклама
Реклама
Реклама

PHP-блоки

SusaPusa

Посетитель
Регистрация
5 Июн 2025
Сообщения
81
Рейтинг реакций
21
Баллы
8
1/3
Автор темы
Модуль позволяет безопасно вставлять PHP блоки в новостях DLE-21.
В модуле вставляешь PHP код, а вновость его Тег для статьи - [php-block=example] .
Снизу модуля видно на каких страницах вставлены - Теги для статьи и их можно включить или выключить,
и так через него можно вставлять всё что хочется. Файлы движка DLE не изменяет.
PHP:
date_default_timezone_set('Europe/Kyiv');

$time = date('H:i:s');
$today = date('d.m.Y');
$year = date('Y');
$php = PHP_VERSION;
$memory = ini_get('memory_limit');
$upload = ini_get('upload_max_filesize');
$server = $_SERVER['SERVER_SOFTWARE'] ?? 'Неизвестно';
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';

$extensions = [
    'PDO MySQL' => extension_loaded('pdo_mysql'),
    'cURL' => extension_loaded('curl'),
    'GD' => extension_loaded('gd'),
    'mbstring' => extension_loaded('mbstring'),
    'OpenSSL' => extension_loaded('openssl'),
    'JSON' => extension_loaded('json'),
    'OPcache' => extension_loaded('Zend OPcache')
];

$passed = count(array_filter($extensions));
$total = count($extensions);
$percentage = round($passed / $total * 100);

echo '<style>
.dle-dashboard {
    --bg: #10172b;
    --card: #1c2741;
    --border: rgba(255,255,255,.09);
    --muted: #a9b6d2;
    --green: #39e5b3;
    font-family: system-ui, Arial, sans-serif;
    color: #fff;
    background:
      radial-gradient(circle at top left, #30235c, transparent 42%),
      radial-gradient(circle at bottom right, #104c5a, transparent 42%),
      var(--bg);
    padding: 35px;
    border-radius: 24px;
    line-height: 1.5;
}
.dle-dashboard * { box-sizing: border-box; }
.dle-dashboard .header {
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 12px;
    align-items: center;
    margin-bottom: 28px;
}
.dle-dashboard .brand {
    font-size: 25px;
    font-weight: 800;
}
.dle-dashboard .brand span { color: #ab97ff; }
.dle-dashboard .status {
    background: #123e37;
    color: #4af3bb;
    border: 1px solid #286e5e;
    border-radius: 30px;
    padding: 7px 15px;
    font-size: 13px;
}
.dle-dashboard .hero {
    background: linear-gradient(125deg,#5143a5,#192e54 75%);
    padding: 40px;
    border: 1px solid var(--border);
    border-radius: 22px;
    margin-bottom: 22px;
}
.dle-dashboard .hero h1 {
    font-size: clamp(28px,4vw,44px);
    line-height: 1.2;
    margin: 0 0 15px;
    color: #fff;
}
.dle-dashboard .hero p {
    color: #d2daf4;
    max-width: 650px;
    margin: 0;
}
.dle-dashboard .grid {
    display: grid;
    grid-template-columns: repeat(3,minmax(0,1fr));
    gap: 16px;
}
.dle-dashboard .card {
    background: rgba(30,42,70,.93);
    border: 1px solid var(--border);
    border-radius: 18px;
    padding: 23px;
    min-width: 0;
    transition: transform .25s, border-color .25s;
}
.dle-dashboard .card:hover {
    transform: translateY(-4px);
    border-color: #7865e7;
}
.dle-dashboard .label {
    color: var(--muted);
    font-size: 13px;
    margin-bottom: 12px;
}
.dle-dashboard .value {
    font-size: clamp(19px,2.8vw,29px);
    font-weight: 800;
    overflow-wrap: anywhere;
    font-variant-numeric: tabular-nums;
}
.dle-dashboard .detail {
    color: var(--muted);
    margin-top: 8px;
    font-size: 12px;
}
.dle-dashboard h2 {
    font-size: 23px;
    color: #fff;
    margin: 32px 0 16px;
}
.dle-dashboard .checks {
    display: grid;
    grid-template-columns: repeat(3,minmax(0,1fr));
    gap: 12px;
}
.dle-dashboard .check {
    background: rgba(255,255,255,.055);
    border: 1px solid var(--border);
    border-radius: 12px;
    padding: 14px;
    display: flex;
    justify-content: space-between;
    gap: 10px;
}
.dle-dashboard .ok { color: #39e5b3; font-weight: bold; }
.dle-dashboard .bad { color: #ff8796; font-weight: bold; }
.dle-dashboard .progress {
    height: 9px;
    background: #34405d;
    border-radius: 20px;
    overflow: hidden;
    margin-top: 17px;
}
.dle-dashboard .progress-fill {
    height: 100%;
    background: linear-gradient(90deg,#8070ff,#39e5b3);
    border-radius: inherit;
}
.dle-dashboard .btn {
    display: inline-block;
    background: linear-gradient(110deg,#7f64ff,#319dd8);
    color: #fff;
    border: 0;
    border-radius: 12px;
    padding: 12px 22px;
    font: inherit;
    font-weight: 700;
    cursor: pointer;
    margin: 10px 10px 0 0;
    transition: filter .2s;
}
.dle-dashboard .btn:hover { filter: brightness(1.2); }
.dle-dashboard .result {
    margin-top: 14px;
    color: #65f0c1;
    min-height: 24px;
}
.dle-dashboard .footer {
    text-align: center;
    color: var(--muted);
    font-size: 12px;
    margin-top: 35px;
}
@media(max-width:800px) {
    .dle-dashboard .grid {
        grid-template-columns: repeat(2,minmax(0,1fr));
    }
    .dle-dashboard .checks {
        grid-template-columns: repeat(2,minmax(0,1fr));
    }
}
@media(max-width:540px) {
    .dle-dashboard { padding: 18px; }
    .dle-dashboard .hero { padding: 25px; }
    .dle-dashboard .grid,
    .dle-dashboard .checks {
        grid-template-columns: 1fr;
    }
}
</style>';

echo '<div class="dle-dashboard" id="dle-test-panel">';

echo '<div class="header">
    <div class="brand">◆ DLE <span>Control Center</span></div>
    <div class="status">● PHP работает</div>
</div>';

echo '<div class="hero">
    <h1>🚀 Добро пожаловать!</h1>
    <p>Современная тестовая панель DataLife Engine.
    Здесь можно проверить сервер, PHP, расширения,
    JavaScript и оформление сайта.</p>
</div>';

echo '<div class="grid">';

echo '<div class="card">
    <div class="label">🕒 Время Киева</div>
    <div class="value" id="dle-clock">' . htmlspecialchars($time, ENT_QUOTES, 'UTF-8') . '</div>
    <div class="detail" id="dle-date">' . htmlspecialchars($today, ENT_QUOTES, 'UTF-8') . '</div>
</div>';

echo '<div class="card">
    <div class="label">⚡ Версия PHP</div>
    <div class="value">' . htmlspecialchars($php, ENT_QUOTES, 'UTF-8') . '</div>
    <div class="detail">Установленная версия</div>
</div>';

echo '<div class="card">
    <div class="label">🌐 Домен сайта</div>
    <div class="value">' . htmlspecialchars($host, ENT_QUOTES, 'UTF-8') . '</div>
    <div class="detail">Адрес текущего сайта</div>
</div>';

echo '<div class="card">
    <div class="label">🖥 Веб-сервер</div>
    <div class="value">' . htmlspecialchars($server, ENT_QUOTES, 'UTF-8') . '</div>
    <div class="detail">Программное обеспечение</div>
</div>';

echo '<div class="card">
    <div class="label">💾 Лимит памяти</div>
    <div class="value">' . htmlspecialchars((string)$memory, ENT_QUOTES, 'UTF-8') . '</div>
    <div class="detail">Максимальная память PHP</div>
</div>';

echo '<div class="card">
    <div class="label">📤 Загрузка файлов</div>
    <div class="value">' . htmlspecialchars((string)$upload, ENT_QUOTES, 'UTF-8') . '</div>
    <div class="detail">Максимальный размер файла</div>
</div>';

echo '</div>';

echo '<h2>🔍 Диагностика расширений</h2>';

echo '<div class="card">
    <div class="label">Успешно пройдено проверок</div>
    <div class="value">' . $passed . ' из ' . $total . '</div>
    <div class="progress">
        <div class="progress-fill" style="width:' . $percentage . '%"></div>
    </div>
</div>';

echo '<div class="checks" style="margin-top:16px;">';

foreach ($extensions as $name => $enabled) {
    $statusClass = $enabled ? 'ok' : 'bad';
    $statusText = $enabled ? '✓ OK' : '✕ Нет';

    echo '<div class="check">
        <span>' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '</span>
        <span class="' . $statusClass . '">' . $statusText . '</span>
    </div>';
}

echo '</div>';

echo '<h2>🧪 Интерактивные тесты</h2>';

echo '<div class="card">
    <div style="font-size:19px;font-weight:750;">
        🎉 Панель успешно загружена!
    </div>
    <p style="color:#a9b6d2;">
        Нажми на кнопки и проверь работу JavaScript
        и обновление часов.
    </p>
    <button class="btn" type="button" id="dle-js-test">
        ⚡ Проверить JavaScript
    </button>
    <button class="btn" type="button" id="dle-time-test">
        🕒 Показать время
    </button>
    <div class="result" id="dle-result" aria-live="polite"></div>
</div>';

echo '<div class="footer">
    DLE Control Center · PHP ' . htmlspecialchars($php, ENT_QUOTES, 'UTF-8') . ' · ' . $year . '
</div>';

echo '</div>';

echo '<script>
(function () {
    var panel = document.getElementById("dle-test-panel");
    if (!panel) return;

    var clock = panel.querySelector("#dle-clock");
    var date = panel.querySelector("#dle-date");
    var result = panel.querySelector("#dle-result");

    var startingTime = ' . json_encode(
        date('Y-m-d\TH:i:sP'),
        JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT
    ) . ';

    var initialTime = new Date(startingTime).getTime();
    var startedAt = Date.now();

    function updateClock() {
        var now = new Date(initialTime + Date.now() - startedAt);

        clock.textContent = new Intl.DateTimeFormat("ru-RU", {
            timeZone: "Europe/Kyiv",
            hour: "2-digit",
            minute: "2-digit",
            second: "2-digit",
            hour12: false
        }).format(now);

        date.textContent = new Intl.DateTimeFormat("ru-RU", {
            timeZone: "Europe/Kyiv",
            day: "2-digit",
            month: "2-digit",
            year: "numeric"
        }).format(now);
    }

    updateClock();
    var timer = setInterval(function () {
        if (!document.body.contains(panel)) {
            clearInterval(timer);
            return;
        }
        updateClock();
    }, 1000);

    panel.querySelector("#dle-js-test").addEventListener("click", function () {
        result.textContent = "✅ JavaScript работает отлично!";
    });

    panel.querySelector("#dle-time-test").addEventListener("click", function () {
        updateClock();
        result.textContent = "🕒 Текущее время: " + clock.textContent;
    });
})();
</script>';

Простая установка через админку DLE-21 - Управление плагинами - Загрузить плагин.
 

Вложения

Последнее редактирование:

Норм, но в примере есть критичные ошибки — в таком виде код не запустится.

Что поправить:

  • $extensions = ; — синтаксическая ошибка.
  • $_SERVER ?? '...' вернёт массив, а htmlspecialchars() ждёт строку.
  • Если $total = 0, будет деление на ноль.
  • Если блок вставить несколько раз на странице — будут дубли id.
  • PHP-блоки реально безопасны только если доступ к созданию/редактированию есть строго у админа.

Минимально исправленный верх кода:

PHP:
date_default_timezone_set('Europe/Kyiv');

$time = date('H:i:s');
$today = date('d.m.Y');
$year = date('Y');
$php = PHP_VERSION;
$memory = ini_get('memory_limit');
$upload = ini_get('upload_max_filesize');

$server = $_SERVER['SERVER_SOFTWARE'] ?? 'Неизвестно';
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';

$extensions = [
 'mysqli' => extension_loaded('mysqli'),
 'mbstring' => extension_loaded('mbstring'),
 'gd' => extension_loaded('gd'),
 'curl' => extension_loaded('curl'),
 'zip' => extension_loaded('zip'),
 'json' => extension_loaded('json'),
 'openssl' => extension_loaded('openssl'),
 'fileinfo' => extension_loaded('fileinfo'),
];

$passed = count(array_filter($extensions));
$total = count($extensions);
$percentage = $total > 0 ? round($passed / $total * 100) : 0;

И вместо этого:

PHP:
$server = $_SERVER ?? 'Неизвестно';
$host = $_SERVER ?? 'localhost';

обязательно использовать строки, как выше.

По модулю в целом: идея полезная, особенно если теги можно включать/выключать по новостям. Но я бы добавил:

  • права доступа только для группы админов;
  • логирование: кто создал/изменил PHP-блок;
  • отключение выполнения блока при ошибке PHP;
  • кнопку быстрого выключения всех блоков;
  • проверку, где именно тег используется;
  • резервную копию блока перед редактированием.

Если хочешь — могу сразу набросать структуру install.xml для DLE-плагина под такой модуль.
 
Автор темы
@Ai Да, так будет лучше.
Нужно будет ещё доделывать.
Я думал что он вообще не заработает, а он заработал!
Codex - 6 Astra рулит.
 
Да, так будет лучше.
Нужно будет ещё доделывать.
Я думал что он вообще не заработает, а он заработал!
Codex - 6 Astra рулит.

Да, для первого запуска — отлично. Главное, что базовая связка уже работает: модуль → PHP-блок → тег в новости → вывод на сайте.

Но перед нормальным релизом я бы обязательно допилил:

  • Права доступа — только админам, без доступа модераторам/редакторам.
  • Логи изменений — кто создал/изменил/отключил блок.
  • Статус блока — включен/выключен.
  • Проверку синтаксиса PHP перед сохранением.
  • Защиту от падения сайта — если блок с ошибкой, он не должен валить всю страницу.
  • Список новостей, где используется тег — у тебя это уже частично есть, нужно развить.
  • Бэкапы версий блока перед каждым сохранением.
  • Кнопку аварийного отключения всех PHP-блоков.

И ещё важный момент: лучше не давать пользователю вставлять сам тег вручную как попало, а сделать генерацию вида:

PHP:
{phpblock id="1"}

или

PHP:
[phpblock=1]

Так проще искать, отключать и контролировать блоки.

Codex хорошо набросал основу, но модуль такого типа надо аккуратно довести по безопасности, потому что PHP-блоки — это фактически выполнение кода из админки. Для личного проекта норм, для публичной раздачи — обязательно допиливать защиту.
 

Похожие темы Последние темы Популярные темы

Назад
Сверху