2011-05-13 112 views
2

这是php代码的一部分,它使用contentArray,它是一个JSON,并为用户生成用户界面,它生成html标签,并且它也生成js代码。它的工作原理,但我认为代码很难阅读和维护,任何想法?谢谢。如何让这段代码更具可读性

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

}    
+0

我会为偶数或奇数类名创建变量,所有内联内容都来自顶部数据库。然后使用变量名称将所有回显语句放在底部。但它的方式并不算太糟糕。 – AlbertVo 2011-05-13 17:04:33

+1

哇所有这些答案,并没有upvotes大声笑 – mcgrailm 2011-05-13 19:55:44

+0

问:让代码更具可读性?回答:更糟的代码... – Potherca 2017-04-10 19:55:10

回答

1

首先为您的奇数和偶数造型没有需要的一类只使用CSS

here is info on that

然后在PHP只能随声附和你所需要的一行

$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放在html页面,远离php

我们得到了可以通过使用阵列starts with selector

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

编辑链接到CSS的信息 – mcgrailm 2011-05-13 17:22:38

+0

编辑:删除了无用的类和交换周围的报价,所以你会在结果中有效的HTML – mcgrailm 2011-05-14 12:07:55

0

你的“for”循环的一个提示,你应该在循环之前计算$ contentArray的计数。每次循环执行时,都必须调用该函数。

$count = count($contentArray); 

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

jQuery代码应该已经在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>"; 
}  

ADDED

一个通用的案例:

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

也就是说,绑定使用类选择和后期的使用做了一些工作的唯一标识符。

+0

但我的jquery是基于不同的id,有不同的行为,可以表达它更详细吗? – Tattat 2011-05-13 17:17:13

0

你可以尝试真正的HTML:例如使用smarty

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

独立的内容和代码。它需要在短期内进行一些基础设施投资,但从长远来看会改善维护。

反思评论,让我们将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; 
} 
+1

我正在围绕这个问题进行讨论。虽然我以前使用它,它是一个优秀的模板系统,但有一些非常好的参数,php已经是一个模板系统,添加像Smarty这样的东西只需要用'{...}'替换'',增加处理时间的缺点。 – eykanal 2011-05-13 17:07:47

+1

有趣的观点,但我会说,阅读一个聪明的模板然后“phtml”更容易 – mcgrailm 2011-05-13 17:25:57

+0

我同意eykanal。为什么不将模板分成其他文件并将其视为模板(与其他文件分开)?当然,PHP本身就是一种模板语言。它必须得到恰当的实施。 – Tadeck 2011-05-13 19:13:16

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 
} 
+0

另外,不是使用echo语句,而是在IDE中使用?>>然后编写HTML时,在IDE中看起来更好。然后使用<?php重新输入PHP。 – EstelS 2011-05-13 17:10:33

0

您可以删除()从回声陈述,他们不一定需要和可能帮助它看起来有点整洁......

0

这实际上看起来很理解我;我可以毫不费力地弄清楚你在做什么。唯一的区别,我建议将是该行类使用ternary operators

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

...但是这只是我,有些人会发现,较为混乱,而不是更少。我个人喜欢把它全部放在一行中。

0

Personnaly,我喜欢用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>"); 

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