Вывод ленты новостей в виде таблицы | Strawberry

В этой заметке я покажу как вывести новостную ленту в форме таблицы для Strawberry 1.1.1. Впрочем, по аналогии можно решить эту задачу для любой CMS с использованием smarty. Например, несколько месяцев назад я использовал тоже самое решение для Magento (дефолтный модуль Magento для создания таблицы не устраивал).

Самым простым способом создать таблицу будет вариант имитировать таблицу через div-ы с параметрами float и фиксированной высотой (height). Но иногда имитации недостаточно.

Чтобы сделать таблицу я использовал две функции:
function make_table($number, $in_rows) {
$rows = ceil($number/$in_rows);
$row_array['rows'] = $rows;
$row_array['lines'][] = 1;
	for ($i = 1; $i < $rows; $i++) {
		$row_array['lines'][] = $in_rows*$i+1;
	}
$row_array['empty_td'] = $i*$in_rows - $number;
$row_array['number'] = $number;
$row_array['in_row'] = $in_rows;

echo '<table>';

return $row_array;
}

function close_table($in_row,$news_number) {

$news_number = $news_number - 1;
if ($news_number < $in_row['in_row']) {
$in_row['empty_td'] = $in_row['in_row'] - $news_number;
} 
elseif ($news_number == $in_row['in_row']) {
$in_row['empty_td'] = 0;
}
elseif (($news_number > $in_row['in_row']) and ($news_number < $in_row['number'])) {
$full_content_row = floor($news_number/$in_row['in_row']); // заполнено полностью строк
$in_row['empty_td'] = $in_row['in_row'] - ($news_number - ($in_row['in_row'] * $full_content_row)); // незаполнено ячеек в последней строке
	if ($in_row['empty_td'] == $in_row['in_row']) {
		$in_row['empty_td'] = 0;
	}
} 
		for ($i > 1; $i < $in_row['empty_td']; $i++) {
			echo '<td>';
		}	
echo '</table>';

}
Первая функция function make_table($number, $in_rows) создает массив необходимой информации для генерации таблицы и открывает тег <table>.

$number - ожидаемое количество новостей на страницу.
$in_rows - нужное количество столбцов в нашей таблице

Вторая функция close_table($in_row,$news_number) правильно закрывает таблицу, используя созданный ранее массив и информацию про выполнение show_news.php.

Честно говоря, сложнее всего было правильно закрыть таблицу, расставив все пустые <td> по своим местам.


Теперь вызываем нашу ленту новостей:
$news_number = 1;
$number = 10;
$in_row = make_table($number, 4); // 4 столбца
$template = 'templatename';
include rootpath.'/show_news.php';
close_table($in_row,$news_number);
unset($news_number, $in_row);
В нашем шаблоне, который условно назван templatename в начало добавляем код:
if ($in_row) {
if (in_array($news_number, $in_row['lines'])) {
echo '<tr>';
}
}
А в конце код такой:
$news_number++;
Получилось немного сложновато, но в итоге мы получим таблицу table. Не стоит обращать внимание на то, что теги и остались незакрытыми - по спецификации в этом нет никакой необходимости.

Но это ещё не все. Дело в том, что наша пагинация попадает в последнюю ячейку таблицы. А нам надо, чтобы все было на свои местах...

Есть как минимум 2 решения:
1. ANT-Soft предложил самостоятельно написать код для вывода пагинации. Как по мне, этот вариант вполне приемлемый. Не вижу причин не воспользоваться. На всех самописных CMS только так и делают.
2. Я предлагаю попробовать сделать буферизацию пагинации. Наш вызов таблицы отличается существованием переменной $in_row. Для этого в файле /inc/show.news.php найдем блок Pages (он последний) и добавим буферизацию:
if($in_row) {
ob_start();
}
//----------------------------------
// Pages
//----------------------------------
В конце /inc/show.news.php добавим:
if($in_row) {
$pagination = ob_get_contents();
ob_end_clean();
}
Теперь на странице вызова новостей после вызова таблицы мы можем добавить нашу пагинацию:
echo $pagination;
Все. С вопросами, замечаниями и пожеланиями на форум Strawberry.

А вообще создать таблицу table средствами php очень просто.
Мои PET-проекты
Матч Шредингера. Про футбол без спойлеров. Сервис помогает выбрать интересный матч для просмотра в записе. Перейти »
MafiozZz. Сервис для тех, кто любит играть в мафию. Сервис дает клубам возможность завести клубный сайт, предоставляет удобный интерфейс для ведения подобной статистики, расписания игр, выдавать игрокам награды, проводь адресную SMS рассылку (и прочие плюшки). Перейти »