2

プロジェクト:さまざまな状況に応じてさまざまな方法でフィールドにデータを入力する動的なマルチページフォームを作成します。

コンテキスト: CMSMSおよびSmartyタグを使用して、必要なページにPHPを挿入します。フォームの各ページは、1つのsmartyを使用して作成されています

現在の方法: smartyタグを使用して、ヒアドキュメント表記でエコーされたHTMLの大きなチャンクを記述しています。動的に生成する必要のあるフォームの一部(ドロップダウンメニューなど)に到達したら、ヒアドキュメントをエスケープし、PHPを記述して(標準のエコー関数を使用してそのフォーム要素に必要なHTMLを生成します)、ヒアドキュメントに戻ります。 HTMLのより多くのチャンク。

疑惑:これはエレガントではなく、厄介で、退屈で、ただ気分が悪いだけです。

リクエスト:これを行うためのより良い方法のアイデアはありますか?

編集:私の現在の設定のチャンクの例、ここでは静的HTMLの最初のチャンクがエコーされているのを見ることができます-(フォームの開始と最初の質問)次に、データに応じて動的に生成する必要があるドロップダウンメニューこれはSESSION変数に存在します。この後、ヒアドキュメントは再開し、より静的な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;
4

2 に答える 2

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
}

これが目的ではない場合は、コードを表示してください。

于 2012-07-13T17:09:10.733 に答える
1

あなたのコードの説明から(なぜあなたは何も表示しないのですか?)私はコードがいくぶん似ていると思います

<?php

$someVariable = "Hello < World";
echo <<<FOO
 <!-- chunk of HTML -->
 {$someVariable}
 <!-- chunk of HTML -->
FOO;

// simulating some function calls
echo str_repeat('A', 10);

その場合は、Smartyではないことをお伝えしておきます。これは単にヒアドキュメント(および引用符で囲まれた変数)です。


上記のコードをデータベースアクセスなどから分離した場合、それについて厄介なことは何もわかりません。厄介なのは、出力生成とビジネスロジックを混在させることです。

しかし、私(Smarty)の開発者にとって、これは確かにエレガントに見えず、間違っていると感じます。しかし、それはおそらく主観的なものです。SmartyTwigphpTALMustache(および他の50億のエンジン)などのテンプレートソリューションの「エレガンス」に慣れています。

これらのライブラリは、単にHTMLを生成するだけではありません。それらは値のエスケープを処理します(is 4 < 5?無効なHTMLです)。テンプレートの構造化と整理に役立ちます。彼らはあなたのためにキャッシングをします。彼らは国際化を見てきました。と。a。全体。多く。もっと。

于 2012-07-13T17:42:10.383 に答える