开发者

How to make this code more readable

This is a part fo php code, which use the contentArray, which is a JSON, and generate the UI to the user, it generate html tags, also, it generate js code too.... It works, but I think the code is pretty difficult to read and maintain, any ideas??? thank you.

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='userda开发者_运维百科ta' 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>");

}            


first for your odd and even styling there is not need for a class just use css

here is info on that

then in php only echo what you need in one line

$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>');   
}

and lets put the jquery in the html page away from php

we get can get every item by using starts with selector

$('[id^=user_data_textarea_]').bind('keydown', function(e){  
    var id = this.id.str_replace("user_data_textarea","");
    TypingHandler.handleTypingInUserDataTextArea(id, e);
});    


One tip on your "for" loop, you should calculate the count of $contentArray before the loop. Every time the loop executes, it has to call that function.

$count = count($contentArray);

for ($i=0; $i<count; $i++) {
// ...
}


You could try real 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 } ?>


It should look something like this, for better readability in the 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
}


You could remove the ( ) from the echo statements, they're not necessarily needed and might help make it look a little neater...


That actually looks pretty understandable to me; I could figure out what you're doing without difficulty. The only difference I would suggest would be the use of ternary operators for the row class:

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

...but that's just me, some would find that MORE confusing, rather than less. I personally like putting it all in one line.


Personnaly, I like to use printf to write html code in php. It could look like:

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>");

}    


<?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 ?>


jQuery code should be already in the HTML, using some main selector and not binding elements one by one, it not makes sense for me. That should clarify your code.

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>";   
}      

ADDED

A generic case:

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

That is, bind using a class selector and late use some unique identifier for doing the job.


Put everything in arrays, then echo them at the END of your loop.

// 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";


Separate your content and code using for example smarty. It requires some infrastructure investment in the short term, but improves maintenance in the long run.

Reflecting the comments, let's then treat PHP as a real templating language.

$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;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