【问题标题】:How do I always keep the "next" and "previous" links in this Codeigniter 3 pagination?如何始终在此 Codeigniter 3 分页中保留“下一个”和“上一个”链接?
【发布时间】:2021-07-27 10:16:29
【问题描述】:

我正在开发一个在线 newspaper/blogging application with CodeIgniter 3.1.8(链接到 GitHub 存储库)和 Twitter Bootstrap 4。

应用程序有主题。其中一个主题使用 pager 而不是分页,因此 Codeigniter 默认分页不太适合它。

我为这个问题找到的“hack”依赖于 CSS

在 Posts 控制器中我有:

class Posts extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
    
    private function _initPagination($path, $totalRows, $query_string_segment = 'page')
    {
        //load and configure pagination 
        $this->load->library('pagination');
        $config['base_url']             = base_url($path);
        $config['query_string_segment'] = $query_string_segment;
        $config['enable_query_strings'] = TRUE;
        $config['reuse_query_string']   = TRUE;
        $config['total_rows']           = $totalRows;
        $config['per_page']             = 12;
        if (!isset($_GET[$config['query_string_segment']]) || $_GET[$config['query_string_segment']] < 1) {
            $_GET[$config['query_string_segment']] = 1;
        }
        $this->pagination->initialize($config);
        
        $limit  = $config['per_page'];
        $offset = ($this->input->get($config['query_string_segment']) - 1) * $limit;
        
        return array(
            'limit' => $limit,
            'offset' => $offset
        );
    }
    
    public function index()
    {
        
        //call initialization method
        $config = $this->_initPagination("/", $this->Posts_model->get_num_rows());
        
        $data                  = $this->Static_model->get_static_data();
        $data['base_url']      = base_url("/");
        $data['pages']         = $this->Pages_model->get_pages();
        $data['categories']    = $this->Categories_model->get_categories();
        $data['search_errors'] = validation_errors();
        
        //use limit and offset returned by _initPaginator method
        $data['posts'] = $this->Posts_model->get_posts($config['limit'], $config['offset']);
        $this->twig->addGlobal('pagination', $this->pagination->create_links());
        
        // featured posts
        if ($data['is_featured']) {
            $data['featured'] = $this->Posts_model->featured_posts();
            $this->twig->addGlobal('featuredPosts', "themes/{$data['theme_directory']}/partials/hero.twig");
        }
        
        $this->twig->display("themes/{$data['theme_directory']}/layout", $data);
    }
    
    public function search()
    {
        // Force validation since the form's method is GET
        $this->form_validation->set_data($this->input->get());
        $this->form_validation->set_rules('search', 'search term', 'required|trim|min_length[3]', array(
            'min_length' => 'The search term must be at least 3 characters long.'
        ));
        $this->form_validation->set_error_delimiters('<p class = "error search-error">', '</p>');
        // If search fails
        if ($this->form_validation->run() === FALSE) {
            $data['search_errors'] = validation_errors();
            return $this->index();
        } else {
            $expression           = $this->input->get('search');
            $posts_count          = $this->Posts_model->search_count($expression);
            $query_string_segment = 'page';
            $config               = $this->_initPagination("/posts/search", $posts_count, $query_string_segment);
            $data                 = $this->Static_model->get_static_data();
            $data['base_url']     = base_url("/");
            $data['pages']        = $this->Pages_model->get_pages();
            $data['categories']   = $this->Categories_model->get_categories();
            //use limit and offset returned by _initPaginator method
            $data['posts']        = $this->Posts_model->search($expression, $config['limit'], $config['offset']);
            $data['expression']   = $expression;
            $data['posts_count']  = $posts_count;
            $this->twig->addGlobal('pagination', $this->pagination->create_links());
            $this->twig->display("themes/{$data['theme_directory']}/layout", $data);
    }
}

在样式表中,我隐藏了除“上一个”和“下一个”按钮之外的页面项目:

.pagination li:first-child {
  display: inline-block;
  margin-right: auto;
}

.pagination li.active + li {
  display: inline-block;
  margin-left: auto;
}

.pagination li,
.pagination li.active {
  display: none;
  position: relative;
}

.pagination li:first-child a::before,
.pagination li.active + li a::before {
  display: inline-block;
  font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  background-color: #0085a1;
  border: 1px solid #006d83;
  color: #fff;
  font-size: 14px;
  font-weight: 800;
  padding: 15px 25px;
  letter-spacing: 1px;
  text-transform: uppercase;
}

.pagination li:first-child a::before {
  content: 'Newer Posts';
  padding-left: 35px;
}

.pagination li.active + li a::before {
  content: 'Older Posts';
  padding-right: 35px;
}

.pagination li:first-child a::after,
.pagination li.active + li a::after {
  color: #fff;
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}

.pagination li:first-child a::after {
  content: '\2190';
  left: 7px;
}

.pagination li.active + li a::after {
  content: '\1F812';
  right: 7px;
}

结果如下图:

问题

当我在最后一页时,“较新帖子”按钮链接到第一页而不是上一页

我得出的结论是,我错过了一种始终保留“下一个”和“上一个”链接的方法。


问题:

如何始终保留“下一个”和“上一个”链接?

【问题讨论】:

  • 我在 codeigniter 3 中实现了自己的分页,因为我想显示五个链接,即第一个、上一个、当前(禁用)、下一个、最后一个。如果你想完全控制分页,实现你自己的。

标签: php codeigniter


【解决方案1】:
$config[‘first_link’] = False;
$config[‘last_link’] = False;

将此添加到您的配置中,然后您将不会在分页中获得第一页和最后一页链接

如果您不想列出特定页面(例如,您只需要“下一个”和“上一个”链接),您可以通过添加以下内容来抑制它们的呈现:

$config['display_pages'] = FALSE;

https://codeigniter.com/userguide3/libraries/pagination.html#id12

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-04-08
  • 2014-12-14
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 2013-08-26
相关资源
最近更新 更多