【问题标题】:Seeking general advice: is there a better way to echo dynamic HTML than heredoc? (smarty / php / html)寻求一般建议:有没有比heredoc更好的方法来回显动态HTML? (聪明的/php/html)
【发布时间】:2012-07-13 13:42:13
【问题描述】:

项目:创建动态多页表单,根据不同情况以不同方式填充字段。

上下文: 使用 CMSMS 和 Smarty 标签将 PHP 插入到需要的页面中。表单的每一页都是使用一个 smarty 构建的

当前方法: 使用 smarty 标记,我正在编写以heredoc 表示法回显的大块HTML。当我到达需要动态生成的表单的一部分(例如下拉菜单)时,我会转义 heredoc,编写 PHP(使用标准 echo 函数生成该表单元素所需的 HTML),然后返回到 heredoc更多的 HTML 块。

怀疑:这是不雅、凌乱、乏味的,而且感觉不对。

请求:有更好的方法吗?

编辑:我当前设置的一个块的示例,在这里您可以看到一个初始的静态 HTML 块被回显 - (表单的开头和第一个问题)然后是一个需要动态生成的下拉菜单,具体取决于在 SESSION 变量中存在的数据上。在此之后,heredoc 恢复并回显更多静态 HTML:

echo <<<EOD
<form id="myform" method="post" action="?page=2">
<div class="myform">

<div class="formfield">
    <div class="question"><label for="sv_01">Question?</label> <input type="text" name="sv_01" value="$sv_01" size="10" maxlength="10" /></div>
        <div class="subquestion"><label for="sv_02">What Year?</label>
EOD;
                echo '<select  name="sv_02">';   
                $vars = array(
                '-Year' => 'Year',
                '-2012' => '2012', 
                '-2011' => '2011', 
                '-2010' => '2010', 
                '-2009' => '2009', 
                '-2008' => '2008', 
                '-2007' => '2007', 
                '-2006' => '2006', 
                '-2005' => '2005', 
                'Pre 2005' => 'Pre 2005', 
                );

                foreach($vars as $val => $name){
                    if($_SESSION['sv_02'] == $val){
                        echo '<option value="' . substr($val, 0, 1) . '" selected>' . $name . '</option>';
                    } else {
                        echo '<option value="' . substr($val, 0, 1) . '">' . $name . '</option>';
                    }
                }

                echo '</select></div>';
echo <<<EOD

    <div class="question"><br /> <label for="sv_04">Another question</label> <input type="text" name="sv_04" value="$sv_04" size="10" maxlength="10" />%</div>
        <div class="subquestion"><label for="sv_07">When was the data collected?</label> 
EOD;
                echo '<select  name="sv_07">';   
                $vars = array(
                '-Month' => 'Month',
                '-January' => 'January', 
                '-February' => 'February', 
                '-March' => 'March', 
                '-April' => 'April', 
                '-May' => 'May', 
                '-June' => 'June', 
                '-July' => 'July', 
                '-August' => 'August', 
                '-September' => 'September', 
                '-October' => 'October', 
                '-November' => 'November', 
                '-December' => 'December', 
                );

                foreach($vars as $val => $name){
                    if($_SESSION['sv_07'] == $val){
                        echo '<option value="' . substr($val, 0, 1) . '" selected>' . $name . '</option>';
                    } else {
                        echo '<option value="' . substr($val, 0, 1) . '">' . $name . '</option>';
                    }
                }

                echo '</select><select  name="sv_08">';

                $vars = array(
                '-Year' => 'Year',
                '-2012' => '2012', 
                '-2011' => '2011', 
                '-2010' => '2010', 
                '-2009' => '2009', 
                '-2008' => '2008', 
                '-2007' => '2007', 
                '-2006' => '2006', 
                '-2005' => '2005', 
                'Pre 2005' => 'Pre 2005', 
                );

                foreach($vars as $val => $name){
                    if($_SESSION['sv_08'] == $val){
                        echo '<option value="' . substr($val, 0, 1) . '" selected>' . $name . '</option>';
                    } else {
                        echo '<option value="' . substr($val, 0, 1) . '">' . $name . '</option>';
                    }
                }

                echo '</select></div>'; 

