Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 28 мар 2024, 16:53

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Pagination
СообщениеДобавлено: 06 авг 2012, 01:46 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Я когда-то делал paginator для одной моей самописной CMS. Если кому то интересно, могу покопаться и выложить код.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pagination
СообщениеДобавлено: 06 авг 2012, 12:02 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 12 фев 2012, 01:02
Сообщения: 462
Wapruks - лимит берет с первой записи, например с 1 по 10. А offset нужен, чтобы взять, например, с 20 по 30.
AmberLEX - это не его код :)
Sergey - выкладывайте конечно

_________________
kohanaframework.su - обучение фреймворку Kohana


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pagination
СообщениеДобавлено: 06 авг 2012, 19:21 
Не в сети
Новичок

Зарегистрирован: 03 июл 2012, 14:46
Сообщения: 17
Да не, смысл limit(); и offset(); я понимаю. Но не понимаю для чего может еще пригодится в реальном проекте offset(); кроме пагинации


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pagination
СообщениеДобавлено: 06 авг 2012, 20:01 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Когда то, очень давно, когда динозавры были большими, а телевизоров ещё не было :) ... в общем делал я это как то так:

HTML
Код:
<div id="page-navigation">
  <?php $objPaginator = new Paginator; $objBase = new $Base; ?>
  <span class="pages">Страница <?php echo $objBase->leaf; ?> из <?php echo $objPaginator::countPages( $objBase->newsInStart, 'publish' ); ?></span>
  <?php $objPaginator::printLinks($objBase->leaf, $objBase->newsInStart, 'publish'); ?>
</div>


Класс Base
Код:
class Base {
// ...
    // текущая страница на сайте
    public $leaf;
    // Новости
    public $postNews = array();
    // Количество новостей на главной
    public $newsInStart;
    // с какой строки начинаем выборку из БД
    private $currStrDB = 0;
// ...

    // Конструктор класса
    public function __construct() {
      // Берём с БД настройку отвечающую за кол-во статей на главной странице
      $this->newsInStart = ( int )Options::getOptionValue( 'news_in_start' );
      // ...
    }

