2

これは、JSONであるcontentArrayを使用し、ユーザーにUIを生成し、htmlタグを生成し、jsコードも生成するphpコードの一部です。これは機能しますが、コードは機能すると思います。読み、維持するのはかなり難しいです、どんなアイデアですか?ありがとうございました。

for($i = 0; $i < count($contentArray); $i++){  

    if($i %2 == 0){
       echo ("<li class='even_row'>");
    }else{
       echo ("<li class='odd_row'>");
    }  
    $content = $contentArray[$i];    

    echo("<textarea class='userdata' id='user_data_textarea_".$content->{'m_sId'}."'>");
    echo($content->{'m_sDataContent'});  
    echo("</textarea>"); 

echo("</li>");   

    echo("<script type='text/javascript'>");

    echo("$('#user_data_textarea_".$content->{'m_sId'}."').bind('keydown', function(e){");  
    echo("  TypingHandler.handleTypingInUserDataTextArea(".$content->{'m_sId'}.", e);");
    echo(" });");    

    echo("</script>");

}            
4

11 に答える 11

1

まず、奇数と偶数のスタイリングでは、クラスは必要ありません。cssを使用するだけです。

ここにその情報があります

次に、phpでは必要なものだけを1行でエコーします

$count = count($contentArray);
for($i = 0; $i < $count; $i++){  
    $content = $contentArray[$i];    
    echo('<li><textarea class="userdata" id="user_data_textarea_"'.$content->{'m_sId'}.'">'.$content->{'m_sDataContent'}.'</textarea></li>');   
}

jqueryをphpから離れたhtmlページに配置しましょう

startwithselectorを使用してすべてのアイテムを取得できます

$('[id^=user_data_textarea_]').bind('keydown', function(e){  
    var id = this.id.str_replace("user_data_textarea","");
    TypingHandler.handleTypingInUserDataTextArea(id, e);
});    
于 2011-05-13T17:15:51.423 に答える
0

個人的には、 printfを使用してphpでhtmlコードを書くのが好きです。次のようになります。

for($i = 0; $i < count($contentArray); $i++){  

    printf("<li class='%s'>", $i % 2 ? "odd_row" : "even_row"); 
    $content = $contentArray[$i];    

    printf("<textarea class='userdata' id='user_data_textarea_%s'>%s</textarea>",
        $content->{'m_sId'},
        $content->{'m_sDataContent'});

    echo("</li>");   

    echo("<script type='text/javascript'>");

    printf("$('#user_data_textarea_%1$s').bind('keydown', function(e){
        TypingHandler.handleTypingInUserDataTextArea(%1$s, e);
         });",
        $content->{'m_sId'});     

    echo("</script>");

}    
于 2011-05-13T17:08:48.330 に答える
0

「for」ループに関する1つのヒントとして、ループの前に$contentArrayのカウントを計算する必要があります。ループが実行されるたびに、その関数を呼び出す必要があります。

$count = count($contentArray);

for ($i=0; $i<count; $i++) {
// ...
}
于 2011-05-13T17:01:12.480 に答える
0

jQueryコードは、いくつかのメインセレクターを使用し、要素を1つずつバインドしないで、既にHTMLに含まれている必要があります。これは、私には意味がありません。これでコードが明確になります。

for($i = 0; $i < count($contentArray); $i++){  
    $content = $contentArray[$i];    

    echo "<li class='" . (($i %2 == 0) ? "even_row" : "odd_row") . ">";
        echo "<textarea class='userdata' id='user_data_textarea_".$content->{'m_sId'}."'>";
        echo $content->{'m_sDataContent'};  
        echo "</textarea>"; 
    echo "</li>";   
}      

追加した

一般的なケース:

