Постраничный вывод

Статус
В этой теме нельзя размещать новые ответы.

NewS

Гуру форума
Регистрация
15 Авг 2008
Сообщения
254
Реакции
87
У меня таблица рисуется с помощью foreach
PHP:
foreach($nfiles as $line) {
echo "<tr><td></td></tr>";
}
как можно сделать постраничный вывод строк?
Например по 20 строк на страницу.
 
А это единственный способ, может есть еще какие варианты?
Неужели для этого нужно 180Кб кода?
 
  • Заблокирован
  • #4
$stroka = 1;

if($stroka < 20){

foreach($nfiles as $line) {
echo "<tr><td></td></tr>";
$stroka++;
}

}

Думаю так должно работать.
 
как можно сделать постраничный вывод строк?
Например по 20 строк на страницу.
ну как можно сделать... Берешь, узнаешь количество результирующих записей, если их больше чем 20 например, то выводишь только первые 20. Через строку браузера (запрос типа "GET") читаешь номер страницы и выводишь записи, начиная с (20 * (номер страницы) - 20) по (20 * (номер страницы)).

Имея средние знания (даже не опыт) в PHP-программировании, додуматься до такого ну ооочень просто.

P.S. ну и вообще уже давно себе пора скачать такие файлы, как brain.dll и hands.exe. Говорят помогает.
 
Вот кусочек кода из моей системы постраничному выводу

PHP:
$rezult = $this->MySQL_class->query ( "SELECT COUNT(*) as cnt FROM {$sql}" );
$row = $this->MySQL_class->fetch_object ();
$users = $row->cnt;

$url_pages_news = location_site . "/{$url}";
$page = intval ($url_pages);
$total = intval ( ($users - 1) / $num ) + 1;
if (empty ( $page ) || $page < 0)
	$page = 1;
if ($page > $total)
	$page = $total;
$start = $page * $num - $num;
if ($page != 1)
	$pervpage = "<a class=pages_title href='{$url_pages_news}1'><</a> ";
if ($page != $total)
	$nextpage = " <a class=pages_title href='{$url_pages_news}" . $total . "'>></a>";
if ($page - 3 > 0)
	$page3left = " <a class=pages_title href='{$url_pages_news}" . ($page - 3) . "'>" . ($page - 3) . "</a> ";
if ($page - 2 > 0)
	$page2left = " <a class=pages_title href='{$url_pages_news}" . ($page - 2) . "'>" . ($page - 2) . "</a> ";
if ($page - 1 > 0)
	$page1left = "<a class=pages_title href='{$url_pages_news}" . ($page - 1) . "'>" . ($page - 1) . "</a> ";
if ($page + 3 <= $total)
	$page3right = " <a class=pages_title href='{$url_pages_news}" . ($page + 3) . "'>" . ($page + 3) . "</a>";
if ($page + 2 <= $total)
	$page2right = " <a class=pages_title href='{$url_pages_news}" . ($page + 2) . "'>" . ($page + 2) . "</a>";
if ($page + 1 <= $total)
	$page1right = " <a class=pages_title href='{$url_pages_news}" . ($page + 1) . "'>" . ($page + 1) . "</a>";

$_pages = '<div>Страницы: ' . $pervpage . $page3left . $page2left . $page1left . "<span class=pages_title_activ>" . $page . "</span>" . $page1right . $page3right . $page2right . $nextpage . '</div><br>';

return array($_pages, $start, $num);

Не чего сложно тут нет, просто понять логику и все :)
 
PHP_Master, подскажи как прикрутить тот скрипт, который ты посоветовал.
У меня инфа хранится в TXT файле.
file.txt:
Товар1|Описание1|Дата1|Автор1
Товар2|Описание2|Дата2|Автор2
index.php:
PHP:
require_once "./Pager/Pager.php";
$files = file("files.txt");
$myData = array();
foreach($files as $tovar) { 
$line = explode('|', $tovar);
$str =  "<tr><td>".$line[0]."</td><td>".$line[1]."</td></tr>";
$myData[] = $str;
}

