Синтаксис для нескольких операторов "или" для установки класса CSS - PullRequest
0 голосов
/ 19 июня 2020

Я новичок в PHP. Проблема состоит в том, что мне нужно вставить класс CSS в навигацию на определенных страницах c. Вот как у меня это сейчас есть:

<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?). Есть ли более чистый способ сделать это?

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Если вы хотите проверить, входит ли значение в набор, простой вариант - использовать функцию in_array.

if(in_array(basename($_SERVER['PHP_SELF']), ['index.php', 'shop.php', 'news.php']))
1 голос
/ 19 июня 2020

Если вы имеете дело с более сложными условными классами или множеством динамических c атрибутов, вы можете рассмотреть возможность определения их в 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 , а также для экранирования вывода.

Вы можете даже go, чтобы построить все ваши атрибуты как многомерный ассоциативный массив и вывести его. Этот подход, вероятно, является чрезмерным для многих приложений, но может быть практичным, например, в более сложной структуре шаблонов или компонентов.

<?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>
...