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

Тема в разделе "PHP", создана пользователем NewS, 12 ноя 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. NewS

    NewS

    Регистр.:
    15 авг 2008
    Сообщения:
    255
    Симпатии:
    84
    У меня таблица рисуется с помощью foreach
    PHP:
    foreach($nfiles as $line) {
    echo 
    "<tr><td></td></tr>";
    }
    как можно сделать постраничный вывод строк?
    Например по 20 строк на страницу.
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    http://pear.php.net/package/Pager
     
    NewS нравится это.
  3. NewS

    NewS

    Регистр.:
    15 авг 2008
    Сообщения:
    255
    Симпатии:
    84
    А это единственный способ, может есть еще какие варианты?
    Неужели для этого нужно 180Кб кода?
     
  4. Thrustmaster

    Thrustmaster Читатель

    Заблокирован
    Регистр.:
    21 окт 2008
    Сообщения:
    4
    Симпатии:
    0
    $stroka = 1;

    if($stroka < 20){

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

    }

    Думаю так должно работать.
     
  5. NewS

    NewS

    Регистр.:
    15 авг 2008
    Сообщения:
    255
    Симпатии:
    84
    И как это должно работать? :)
     
  6. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Не единственный - в гугл с запросом "pagination php"
     
  7. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    ну как можно сделать... Берешь, узнаешь количество результирующих записей, если их больше чем 20 например, то выводишь только первые 20. Через строку браузера (запрос типа "GET") читаешь номер страницы и выводишь записи, начиная с (20 * (номер страницы) - 20) по (20 * (номер страницы)).

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

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

    DIAgen Постоялец

    Регистр.:
    30 окт 2006
    Сообщения:
    134
    Симпатии:
    72
    Вот кусочек кода из моей системы постраничному выводу

    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 0)
        
    $page3left " <a class=pages_title href='{$url_pages_news}. ($page 3) . "'>" . ($page 3) . "</a> ";
    if (
    $page 0)
        
    $page2left " <a class=pages_title href='{$url_pages_news}. ($page 2) . "'>" . ($page 2) . "</a> ";
    if (
    $page 0)
        
    $page1left "<a class=pages_title href='{$url_pages_news}. ($page 1) . "'>" . ($page 1) . "</a> ";
    if (
    $page <= $total)
        
    $page3right " <a class=pages_title href='{$url_pages_news}. ($page 3) . "'>" . ($page 3) . "</a>";
    if (
    $page <= $total)
        
    $page2right " <a class=pages_title href='{$url_pages_news}. ($page 2) . "'>" . ($page 2) . "</a>";
    if (
    $page <= $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);
    Не чего сложно тут нет, просто понять логику и все :)
     
  9. NewS

    NewS

    Регистр.:
    15 авг 2008
    Сообщения:
    255
    Симпатии:
    84
    PHP_Master, подскажи как прикрутить тот скрипт, который ты посоветовал.
    У меня инфа хранится в TXT файле.
    file.txt:
    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-код?
    Я добавляю настройки, а что дальше делать не понимаю, покрутил, но корректного вывода не получил.
     
  10. coden

    coden Создатель

    Регистр.:
    29 ноя 2008
    Сообщения:
    36
    Симпатии:
    32
    Рекомендую взять за основу профессиональный и небольшой класс 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 == 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 '...';
    }
     
Статус темы:
Закрыта.