// Настройки Pager
$params = array(
    'itemData' => $myData,
    'perPage' => 10,
    'delta' => 8,             // for 'Jumping'-style a lower number is better
    'append' => true,
    //'separator' => ' | ',
    'clearIfVoid' => false,
    'urlVar' => 'entrant',
    'useSessions' => true,
    'closeSession' => true,
    //'mode'  => 'Sliding',    //try switching modes
    'mode'  => 'Jumping',
);
$pager = & Pager::factory($params);
$page_data = $pager->getPageData();
$links = $pager->getLinks();
$selectBox = $pager->getPerPageSelectBox();

echo "
<table summary='example 1'>
".$links['all']."
  <tr>
    <td colspan='6'>".print_r($page_data)."</td>
  </tr>
</table>
<form action='".$_SERVER['PHP_SELF']."' method='GET'>
На страницу:<br />".$selectBox." &nbsp;
<input type='submit' value='Выбрать' />
</form>";
Как мне изменить PHP-код?
Я добавляю настройки, а что дальше делать не понимаю, покрутил, но корректного вывода не получил.
 
Рекомендую взять за основу профессиональный и небольшой класс Pagination, из пакета CodeIgniter. Все просто и ясно работает без глюков. Много настроек форматирования. Класс простой имеет все необходимые настройки, легко адаптируется под любые нужды.
Ссылку на скачку пакета найдете на главной страницы codeigniter.com, там в библиотеках найдете файл Pagination.php.
Вот здесь описание класса и пример: codeigniter.com/user_guide/libraries/pagination.html

Скопировал сюда сам класс на всякий случай:
PHP:
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 4.3.2 or newer
 *
 * @package		CodeIgniter
 * @author		ExpressionEngine Dev Team
 * @copyright	Copyright (c) 2008, EllisLab, Inc.
 * @license		codeigniter.com/user_guide/license.html
 * @link		codeigniter.com
 * @since		Version 1.0
 * @filesource
 */

// ------------------------------------------------------------------------

/**
 * Pagination Class
 *
 * @package		CodeIgniter
 * @subpackage	Libraries
 * @category	Pagination
 * @author		ExpressionEngine Dev Team
 * @link		codeigniter.com/user_guide/libraries/pagination.html
 */
class CI_Pagination {

	var $base_url			= ''; // The page we are linking to
	var $total_rows  		= ''; // Total number of items (database results)
	var $per_page	 		= 10; // Max number of items you want shown per page
	var $num_links			=  2; // Number of "digit" links to show before/after the currently viewed page
	var $cur_page	 		=  0; // The current page being viewed
	var $first_link   		= '&lsaquo; First';
	var $next_link			= '&gt;';
	var $prev_link			= '&lt;';
	var $last_link			= 'Last &rsaquo;';
	var $uri_segment		= 3;
	var $full_tag_open		= '';
	var $full_tag_close		= '';
	var $first_tag_open		= '';
	var $first_tag_close	= '&nbsp;';
	var $last_tag_open		= '&nbsp;';
	var $last_tag_close		= '';
	var $cur_tag_open		= '&nbsp;<b>';
	var $cur_tag_close		= '</b>';
	var $next_tag_open		= '&nbsp;';
	var $next_tag_close		= '&nbsp;';
	var $prev_tag_open		= '&nbsp;';
	var $prev_tag_close		= '';
	var $num_tag_open		= '&nbsp;';
	var $num_tag_close		= '';
	var $page_query_string	= FALSE;
	var $query_string_segment = 'per_page';

	/**
	 * Constructor
	 *
	 * @access	public
	 * @param	array	initialization parameters
	 */
	function CI_Pagination($params = array())
	{
		if (count($params) > 0)
		{
			$this->initialize($params);		
		}
		
		log_message('debug', "Pagination Class Initialized");
	}
	
	// --------------------------------------------------------------------
	
	/**
	 * Initialize Preferences
	 *
	 * @access	public
	 * @param	array	initialization parameters
	 * @return	void
	 */
	function initialize($params = array())
	{
		if (count($params) > 0)
		{
			foreach ($params as $key => $val)
			{
				if (isset($this->$key))
				{
					$this->$key = $val;
				}
			}
		}
	}
	
	// --------------------------------------------------------------------
	
