使用连接在 HTML 标记内回显 PHP 函数和条件

Echo a PHP function with condition inside HTML tag using concatenation

这是我的第一个问题。

  • 我正在使用 <li> 构建一个简单的动态菜单
  • 我正在开发基于 PHP 的 CMS (Kirby)
  • Kirby 预定义了 PHP 个函数(助手)

    我正在尝试为网站上的每个页面输出一个 <li>

    <li class='active'><a href='page1'></a></li>
    <li><a href='page2'></a></li>
    <li><a href='page3'></a></li>
    ...
    

    我使用 PHP 函数 e($condition, $value) 仅在该页面 isOpen()

    时设置菜单项的样式
    // I need help here
    <?php 
        foreach ($pages->visible() as $p): 
        echo "<li" . e($p->isOpen(), ' class="active"') . "><a href='" . $p->url() . "'></a></li>";
        endforeach; 
    ?> 
    

    功能正常,但 css 部分 class="active" 在最终代码 <li> 之外打印

    class="active"
    <li>...</li>
    <li>...</li>
    <li>...</li>
    

    我以前的代码运行良好,但由于我使用的是 display: inline-block,菜单在每个块之间有 spaces,因为以下代码将每个 <li>换行。

    // This code works
    <?php foreach($pages->visible() as $p): ?>
    <li <?php e($p->isOpen(), ' class="active"') ?> ><a href="<?php echo $p->url() ?>"></a></li>
    <?php endforeach ?>
    

    我重写代码的原因是删除 inline: block 元素之间的白色 space。

    我未能以函数工作的方式连接字符串并将其结果打印在 <li> 标记内。

    我在这里搜索过,并且在 php.net 中阅读了很多文档,但对我没有任何帮助,我为此苦苦挣扎了 2 天。

    我期待更好地学习如何以及何时使用连接和字符串运算符。

  • 问题是Kirby的e()函数在例程中已经有了echo,而不是简单的返回值。

    http://getkirby.com/docs/cheatsheet/helpers/e

    如果您将输出循环更改为更像这样的内容,分别回显,您将获得所需顺序的结果:

    foreach($pages->visible() as $p) 
    {
        echo "<li";
        e($p->isOpen(), ' class="active"');
        echo "> and the rest of your line </li>";
    }
    

    也就是说,在这种情况下使用 e() 可能不是最优雅的方法。也许试试 r() 函数:

    http://getkirby.com/docs/cheatsheet/helpers/r

    foreach($pages->visible() as $p)
    {
        echo "<li ".r($p->isOpen(), ' class="active"').">more text</li>";
    }