2015-06-21 44 views
1

我有一個計劃,其中函數返回使用一系列點等號級聯分配的這樣一個相當大的HTML表:

function callme() { 
    $return = ''; 
    $return .= '<table>'; 
    foreach ($foo as $bar => $bar){ 
     $return .= '<tr><td style="css">bla bla bla'.$bar.'</td>'; 
     $return .= '<td>more stuff, modal buttons</td></tr>'; 
     $return .= 'etc etc etc...'; 
    } 
    $return .= '</table>'; 
return $return 
} 

我想找到一個更少的錯誤,WET處理這種方式,並不確定它是否應該使用array,我將每個項目添加到implode/join,也許使用對象將是有道理的。

我已經搜索了一下,沒有太多的運氣,並會喜歡SO社區的一些輸入。

編輯:

不知道是否有做這個職位上,主題的任何方式,我可以看到現在真的沒有辦法選擇正確的解決方案,這樣以來爲時已晚將其刪除(也許發佈到php mailing list更合適),我至少會試着讓它更有用。

用完30分鐘調試腳本,其中table正被通過串聯使用的HTMLtextvariable部件產生「點等於」方法,並且其中的一個錯誤是造成每文本元素被呈現作爲錨(<a>some text</a>)。移除所有的JavaScript,這是我預期在某種程度上產生的DOM元素錨標記後,找到了這個bug在下面一行:

$return .= '<br/><div id="visitMBO" class="btn visitMBO" style="display:none"><a href="'.$eventLinkURL.'" target="_blank">Manage on MindBody Site<a/></div>'; 

錯誤是在該行的末尾:<a/>。哎呦。

這是一個相當長表,包括大量由JavaScript中使用CSSclassesid S,還有很多變數所以有噸的單引號,雙引號和點所有的地方。現在我希望能夠根據用戶輸入呈現不同的變體,並且要麼使用test子句分隔多個版本,要麼在整個測試中進行測試可能會更糟糕。

詢問HTML table generator class會更合適,但也偏離主題。其中的選項包括相當輕量級:htmlgen,更強大的Cellbrush和DynaWeb的Table Class,據我所知,這也是相當輕量級的。

作爲以下答案之一,.=是一個合理的方法,如果表格不太複雜,並且如果我只是將每一行保持較短的長度,問題就會更加明顯。事實上,錨的開始標籤實際上從頁面的邊緣掉下來。

在下面的答案中註明(包含鏈接)其他用於分離邏輯,標記和數據的選項將使用模板引擎或使用php的DOM類(tutorial)。 Heredoc也會清理一些冗餘和多個引號。

+1

有10十種幾個方法可以做到在PHP什麼。這裏沒有真正的問題需要回答 – 2015-06-21 02:42:22

+0

@匿名我只是覺得這樣做很容易出現錯誤輸入或者看不到東西。 – MikeiLL

+0

@Dagon我知道有很多(甚至可能有10打)的方式來做到這一點,我很開放,這可能是這個論壇的一個開放式的問題,但即使沒有其他解決方案共享,我會分享無論我想出什麼,也許這對某個人有用。 – MikeiLL

回答

1

如果你想有類的方式來做到這一點,檢查出的DomDocument http://www.php.net/manual/en/class.domdocument.php

你可以用它來構建HTML在一個非常結構化的方式。但是,考慮到這個例子,我認爲他們不一定是解決問題的正確方法。你應該找到一種適合你的風格,並且對你和你的團隊有意義;這是避免錯誤代碼的最佳方法。

對於我來說,我通常只是使用代碼編寫代碼。=只要代碼相當小,就完全如此。這是一個非常容易閱讀的方法。如果我可以瀏覽一段代碼並理解它,但一般不會考慮它的正確代碼。

1

一種選擇是使用模板引擎,而不是直接將HTML代碼放入PHP函數中。一個例子是mustache

這將允許您在一個單獨的文件中構建您的HTML並將數據傳遞給它。

你的模板文件可能是這個樣子:

<table> 
    {{# foo }} 
     <tr> 
      <td>{{ bar }}</td> 
     </tr> 
    {{/ foo }} 
</table> 

然後你會從它那裏得到你的HTML字符串是這樣的:

$m = new Mustache_Engine(array(
    'loader' => new Mustache_Loader_FilesystemLoader(dirname(__FILE__) . '/templates'), 
)); 

$m->render('table_template', array('foo' => $foo)); 
+0

這是一個有趣的想法。由於它是一個wordpress插件,我需要考慮是否會使插件膨脹。 – MikeiLL

1

有很多方法可以做到的事情,在弦PHP。值得注意的是,如果您想要連接一個字符串的大塊連續的HTML塊,則不需要引號的一種有用的方法是使用Heredoc。例如

function callme(&$rows) { 
    $return = '<table>' . PHP_EOL; 
    foreach ($rows as $row){ 
     // Start a heredoc-delimited string 
     $return .= <<<EOD 
     <tr> 
     <td>Movie name: "$row[0]"</td> 
     <td>Review: $row[1]</td> 
     <td>IMDB rating: $row[2]</td> 
     <td>Summary: "$row[0]" was $row[1] with a rating of $row[2]</td> 
     </tr> 
EOD; 
// End a heredoc-delimited string (must be on its own line) 
    } 
    return $return . PHP_EOL . '</table>'; 
} 

$arr = array(array("Fast 7", "awesome", "7.6"), array("Glitter", "horrible", "2.1")); 
echo callme($arr); 

結果:

<table> 
     <tr> 
     <td>Movie name: "Fast 7"</td> 
     <td>Review: awesome</td> 
     <td>IMDB rating: 7.6</td> 
     <td>Summary: "Fast 7" was awesome with a rating of 7.6</td> 
     </tr>  <tr> 
     <td>Movie name: "Glitter"</td> 
     <td>Review: horrible</td> 
     <td>IMDB rating: 2.1</td> 
     <td>Summary: "Glitter" was horrible with a rating of 2.1</td> 
     </tr> 
</table>