Ниже приведён класс для генерации html таблиц, он полностью удовлетворяет мои нужды, но я не уверен, в правильности оформления… посмотрите его, пожалуйста, и прокомментируйте.
Итак, мне достаточно часто приходится генерировать таблицы на лету, от самых простых, до относительно сложных (с различными css классами, js кодом и т.д.). Написанный класс сильно упрощает работу:
// вытягиваю откуда-нить данные, и привожу их к следующему виду:
$data[] = array('111', '222', '333');
$data[] = array('111', '222', '333');
$data[] = array('111', '222', '333');
$data[] = array('111', '222', '333');
// теперь вывожу самую простую таблицу
$table = new CreateTable();
$table->display($data);
результат:
<table>
<tr>
<td>111</td>
<td>222</td>
<td>333</td>
</tr>
…
</table>
Но можно и усложнить, например:
добавить заголовки (th) + css класс для каждого из них
добавить классы любому столбцу (td)
добавить поддержку чередования строк (tr), чтобы вставить js код или просто разукрасить таблицу
короче ничего сложного, в результате html код должен выглядеть примерно так:
<table id='myId' class='myClass'>
<tr>
<th>Head1</th>
<th class='center'>Head2</th>
<th>Head3</th>
</tr>
<tr class='class_1'>
<td>111</td>
<td>222</td>
<td class='right'>333</td>
</tr>
<tr class='class_2'>
<td>111</td>
<td>222</td>
<td class='right'>333</td>
</tr>
<tr class='class_1'>
<td>111</td>
<td>222</td>
<td class='right'>333</td>
</tr>
<tr class='class_2'>
<td>111</td>
<td>222</td>
<td class='right'>333</td>
</tr>
</table>
подобного можно добиться задействовав все возможные свойства и методы:
$table = new CreateTable();
$table->space = " "; // отступ от основного кода
$table->SetTableId("myId"); // id таблицы
$table->SetTableClass("myClass"); // класс таблицы
$table->SetTrAttr("class='class_1'", "class='class_2'"); // чередование строк (любой js/css-код, который будет чередоваться)
$table->SetThText("Head1", "Head2", "Head3"); // заголовки таблицы
$table->SetThClass("", "center"); // имена классов для заголовков
$table->SetTdClass("", "", "right"); // имена классов для столбцов
$table->display($data); // вывод таблицы
Все методы кроме display необязательны.
А вот собственно и сам класс:
class CreateTable {
public $space;
private $table_id;
private $table_class;
private $tr_attributes;
private $th_text;
private $th_class;
private $td_class;
public function display($content) {
print $this->space."<table{$this->table_attributes()}> \r\n";
if (is_array($this->th_text)) {
print $this->space." <tr> \r\n";
foreach ($this->th_text as $key => $th) {
print $this->space." <th{$this->add_class("th", $key)}>{$th}</th> \r\n";
}
print $this->space." </tr> \r\n";
}
foreach ($content as $row) {
print $this->space." <tr{$this->tr_attributes()}> \r\n";
foreach ($row as $key => $td) {
print $this->space." <td{$this->add_class("td", $key)}>{$td}</td> \r\n";
}
print $this->space." </tr> \r\n";
}
print $this->space."</table> \r\n";
}
public function SetTableId($id) {
$this->table_id = $id;
}
public function SetTableClass($class) {
$this->table_class = $class;
}
public function SetTrAttr() {
$this->tr_attributes = func_get_args();
}
public function SetTdClass() {
$this->td_class = func_get_args();
}
public function SetThText() {
$this->th_text = func_get_args();
}
public function SetThClass() {
$this->th_class = func_get_args();
}
private function table_attributes() {
$attributes = "";
if (!empty($this->table_id)) {
$attributes .= " id='{$this->table_id}'";
}
if (!empty($this->table_class)) {
$attributes .= " class='{$this->table_class}'";
}
return $attributes;
}
private function tr_attributes() {
static $current;
if (empty($current) || $current == count($this->tr_attributes)) {
$current = 0;
}
if (!empty($this->tr_attributes[$current])) {
return " " .$this->tr_attributes[$current++];
}else {
$current++;
}
}
private function add_class($tag, $current) {
if ($tag == "td") $foo = $this->td_class;
elseif ($tag == "th") $foo = $this->th_class;
if (isset($foo[$current])) {
if (!empty($foo[$current])) {
return " class='{$foo[$current]}'";
}
}
}
}
Вопросы:
1) правильно ли составлен класс, или можно было бы использовать возможности ооп более рационально?
2) как лучше задавать значения свойствам (например id таблицы) - непосредственным присваиванием ($table->table_id = 'myId';) или с помощью методов как у меня?
3) если я захочу нарисовать сразу несколько таблиц на странице, лучше каждый раз инициализировать класс, или можно обойтись только одной инициализацией, при этом очищать значения свойств после каждого вывода? (работает в обоих случаях, ведь ни конструкторов, ни диструкторов нет, но как правильнее?)
что-то ещё хотел спросиль… ну лана, потом… чё-то и так дофига уже написал )))))