	/**
	 * Generate the pagination links
	 *
	 * @access	public
	 * @return	string
	 */	
	function create_links()
	{
		// If our item count or per-page total is zero there is no need to continue.
		if ($this->total_rows == 0 OR $this->per_page == 0)
		{
		   return '';
		}

		// Calculate the total number of pages
		$num_pages = ceil($this->total_rows / $this->per_page);

		// Is there only one page? Hm... nothing more to do here then.
		if ($num_pages == 1)
		{
			return '';
		}

		// Determine the current page number.		
		$CI =& get_instance();
		
		if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
		{
			if ($CI->input->get($this->query_string_segment) != 0)
			{
				$this->cur_page = $CI->input->get($this->query_string_segment);
				
				// Prep the current page - no funny business!
				$this->cur_page = (int) $this->cur_page;
			}
		}
		else
		{
			if ($CI->uri->segment($this->uri_segment) != 0)
			{
				$this->cur_page = $CI->uri->segment($this->uri_segment);
				
				// Prep the current page - no funny business!
				$this->cur_page = (int) $this->cur_page;
			}
		}

		$this->num_links = (int)$this->num_links;
		
		if ($this->num_links < 1)
		{
			show_error('Your number of links must be a positive number.');
		}
				
		if ( ! is_numeric($this->cur_page))
		{
			$this->cur_page = 0;
		}
		
		// Is the page number beyond the result range?
		// If so we show the last page
		if ($this->cur_page > $this->total_rows)
		{
			$this->cur_page = ($num_pages - 1) * $this->per_page;
		}
		
		$uri_page_number = $this->cur_page;
		$this->cur_page = floor(($this->cur_page/$this->per_page) + 1);

		// Calculate the start and end numbers. These determine
		// which number to start and end the digit links with
		$start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1;
		$end   = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages;

		// Is pagination being used over GET or POST?  If get, add a per_page query
		// string. If post, add a trailing slash to the base URL if needed
		if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
		{
			$this->base_url = rtrim($this->base_url).'&amp;'.$this->query_string_segment.'=';
		}
		else
		{
			$this->base_url = rtrim($this->base_url, '/') .'/';
		}

  		// And here we go...
		$output = '';

		// Render the "First" link
		if  ($this->cur_page > ($this->num_links + 1))
		{
			$output .= $this->first_tag_open.'<a href="'.$this->base_url.'">'.$this->first_link.'</a>'.$this->first_tag_close;
		}

		// Render the "previous" link
		if  ($this->cur_page != 1)
		{
			$i = $uri_page_number - $this->per_page;
			if ($i == 0) $i = '';
			$output .= $this->prev_tag_open.'<a href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'.$this->prev_tag_close;
		}

		// Write the digit links
		for ($loop = $start -1; $loop <= $end; $loop++)
		{
			$i = ($loop * $this->per_page) - $this->per_page;
					
			if ($i >= 0)
			{
				if ($this->cur_page == $loop)
				{
					$output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page
				}
				else
				{
					$n = ($i == 0) ? '' : $i;
					$output .= $this->num_tag_open.'<a href="'.$this->base_url.$n.'">'.$loop.'</a>'.$this->num_tag_close;
				}
			}
		}

		// Render the "next" link
		if ($this->cur_page < $num_pages)
		{
			$output .= $this->next_tag_open.'<a href="'.$this->base_url.($this->cur_page * $this->per_page).'">'.$this->next_link.'</a>'.$this->next_tag_close;
		}

		// Render the "Last" link
		if (($this->cur_page + $this->num_links) < $num_pages)
		{
			$i = (($num_pages * $this->per_page) - $this->per_page);
			$output .= $this->last_tag_open.'<a href="'.$this->base_url.$i.'">'.$this->last_link.'</a>'.$this->last_tag_close;
		}

		// Kill double slashes.  Note: Sometimes we can end up with a double slash
		// in the penultimate link so we'll kill all double slashes.
		$output = preg_replace("#([^:])//+#", "\\1/", $output);

		// Add the wrapper HTML if exists
		$output = $this->full_tag_open.$output.$this->full_tag_close;
		
		return $output;		
	}
}
// END Pagination Class

/* End of file Pagination.php */

$rpp = 5;

for($i = $_REQUEST['page'] * $rpp; $i < count($lines);++$i)
{
echo '...';
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху