0

html/jsを返すこのPHP関数があります。しかし、私が使用している方法は間違っており、効率的ではありません。より良い方法はありますか?

これはコードの単純化されたバージョンです。

function doSomething() {
$speed = 1000;
$duration = 500;
$start = false; // this is a boolean and doesn't work below (not sure why)

$output = '<div class="container">something</div>' . "\r\n";
$output .= '<script type="text/javascript">' . "\r\n";
$output .= 'jQuery(document).ready(function() {' . "\r\n";
$output .= 'jQuery(".container.").cycle({' . "\r\n";
$output .= 'speed : ' . $speed . ',' . "\r\n";
$output .= 'duration : ' . $duration . ',' . "\r\n";
$output .= 'start : ' . $start . "\r\n"; // this doesn't work I think is because of it becoming a string instead of a boolean here.
$output .= '})' . "\r\n";
$output .= '})' . "\r\n";
$output .= '</script> . "\r\n";
return $output;
}

上記のように、一連の出力と一連の改行があり、基本的に保守とデバッグが非常に困難です。さらに、コメントごとに START 変数が機能していません。

もっと良い方法があるはずです。ヒアドキュメントについて考えましたか?しかし、確かではありません...

ご覧いただきありがとうございます。

4

4 に答える 4

2

次のようなものを使用します。

function doSomething() {
     $speed = 1000;
     $duration = 500;
     $start = (int)false; // this is a boolean and doesn't work below (not sure why)
     $output = <<<END
       <div class="container">something</div>
       <script type="text/javascript">
         jQuery(document).ready(function() {
         jQuery(".container").cycle({
           speed : $speed ,
           duration : $duration,
           start : $start
          })
        })
       </script>
END;
return $output;
}

echo doSomething();

メンテナンスが容易

于 2012-12-08T16:21:55.380 に答える
1

次のようなことができます。

function doSomething() {        
    $cycleArguments = array(
        'speed'    => 1000,
        'duration' => 500,
        'start'    => false
    );

    $output = '<div class="container">something</div>' . "\r\n";
    $output .= '<script type="text/javascript">' . "\r\n";
    $output .= 'jQuery(document).ready(function() {' . "\r\n";
    $output .= 'jQuery(".container.").cycle(' . "\r\n";
    $output .= json_encode( $cycleArguments );
    $output .= ')' . "\r\n";
    $output .= '})' . "\r\n";
    $output .= '</script>' . "\r\n";
    return $output;
}

json_encode() ヒアドキュメント構文を組み合わせて使用​​すると、次のようになります。

function doSomething() {        
    $cycleArguments = array(
        'speed'    => 1000,
        'duration' => 500,
        'start'    => false
    );

    $jsonCycleArguments = json_encode( $cycleArguments );

    $output = <<<OUTPUT
    <div class="container">something</div>
    <script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery(".container.").cycle( $jsonCycleArguments );
    });
    </script>
OUTPUT;
    return $output;
}

別のオプションは、まだ次のようになります。

function doSomething() {        
    $cycleArguments = array(
        'speed'    => 1000,
        'duration' => 500,
        'start'    => false
    );

    $output = array(
        '<div class="container">something</div>',
        '<script type="text/javascript">',
        'jQuery(document).ready(function() {',
        '    jQuery(".container.").cycle(' . json_encode( $cycleArguments ) . ');',
        '});',
        '</script>'
    );

    return implode( "\r\n", $output );
}

等...

于 2012-12-08T16:18:34.447 に答える
0

以下にいくつかのオプションを示します。

1) ページの上部 (または、すべての JS をモジュール化しており、初期化を呼び出す前にページの下部まで起動しない場合)、JSON でエンコードされた多次元配列を PHP にダンプさせます。そのページで必要なすべてのデータを 1 つの変数にまとめます。

JS (静的ファイルに格納されている) は、その var を init 関数の 1 つに渡し、そのデータを操作します。

2)そこからhtmlページsrc="script.php"からphpスクリプトを呼び出し、HEREDOCとして、またはテンプレート値とともに、JSを別のインクルードとして保存します。値を取得してテンプレートに挿入し、文字列をエコー バックします。これが機能するには、MIME タイプをいじる必要があります。

3) apache インストールを書き直して名前を書き直し、値の取得とテンプレートを処理するルーティング スクリプトを書き、要求されたファイル拡張子に基づいて MIME タイプを返します。

これはほとんどのサイトにとってやり過ぎですが、すべての JS を外部に置き、JS ファイルに動的データを含め、すべてのスクリプト タグに通常の外観のタグを付けたい大規模なサイトでは便利ですsrc

別の方法は、「.js」ファイルをphpファイルのように扱うようにphpを設定することです(ただし、MIMEタイプを設定するには、スクリプトでタイプを把握する必要があります)。

于 2012-12-08T16:52:33.993 に答える
0

別の HTML ファイルにコードを記述して、php からそのファイルへの AJAX 呼び出しを作成し、必要に応じて AJAX 応答で使用する HTML ページのコードを取得できます。

于 2012-12-08T16:18:00.403 に答える