При табличной верстке удобно размещать разные блоки в отдельных ячеках таблицы (а не в трех - лево-право-центр), и при этом без геморроя менять размещение и отображение блоков на разных страницах. Для сайтов с простым шаблонным дизайном можно этот каркас генерировать: Код (PHP): <?php $buffer = "<table width=\"100%\">\r\n"; // Верхние блоки (top) if (!empty($top)) { $colspan = 1; $colspan += !empty($left); $colspan += !empty($right); foreach ($top as $td) { $buffer .= "<tr>\r\n<td valign=\"top\" width=\"100%\" colspan=\"{$colspan}\">\r\n{$td}\r\n</td>\r\n</tr>\r\n"; } } // Центральный блок (content) if (!empty($left)) { $buffer .= "<tr>\r\n<td valign=\"top\">\r\n".array_shift($left)."\r\n</td>\r\n"; $buffer .= "<td valign=\"top\" rowspan=\"".($r=count(count($left)>count($right)?$left:$right)+1)."\" width=\"100%\">\r\n"; $buffer .= $content; $buffer .= "</td>\r\n"; } else { $buffer .= "<tr>\r\n<td valign=\"top\" rowspan=\"".count($right)."\" width=\"100%\">\r\n"; $buffer .= $content; $buffer .= "\r\n</td>\r\n"; } if (!empty($right)) { $buffer .= "<td valign=\"top\">\r\n".array_shift($right)."</td>\r\n</tr>\r\n"; } else { $buffer .= "</tr>\r\n"; } // Левые и правые блоки (left, right) for ($i=0; true; $i++) { $left_exist = key_exists($i, $left); $right_exist = key_exists($i, $right); if (!$left_exist && !$right_exist) { break; } $buffer .= "<tr>\r\n"; if ($left_exist) { $buffer .= "<td valign=\"top\">\r\n{$left[$i]}\r\n</td>"; } elseif (!empty($left)) { $buffer .= "<td valign=\"top\"></td>\r\n"; } if($right_exist) { $buffer .= "<td valign=\"top\">\r\n{$right[$i]}</td>\r\n"; } $buffer .= "</tr>\r\n"; if (empty($left)) { $left[0] = true; } } // Нижние блоки (bottom) if (!empty($bottom)) { //Переменная $colspan объявляется при обработке верхних блоков foreach ($bottom as $td) { $buffer .= "<tr>\r\n<td valign=\"top\" width=\"100%\" colspan=\"{$colspan}\">\r\n{$td}\r\n</td>\r\n</tr>\r\n"; } } $buffer .= "</table>\r\n"; ?> Переменные $top, $left, $right, $bottom - массивы, в элементах которых готовый html-код блоков. Отредактировано.
[vs], а можно простенький примерчик использования этого скрипта? P.S. я решил сделать для себя каркас таблиц и занимался этим в общей сложности сутки. Закончив и заглянув сюда, обнаружил эту тему)). Есть похожие места - я примерно так же делаю colspan. Но основная идея у меня все же другая.. Покажи примерчик, плз
Код (PHP): <?php $top = array('<h1>Header</h1>'); $left = array('<h2>Block</h2>','<h2>Block</h2>'); $right = array('<h2>Block</h2>'); $bottom = array('<h1>Footer</h1>'); $content = '<h1>CONTENT</h1>'; /* Код */ echo $buffer; ?> Результат Код (Text): <table width="100%"> <tr> <td valign="top" width="100%" colspan="3"> <h1>Header</h1> </td> </tr> <tr> <td valign="top"> <h2>Block</h2> </td> <td valign="top" rowspan="2" width="100%"> <h1>CONTENT</h1></td> <td valign="top"> <h2>Block</h2></td> </tr> <tr> <td valign="top"> <h2>Block</h2> </td></tr> <tr> <td valign="top" width="100%" colspan="3"> <h1>Footer</h1> </td> </tr> </table>
Спасибо). Да, каждый все шаблоны каждый делает "под себя" (С) , особенно это видно в сравнении. Внимание на чем-то заостряется, и на что-то его не хватает. Решусь показать и свою драндулетку - в ней я сконцентрировался на визуальном представлении (см. пример), а про спан строк, например, совсем забыл - он мне не был нужен)). Особо не придирайтесь, я учусь еще, причем сам.. PHP: <?php function htmlTable2($s,$t){ $rows=preg_split("/\n/",trim($s)); foreach ($rows as $row){ $r.='<tr>'; $row=preg_replace("/(^\|)|(\|$)/",'',trim($row)); $cells=preg_split("/\|/",$row); $ColSpan=1; foreach ($cells as $cell){ if ($cell=='') $ColSpan++; else { $r.="<t$t"; if ($ColSpan>1) $r.=" colspan=\"$ColSpan\""; $ColSpan=1; $LSp=preg_match("/^\s/",$cell); $RSp=preg_match("/\s$/",$cell); if ($LSp||$RSp){ $r.=" align="; if ($RSp) { if ($LSp) $r.="\"center\""; else $r.="\"left\""; } else $r.="\"right\""; } $r.='> '.trim($cell)." </t$t>"; } } $r.='</tr>'; } return $r; } function htmlTable() { $r='<table '.func_get_arg(0).'>'; $s=func_get_arg(1); // head or body if (func_num_args()<3) $r.=htmlTable2($s,'d'); // just body else { if ($s>'') $r.='<thead>'.htmlTable2($s,'h').'</thead>'; if (func_num_args()>3) { $s=func_get_arg(3); // footer if ($s>'') $r.='<tfoot>'.htmlTable2($s,'d').'</tfoot>'; } $s=func_get_arg(2); // body if ($s>'') $r.='<tbody>'.htmlTable2($s,'d').'</tbody>'; } $r.='</table>'; return $r; } echo htmlTable("border=\"1\" width=\"100%\""," | n ||| Just a table | "," | 1. | aaa |bbb | ccc| | 2. || aaa+bbb |c | | 3a | a || DD | "," ||| total: | $50| " ); ?> Приведенный пример выдает такой вот HTML (разбито на строки и отступы - вручную прям тут): HTML: <table border="1" width="100%"> <thead> <tr> <th align="center"> n </th><th colspan="3" align="center"> Just a table </th> </tr> </thead> <tfoot> <tr> <td colspan="3" align="center"> total: </td><td align="right"> $50 </td> </tr> </tfoot> <tbody> <tr> <td align="center"> 1. </td> <td align="center"> aaa </td> <td align="left"> bbb </td> <td align="right"> ccc </td> </tr> <tr> <td align="center"> 2. </td> <td colspan="2" align="center"> aaa+bbb </td> <td align="left"> c </td> </tr> <tr> <td align="center"> 3a </td> <td align="center"> a </td> <td colspan="2" align="center"> DD </td> </tr> </tbody> </table>