    public function init( ) {
        if( $this->leaf = isset( $_GET['leaf'] ) ? $_GET['leaf'] : 1){
            if( is_numeric( $this->leaf ) ){
                if( ( int )$this->leaf < 1  )
                    $this->leaf = 1;
                elseif( ( ( int )$this->leaf ) > ( Posts::countPosts( 'publish' ) ) ){
                    $this->leaf = 1;
                    header( "Status: 404 Not Found" );
                }
            }
            else{
                $this->leaf = 1;
                header( "Status: 404 Not Found" );
            }
            $this->currStrDB = ceil( $this->newsInStart * ( $this->leaf-1 ) );
            $this->postNews = Posts::getPostAll( 'publish', $this->currStrDB, $this->newsInStart );
        }
// ...


Класс Posts
Код:
class Posts {
// ...
public static function getPostAll(  $published = '', $from, $limit ) {
  if( $published ==  'publish' || $published ==  'pending' ) {
      if( $limit != 0 )
        $sql = "SELECT * FROM `ant_posts` WHERE `post_status` = ? ORDER BY `post_date` DESC LIMIT " . $from . ", " .$limit;
      else
        $sql = "SELECT * FROM `ant_posts` WHERE `post_status` = ? ORDER BY `post_date` DESC";
      return DatabaseHandler::GetAll( $sql, array( $published ) );
  }
  else {
    $sql = "SELECT * FROM `ant_posts` ORDER BY `post_date` DESC";
    return DatabaseHandler::GetAll( $sql );
  }
}
// ...
public static function countPosts( $status = null ) {
  $result = null;
  try {
    $sql = "SELECT COUNT(*) FROM `ant_posts`";
    if( $status )
      $sql .= "  WHERE `post_status` = ?";
    $result = DatabaseHandler::GetOne( $sql, array( $status ) );
  }
  catch ( Exception $e ) {
    trigger_error( $e->getMessage(), E_USER_ERROR );
  }
  return $result;
}


Класс Paginator
Код:
class Paginator {
  // общее кол-во ссылок
  const MAX_LINKS = 10;
  // ...


    public static function countPages( $ppp, $status = null ) {
      $result = null;
      try {
        $result = ceil( Posts::countPosts( $status ) / $ppp );
      }
      catch ( Exception $e ) {
        trigger_error( $e->getMessage(), E_USER_ERROR );
      }
      return $result;
    }

    public static function printLinks( $current_page, $ppp, $status = null ) {
      $result = null;
      // общее кол-во ссылок
      $all_pages = self::countPages( $ppp, $status );
      // с какой цифры начать построение ссылок на страницы
      $start = 1;
      // сколько раз проводить итерацию цикла по обходу страниц
      $final = ( $all_pages  < self::MAX_LINKS ) ? $all_pages : self::MAX_LINKS;

      try {
        // если общее кол-во страниц > 1
        if( $all_pages > 1 ) {
          if( $all_pages > 10 ) {
            if( $current_page > self::MAX_LINKS ) {
              $start = ( $current_page - self::MAX_LINKS ) + 1;
              $result .= '<a class="nextpostslink" href="/?leaf=' . ( $start - 1 ) . '">&laquo;</a>';
            }
            else
              $start = 1;
          }
          for( $i = $start; $i < ( $final + $start ); $i++ ) {
            // если это текущая страница
            if( $current_page == $i )
              $result .= '<span class="current">' . $i . '</span>';
            // если это не текущая страница
            else {
              $result .= '<a class="page" href="/?leaf=' . $i . '">' . $i . '</a>';
            }
          }
          // ссылка далее
          if( $all_pages > ( $i -1 ) )
            $result .= '<a class="nextpostslink" href="/?leaf=' . $i . '">&raquo;</a>';
        }
        // если общее кол-во страниц = 1
        else
          $result .= '<span class="current">' . $all_pages . '</span>';
      }
      catch ( Exception $e ) {
        trigger_error( $e->getMessage(), E_USER_ERROR );
      }
      return $result;
    }

  }


Получалось что то вроде того, что на скриншоте. См. атачмент


Вложения:
paginator.png
paginator.png [ 1.65 КБ | Просмотров: 6482 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pagination
СообщениеДобавлено: 25 сен 2012, 12:45 
Не в сети
Зеленый

Зарегистрирован: 25 сен 2012, 12:43
Сообщения: 2
Есть контроллер page.php
Код:
<?php defined('SYSPATH') or die('No direct script access.');
 
class Controller_Page extends Controller_Common {
 
    // Главная страница
    public function action_index()
    {
        $articles = array();
         $content = View::factory('/pages/show')->bind('articles', $articles);
        $content->pagination = Pagination::factory(array('total_items' => 3));

       // print_r($content->pagination);die;
       
        $article = new Model_Article();
        $articles = $article->get_all($content->pagination->current_page,$content->pagination->items_per_page);
       
        $this->template->content = $content;
    }
 
}



Есть модель article.php
Код:
<?php defined('SYSPATH') or die('No direct script access.');
 
class Model_Article extends Model
{
    protected $_tableArticles = 'articles';
 
    /**
     * Get all articles
     * @return array
     */
    public function get_all($limit,$perpage)
    {
        return DB::select()->from($this->_tableArticles)->limit($limit)->offset($perpage)
                   ->execute();
    }


Бутстрап:
Код:
Route::set('page', 'page(/<action>(/<page>)(/<id>))', array('page'=>'[0-9]+'))
        ->defaults(array(
           
            'controller' => 'page',
            'action' => 'index'
        ));

Выводит пагинатор, но не кликаются страницы.
Подскажите пожалуйста в чем вопрос?


Последний раз редактировалось Sergey 26 сен 2012, 03:58, всего редактировалось 1 раз.
Обернул исходники в [code]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pagination
СообщениеДобавлено: 26 сен 2012, 04:08 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Код:
  
<?php
// ...
public function action_index()
  {
    $content = View::factory('pages/show')
             ->bind('pagination', $pagination)
             ->bind('articles', $articles);


    $article = new Model_Article();

    $articles = NULL;
    $total = $article->count_all(); // Эту функцию вам нужно реализовать

    if ($total > 0)
    {
      // При желании передаём и другие параметры в $pagination
      $pagination = Pagination::factory(array('total_items' => $total))
                  ->route_params(array(
                    'directory' => Request::current()->directory(),
                    'controller' => Request::current()->controller(),
                    'action' => Request::current()->action(),
      ));
      $articles  = $article->get_all($pagination->items_per_page, $pagination->offset);
    }

    $this->template->content = $content;
  }


Код:
    public function get_all($limit,$offset)
    {
        return DB::select()->from($this->_tableArticles)->limit($limit)->offset($offset)
                   ->execute();
    }


Код:
  Route::set('page', '<controller>(/<action>)(/<id>)(/p<page>)', array('id' => '\d+', 'page'  => '\d+'))
  ->defaults(array(
    'controller' => 'page'
  ));


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pagination
СообщениеДобавлено: 26 сен 2012, 12:44 
Не в сети
Зеленый

Зарегистрирован: 25 сен 2012, 12:43
Сообщения: 2
спасибо вам большое!!!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pagination
СообщениеДобавлено: 26 сен 2012, 23:20 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Велкам )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pagination
СообщениеДобавлено: 26 мар 2013, 23:40 
Не в сети
Зеленый

Зарегистрирован: 26 мар 2013, 00:25
Сообщения: 1
Не дождался ответа тут, так что задаю тут :)

Денис,

Подскажите пожалуйста, какой роут у вас используется на http://kohanaframework.su/kohana/articles для articles?

А то не могу никак сообразить, как вы сделали так, что бы по
http://kohanaframework.su/kohana/articles/2 — были страницы, а по
http://kohanaframework.su/kohana/articles/articlе2 — была статья.

Спасибо. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Pagination
СообщениеДобавлено: 26 мар 2013, 23:48 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Kiz писал(а):
Не дождался ответа тут, так что задаю тут :)

Денис,

Подскажите пожалуйста, какой роут у вас используется на http://kohanaframework.su/kohana/articles для articles?

А то не могу никак сообразить, как вы сделали так, что бы по
http://kohanaframework.su/kohana/articles/2 — были страницы, а по
http://kohanaframework.su/kohana/articles/articlе2 — была статья.

Спасибо. :)



Код:
Route::set('article', 'kohana/articles/(article)<id>', array(
    'id'         => '\d+',
))
->
defaults(array(
    'controller' => 'kohana',
    'action'     => 'articles',
));
 


или так


Код:
Route::set('article', '<controller>/<action>/(article)<id>', array(
    'id'         => '\d+',
))
->
defaults(array(
    'controller' => 'kohana',
    'action'     => 'articles',
));
 


первый вариант предпочтительнее


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group