$(function() {
    $('.userdata').click(function() {
        some_function($(this).attr('id');
    });
})

つまり、クラスセレクターを使用してバインドし、後でジョブを実行するために一意の識別子を使用します。

于 2011-05-13T17:03:09.597 に答える
0

実際のHTMLを試すことができます。

<?php
for($i = 0; $i < count($contentArray); $i++){  
  $rowClass = $i %2 == 0 ?'even_row' : 'odd_row';
?>
    <li class='<?= $rowClass ?>'>
      <textarea class='userdata' id='user_data_textarea_<?=$content->{'m_sId'}?>'>
        <?= $content->{'m_sDataContent'} ?>
      </textarea>
    </li>
    <script type='text/javascript'>
    //etc...
    </script>
<?php } ?>
于 2011-05-13T17:03:34.300 に答える
0

たとえばsmartyを使用して、コンテンツとコードを分離します。短期的にはインフラストラクチャへの投資が必要ですが、長期的にはメンテナンスが向上します。

コメントを反映して、PHPを実際のテンプレート言語として扱いましょう。

$contentCount = count($contentArray);
for($i = 0; $i < $contentCount; $i++)
{
    $rowType = ( $i % 2 ) ? 'even' : 'odd';
    $content = $contentArray[$i];
    echo <<<EOT
<li class='{$rowType}_row'>
    <textarea class='userdata' id='user_data_textarea_{$content->m_sId}'>
        {$content->m_sDataContent}
    </textarea>

</li>
<script type="text/javascript">
    $('#user_data_textarea_{$content->m_sId}').bind('keydown', function(e)
    {
        TypingHandler.handleTypingInUserDataTextArea({$content->m_sId}, e);
    }
</script>
EOT;
}
于 2011-05-13T17:05:01.537 に答える
0

IDEで読みやすくするために、次のようになります。

<?php
foreach($contentArray as $content){
    ?>
    <li>
        <textarea class="userdata" id="user_data_textarea<?php echo htmlentities($content['m_sId']); ?>">
            <?php echo htmlspecialchars($content['m_sDataContent']); ?>
        </textarea>
        <script type="text/javascript">
            $('#user_data_textarea_<?php echo htmlspecialchars($content['m_sId']); ?>').bind('keydown',function(e){
                TypingHandler.handleTypingInUserDataTextArea('<?php echo htmlspecialchars($content['m_sId']); ?>',e);
            });
        </script>
    </li>
<?php
}
于 2011-05-13T17:05:01.340 に答える
0

エコーステートメントから()を削除することもできますが、必ずしも必要ではなく、少し見栄えを良くするのに役立つ場合があります...

于 2011-05-13T17:05:20.780 に答える
0

それは実際には私にはかなり理解できるように見えます。私はあなたが何をしているのかを問題なく理解することができました。私が提案する唯一の違いは、行クラスに三項演算子を使用することです。

echo "<li class='".( ($i%2 == 0) ? "even" : "odd" )."_row'>";

...しかし、それは私だけです。一部の人は、少なくなるのではなく、もっと混乱することに気付くでしょう。個人的には全部一列に並べるのが好きです。

于 2011-05-13T17:05:32.383 に答える
0
<?php
    foreach($contentArray as $content){
        $class = ($i %2 == 0) ? "even_row": "odd_row"; ?>
        <li class="<?php echo $class ?>">
            <textarea class='userdata' id='user_data_textarea_<? echo $content['m_sId'] ?>'>
                <? php echo $content['m_sDataContent'] ?>
            </textarea>
        </li>
        <script type='text/javascript'>
            $('#user_data_textarea_<?php echo content['m_sId'] ?>').bind('keydown', function(e){
                TypingHandler.handleTypingInUserDataTextArea(<?php $content['m_sId'] ?>, e);
            });
        </script>
<?php } // end foreach ?>
于 2011-05-13T17:14:33.913 に答える
0

すべてを配列に入れてから、ループの最後にエコーします。

// Put each item in the array, then echo at the end
$items = array();
$js = array();

// I'm assuming that your content array has numeric keys
// if not, use the for statement from your original code
foreach ($contentArray as $i => $content) 
{
    // using sprintf
    $items[] = sprintf('<li class="%s_row"><textarea class="userdata" id="user_data_textarea_%s">%s</textarea></li>'
        , ($i % 2) ? 'even' : 'odd'
        , $content->m_sId
        , $content->m_sDataContent
    );

    // or just plain old concatenation
    $js[] = "$('#user_data_textarea_{$content->m_sId}').bind('keydown', function(e){TypingHandler.handleTypingInUserDataTextArea({$content->m_sId}, e);});";
}

echo "<ul>" . join("\n", $items) . "</ul>\n"
    . '<script type="text/javascript">' . join("\n", $js) . "</script>\n";
于 2011-05-13T19:05:45.460 に答える