echo<<<EOD          


<div class="continue"><input type="submit" value="Continue" /></div>
</div>

</div>
</form>
EOD;

【问题讨论】:

    标签: php html smarty heredoc


    【解决方案1】:

    相对于标准的 HTML+PHP?这也适用于模板工具。

    public function render() {
    ?>
    <html>
        <head>
            <title><?= $this->title ?></title>
        </head>
        <body>
            <h1>This is my awesome page</h1>
    
            <p>Choose from a menu.</p>
            <?php $this->renderMenu() ?>
    
            <p>Or enter your details:</p>
            <?php $this->renderForm() ?>
        </body>
    </html>
    <?php
    }
    

    如果这不是您想要的,请显示一些代码。

    【讨论】:

    • 我已经添加了我的代码示例 - 我面临的问题是,据我所知,在 CMSMS 中,您使用用户定义的 smarty 标签将 php 插入到您的页面中。在这些用户定义的标签中,无法识别 语法,因此我无法轻松地退出和返回。
    • 我没有专门使用 Smarty,但您可以创建自定义标签来构建这些菜单,并且(我认为)仍然能够传入会话变量(选定值)。
    • 顺便说一句,这些下拉菜单有用吗?使用substr($val, 0, 1) 创建的&lt;option&gt; 值将全部为"-",除了最后一个条目获得"P"
    • 哦,是的 - 我更新了该代码,使用的是稍旧的版本,最初错误地将它设置为 0,1,而它应该只是 1 - 但谢谢!
    【解决方案2】:

    根据您对代码的描述(为什么您没有显示任何内容?)我怀疑代码有点类似于

    <?php
    
    $someVariable = "Hello < World";
    echo <<<FOO
     <!-- chunk of HTML -->
     {$someVariable}
     <!-- chunk of HTML -->
    FOO;
    
    // simulating some function calls
    echo str_repeat('A', 10);
    

    如果是这样,那么让我告诉你,这不是 Smarty。这只是heredoc(和引用的变量)。


    如果您将上述代码与数据库访问等内容分开,我看不到任何关于它的混乱。混乱会将输出生成与业务逻辑混合在一起。

    但对我(作为Smarty)开发人员来说,这确实看起来不优雅并且感觉不对。但这可能是一件主观的事情——习惯于模板解决方案的“优雅”,例如 SmartyTwigphpTALMustache(以及 50 亿个其他引擎)。

    这些库不仅仅只是生成 HTML。他们负责转义值(is 4 &lt; 5? 是无效的 HTML)。它们可以帮助您构建和组织模板。他们为你做缓存。他们已经看到了国际化。和。一种。所有的。很多。更多。

    【讨论】:

    • 很抱歉最初没有显示代码,认为可能会很痛苦!我对 smarty 完全陌生,如果我用错了这个词,很抱歉。情况是这样的:CMSMS 使用用户定义的 smarty 标签将代码插入页面。您可以直接输入 HTML,但要插入 PHP,您需要使用 smarty 标记。据我所知,在这些聪明的标签中,我不能使用 来逃避我的 php 并轻松地切换进出它,所以我不得不使用大量的回声。一方面它很笨重,另一方面它目前不起作用。
    • 模板解决方案 - 我不太了解这些是什么,但会阅读一些关于它们的内容 - 你知道它们是否会以我使用它的方式与 CMS 兼容,或者你会如果这意味着访问优雅的模板引擎,那么提倡完全放弃当前的方法?
    • 据我所知,CMSMS 与 Smarty 捆绑在一起。看看他们关于如何集成它的教程?
    • 将 PHP 添加到 Smarty 最好通过 plugins
    猜你喜欢
    • 2011-01-24
    • 2023-04-04
    • 1970-01-01
    • 2020-08-28
    • 2010-10-29
    • 2020-05-16
    • 2019-12-09
    • 2015-04-07
    • 1970-01-01
    相关资源
    最近更新 更多