当所有单独的主题颜色都定义为文件中的 PHP 变量时,如何使用 PHP 更改主题?

Howto change a theme using PHP when all separate theme colors are defined as PHP variables in a file?

我已经创建了一个自己的 PHP 框架来构建网站。我开始在名为 "definitions.php" 的文件中定义一些基本变量。在其中的其他配置中,我还通过 PHP 变量定义了配色方案,这些变量在其他 PHP 文件中使用,这些文件加载​​“definition.php(例如在 '')。

definitions.php:

    <?php
    [lots of variable-based definitions not interesting here]

    // Color Composition 02 (#F0F8FF - AliceBlue)
    /*
    $DARK_MODE             = 0;
    $SECURITY_MODE         = 'multi';
    $DATE_COLOR            = '#FFD700';
    $RESP_COLOR            = '#FFD700';
    $TD_COLOR_LEFT         = '#F0F8FF';
    $TD_COLOR_RIGHT        = '#F0F8FF';
    $TR_COLOR_RIGHT        = '#F0F8FF';
    $TR_COLOR_RIGHT_02     = '#F0F8FF';
    $TD_COLOR_INSIDE_EMPTY = '#F0F8FF';
    $BORDER_TABLE          = '0px';
    $DATA_COLOR            = '#F0F8FF';
    $FOREGR_COLOR          = 'lightgray';
    $REV_COLOR             = 'lightgreen';
    $OBLIG_COLOR           = 'lightblue';
    $INPUT_BG_COLOR        = 'lightgray';
    $INPUT_COLOR           = 'blue';
    $INPUT_WEIGHT          = 'normal'; // 'bold';
    $MENU_SURROUND_COLOR   = '#302D26';
    $SPINNER_COLOR         = '#4D4B48';
    $HR_COLOR              = 'darkgray';
    $BODY_MARGIN_TOP       = '5px';
    */

    // Color Composition 03 (#F0F8FF - Night Mode / Dark Mode)
    $DARK_MODE             = 1;
    $SECURITY_MODE         = 'single';
    $DATE_COLOR            = '#4D4B48';
    $RESP_COLOR            = '#4D4B48';
    $TD_COLOR_LEFT         = '#4D4B48';
    $TD_COLOR_RIGHT        = '#302D26';
    $TR_COLOR_RIGHT        = '#302D26';
    $TR_COLOR_RIGHT_02     = '#F0F8FF';
    $TD_COLOR_INSIDE_EMPTY = '#4D4B48';
    $BORDER_TABLE          = '0px';
    $DATA_COLOR            = '#4D4B48'; // '#302D26';
    $FOREGR_COLOR          = 'lightgray';
    $REV_COLOR             = 'lightgreen';
    $OBLIG_COLOR           = 'lightblue';
    $INPUT_BG_COLOR        = 'lightgray';
    $INPUT_COLOR           = 'blue';
    $INPUT_WEIGHT          = 'normal'; // 'bold';
    $MENU_SURROUND_COLOR   = '#302D26';
    $SPINNER_COLOR         = '#4D4B48';
    $HR_COLOR              = 'darkgray';
    $BODY_MARGIN_TOP       = '5px';
?>

arbitrary.php:

    <?php
        error_reporting(-1);
        //ini_set('display_errors', 'On');

        ob_start();
        require_once('definitions.php');
    ?>

    [HTML-Code, CSS and JavaScript file import etc. plus PHP conditions]

    <body style="background-color: <?= $DATA_COLOR ?>; color: <?= $FOREGR_COLOR ?>; margin-top: <?= $BODY_MARGIN_TOP ?>;">

    [more HTML, more PHP]

由于所有主题 - 如此称呼 - 深色模式/夜间模式的定义都作为变量包含在文件 "definitions.php" 中,我想让用户能够选择这样的主题并将其保存在她的文件中/ 数据库设置中自己的用户参数。

现在,如您所见,这些颜色变量定义中的第一个被注释掉了。只有黑暗模式处于活动状态。我这样做是因为我最近才向这个文件添加了几种配色方案。

我现在想做的是在我的 PHP GUI 上向用户展示一个按钮/下拉选项,她/他可以从中选择几个这样的主题意义上的配色方案,如所解释的.显然,这不适用于未注释的配色方案。我的想法是这样的:

    <?php
        if user decides for AliceBlue then
            activate these color variables and save them in her / his user parameters
        elseif user decides for Dark Mode then
            activate those color variables and save them respectively
    ?>

另一点要注意的是,我的系统是一个多用户框架,只有一个应用程序文件服务器包含整个框架。因此,只能有一个通用文件 "definitions.php".

有没有办法在给定条件下处理这个问题?

创建一个按钮,该按钮使用 "dark" 或 "light" 主题中的一个参数向自身发送 ajax 请求。 然后在文件的开头检查用户选择的主题并将其保存在会话中。 使用普通的 if 语句检查 "theme" 用户从中选择并加载这些值。

使用您现有的框架,只需保存用户的首选项 aliceblue 或数据库 and/or 会话变量中的任何内容,然后将其用于 select 来自 [=14= 中的数组]:

// Color Composition 02 (#F0F8FF - AliceBlue)
$THEME['aliceblue']['DARK_MODE']     = 0;
$THEME['aliceblue']['SECURITY_MODE'] = 'multi';
//etc...

// Color Composition 03 (#F0F8FF - Night Mode / Dark Mode)
$THEME['nightmode']['DARK_MODE']     = 1;
$THEME['nightmode']['SECURITY_MODE'] = 'single';
//etc...

然后分配:

$pref          = //users preference
$DARK_MODE     = $THEME[$pref]['DARK_MODE'];
$SECURITY_MODE = $THEME[$pref]['SECURITY_MODE'];
//etc...

//or extract vars from the proper array
extract($THEME[$pref]);

或者,您可以在开关中定义它们:

$pref = //users preference

switch($pref) {

    // Color Composition 02 (#F0F8FF - AliceBlue)    
    case 'aliceblue':
        $DARK_MODE     = 0;
        $SECURITY_MODE = 'multi';
        //etc...
        break;

    // Color Composition 03 (#F0F8FF - Night Mode / Dark Mode)    
    case 'nightmode':    
        $DARK_MODE     = 1;
        $SECURITY_MODE = 'single';
        //etc...
        break;
}

我认为你在这方面走错了路。使用 php 动态生成主题是一个非常糟糕的主意。

首先,如果您正在开发 php 框架(或任何后端框架),该框架的代码不应该知道任何 UI 细节。或者您使用了错误的术语来描述您正在制作的东西。

至于主题,有相应的工具:您应该查看 SASS/SCSS。 UI 主题应该由专门用于此目的的技术来处理。


如果我没猜错的话,你是在混淆 "framework" 和 "cms" 这样的东西。另外,我觉得您仍在 include oriented 范式中工作。

哦 .. require 不是函数。

并停止在 php 文件末尾使用 ?>:这通常会导致 "header already sent" 错误。