【问题标题】:Syntax for multiple "or" statements to set a CSS class用于设置 CSS 类的多个“或”语句的语法
【发布时间】:2020-06-19 02:55:36
【问题描述】:

我对 PHP 很陌生。问题陈述是,我需要在特定页面的导航中插入一个 CSS 类。这是我现在的方式:

<nav class="navbar navbar-expand-md navbar-light fixed-top scrolling-navbar 
<?php if (basename($_SERVER['PHP_SELF']) === 'index.php' || basename($_SERVER['PHP_SELF']) === 'shop.php'  || basename($_SERVER['PHP_SELF']) === 'news.php') { echo "navbar-transparent"; } ?>
">

它有效,但感觉很乱。我将继续研究它(也许 switch 语句更好?)。有没有更清洁的方法?

【问题讨论】:

  • 我会将navbar-transparent 分配给一个变量,然后在class 列表中输出。那会更干净一些,并使用in_array
  • @user3783243 为了构建这种方法,您实际上可以定义一个类数组并输出它们。如果您有多个条件类,这可能特别有用。例如:$classes=["navbar", "navbar-expand-md", ... ]class="&lt;?= htmlentities(implode(' ', $classes)) ?&gt;"
  • @akenion - 你能再挑逗一下吗?我看到了它的发展方向,但希望获得更多信息。
  • @SteveShead 当然。这确实是一个简单的概念,我在各种场合都使用过,并且可以与复杂的条件类一起很好地工作(并且更容易阅读)。我会在另一个答案中写出来。

标签: php class if-statement insert switch-statement


【解决方案1】:

如果你想检查一个值是否在一个集合中,一个简单的选择是使用in_array 函数。

if(in_array(basename($_SERVER['PHP_SELF']), ['index.php', 'shop.php', 'news.php']))

【讨论】:

  • 那行得通-谢谢。不知道为什么我没有想到一个数组——我猜这对这个来说太新了! :)
【解决方案2】:

如果您正在处理更复杂的条件类或大量动态属性,您可以考虑在 PHP 数组中定义这些并动态构建整个类字符串,而不是使用各种内联条件。

例如:

<?php
$classes=["navbar", "navbar-expand-md", "navbar-light", "fixed-top", "scrolling-navbar"];
if(in_array(basename($_SERVER['PHP_SELF']), ['index.php', 'shop.php', 'news.php']))
    $classes[]="navbar-transparent"; //Equivalent to array_push($classes, "navbar-transparent")
?>
<nav class="<?= implode(' ', $classes) ?>"></nav>

您可以使用implode 将数组转换为以空格分隔的列表。如果类包含用户输入或其他有问题的值,您也应该使用htmlentities 来转义输出。

您甚至可以将所有属性构建为多维关联数组并输出。这种方法对于许多应用程序来说可能是多余的,但在例如更复杂的模板或组件框架中可能是实用的。

<?php
    function encodeAttributes(array $attributes): string{
        $encoded="";
        foreach($attributes as $key=>$value){
            $encoded.=' '.htmlentities($key);
            if($value!==null){ //Allow for attributes without values(for instance disabled or checked)
                if(is_array($value))
                    $value=implode(' ', $value);
                $encoded.='="'.htmlentities($value).'"';
            }
        }
        return $encoded;
    }
    $attributes=[
        "id"=>"main_nav",
        "class"=>["navbar", "navbar-expand-md", "navbar-light", "fixed-top", "scrolling-navbar"]
    ];
?>
<nav<?= encodeAttributes($attributes) ?>></nav>

【讨论】:

  • @SteveShead 这就是你要找的吗?
  • 是的 - 谢谢。我唯一的问题是当一个类被javascript注入时会发生什么?由于数组输出相同的东西有关系吗?例如,一旦您滚动页面,就会添加 top-nav-collapse 类以将背景颜色从透明更改为白色。
  • @SteveShead 这将与通过 JavaScript 注入的类完美配合;浏览器不会知道区别。这个 PHP 只是构建与直接编写完全相同的输出 HTML。对于第一个示例,浏览器只会看到:&lt;nav class="navbar navbar-expand-md navbar-light fixed-top scrolling-navbar navbar-transparent"&gt;&lt;/nav&gt; 所有服务器端处理对客户端都是完全透明的。
猜你喜欢
  • 2020-01-18
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
相关资源
最近更新 更多