Ürün listelemede, raporlamada, fotoğraf galerisi uygulamalarında vb. karşınıza çıkabilen bir gereksinimdir tablo kullanmak. CSS iyidir, süperdir; katılıyorum. CSS stilleriyle tablo “emüle” de edilebiliyor, ona da eyvallah. Bu esnada ne dediklerini bilmeksizin tablolar eski teknolojidir, tü kakadır, kullanan siteler güncel değildir diyenlere de aduket çekmek istiyorum.

Bu yazı tabloseverlere gelsin.

Olay basit. Elinizde tek boyutlu bir data array’ı olacak ve bunu fonksiyona yedireceksiniz. Size de güzelce bir tablo çıkartacak.

İşte o kod:

function generateTable($data, $column = 3, $return = FALSE, $cp = 5, $class = NULL) {
	$column = intval($column);
	if (empty($data) || !is_array($data) || $column == 0) return false;

	// Tablo genişliğini hesaplayalım.
	$width = floor(100 / $column);
	$diff = 100 - ($width * $column); // problem çıkaracak, yazının en altını okuyun.

	$table = '<table width="100%%" border="0" cellspacing="%d" cellpadding="0"%s>%s</table>';
	$row = '<td width="%d%%" valign="top">%s</td>'; // %'in escapei yine %, / değil..

	$rowCount = ceil(count($data) / $column);

	$out = '';
	$rows = array();

	for ($r=1; $r<=$rowCount; $r++) {
		$temp = '<tr>';
		for ($c=1; $c<=$column; $c++) {
			$temp .= sprintf($row, (($c==$column) ? $width+$diff : $width), $data[(($r-1) * $column) + $c - 1]);
		}
		$temp .= '</tr>';
		$rows[] = $temp;
	}

	if (!empty($class)) $class = ' class="'.$class.'"';

	if (!$return) printf($table, $cp, $class, implode('', $rows));
	else return sprintf($table, $cp, $class, implode('', $rows));
}

Örnek kullanım:

$data = array('elma', 'armut', 'kelmahmut', 'kelaynak', 'mirkelam', 'ajdar');
generateTable($data);

Çıktı:

elma armut kelmahmut
kelaynak mirkelam ajdar

Çıktı (HTML):

<table width="100%" border="0" cellspacing="5" cellpadding="0">
  <tr>
    <td width="33%" valign="top">elma</td>
    <td width="33%" valign="top">armut</td>
    <td width="34%" valign="top">kelmahmut</td>
  </tr>
  <tr>
    <td width="33%" valign="top">kelaynak</td>
    <td width="33%" valign="top">mirkelam</td>
    <td width="34%" valign="top">ajdar</td>
  </tr>
</table>

Örnek kullanım 2:

$data = array('elma', 'armut', 'kelmahmut', 'kelaynak', 'mirkelam', 'ajdar');
$out = generateTable($data, 4, true, 0, 'tabloStili');
echo $out;

Çıktı:

elma armut kelmahmut kelaynak
mirkelam ajdar

Çıktı (HTML):

<table width="100%" border="0" cellspacing="0" cellpadding="0" class="tabloStili">
  <tr>
    <td width="25%" valign="top">elma</td>
    <td width="25%" valign="top">armut</td>
    <td width="25%" valign="top">kelmahmut</td>
    <td width="25%" valign="top">kelaynak</td>
  </tr>
  <tr>
    <td width="25%" valign="top">mirkelam</td>
    <td width="25%" valign="top">ajdar</td>
    <td width="25%" valign="top"></td>
    <td width="25%" valign="top"></td>
  </tr>
</table>

Bilinen hatalar:

İşim aceleydi, hesaplama da görece çakma oldu. Eğer 10’un üzerinde sütun sayısı kullanırsanız durumu farkedeceksiniz. Varolan genişlik dağıtma mantığı gayet dandik; en son sütuna bölme işlemi sonucu kalan sayıyı eklemekte. Dolayısıyla bir yerden sonra son sütunun alakasızca geniş olduğunu göreceksiniz. Düzeltmek için; tüm sütunlara dağılım yapan bir mantık geliştirmek gerekiyor. Vaktim kalmadı, o da sizden olsun.

Budur, güle güle kullanın.