【发布时间】:2015-07-10 17:04:32
【问题描述】:
我正在尝试找出将 HTML 视图和 CSV 的职责分开以进行导出(相同的视图数据)的最佳方法。当它几乎在做同样的事情时,我不想重复编写相同的 CSV 代码块。
下面的示例代码,首先从数据库中获取数据,然后将其处理成多维数组。你可以看到我使用了很多foreach 来生成报告。我是否对 CSV 导出重复此操作?必须有一个 DRY 解决方案。
下面的示例代码,您将如何划分 CSV 和 HTML 的职责?
function report($campaign, $agent, $startDate, $endDate) {
$sql = "SELECT count(*) as total, group_name, field, field, field, FROM table some ... inner joins table .. WHERE ... group by agent";
$q = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_assoc($q)) {
$report[ $row['group_name'] ][ $row['item'] ] ['total'] = 0;
$report[ $row['group_name'] ][ $row['item'] ] ['total'] += $row['total'];
$report[ $row['group_name'] ][ $row['item'] ] ['agent'][$row['agent']] = $row;
if (!array_key_exists($row['agent'], $fieldsAgent)) {
.....
}
}
$html = "<table>";
$html .= " <tr>";
$html .= " <td>Group</td>";
$html .= " <td>Item</td>";
foreach($fieldsAgent as $agentCol => $agentTotal) {
$html .= "<td>$agentCol</td>";
}
$html .= " <td>Total</td>";
$html .= " </tr>";
foreach ($report as $category => $items) {
foreach($items as $itemName => $itemData) {
$html .= "<tr>";
$html .= " <td>" . $category . "</td>";
$html .= " <td>" . $itemName . "</td>";
foreach($fieldsAgent as $fieldAgentName => $totalAgentUser) {
$total = $itemData['agent'][ $fieldAgentName ][ 'total' ];
$html .= "<td>" . $total . "</td>";
}
$html .= " <td>" . $itemData['total'] . "</td>";
$html .= "</tr>";
}
}
$html .= "</table>";
echo $html;
}
【问题讨论】:
-
DRY 解决方案是将您的表示与数据逻辑分开,然后有两个单独的表示层(一个用于 html,另一个用于 csv)....这就是 MVC 的全部意义所在