Блог-приложение Codeigniter 3: как избежать использования избыточного массива разбивки $ config? - PullRequest
0 голосов
/ 19 мая 2018

Я работаю над приложением блога в Codeigniter 3.1.8.

У меня есть Сообщений контроллер на

application / controllers / Posts.php

У меня есть Категории контроллер на

application / controllers / Categories.php

В Сообщениях контроллер у меня есть:

public function index() {
    $this->load->library('pagination');
    $config = [
        'base_url' => base_url("/posts"),
        'page_query_string' => TRUE,
        'query_string_segment' => 'page',
        'display_pages' => TRUE,
        'use_page_numbers' => TRUE,
        'per_page' => 12,
        'total_rows' => $this->Posts_model->get_num_rows(),
        'uri_segment' => 3,
        'first_link' => '«',
        'first_tag_open' =>  '<li>',
        'first_tag_close' => '</li>',
        'last_link' => '&raquo;',
        'last_tag_open' =>  '<li>',
        'last_tag_close' => '</li>',
        'full_tag_open' =>  '<ul class="pagination">',
        'full_tag_close' => '</ul>',
        'next_link' =>  '&rsaquo;',
        'next_tag_open' =>  '<li>',
        'next_tag_close' => '</li>',
        'prev_link' => '&lsaquo;',
        'prev_tag_open' =>  '<li>',
        'prev_tag_close' => '</li>',
        'num_tag_open' =>   '<li>',
        'num_tag_close' =>  '</li>',
        'cur_tag_open' =>   '<li class="active"><span>',
        'cur_tag_close' =>  '</span></li>'
    ];
     // More code
}

Массив $config в контроллере категорий почти такой же :

public function posts($id) {
    $this->load->library('pagination');
    $config = [
        'base_url' => base_url('/categories/posts/' . $id),
        'page_query_string' => TRUE,
        'query_string_segment' => 'page',
        'display_pages' => TRUE,
        'use_page_numbers' => TRUE,
        'per_page' => 12,
        'total_rows' => $this->Posts_model->get_num_rows_by_category($id),
        'uri_segment' => 3,
        'first_link' => '&laquo;',
        'first_tag_open' =>  '<li>',
        'first_tag_close' => '</li>',
        'last_link' => '&raquo;',
        'last_tag_open' =>  '<li>',
        'last_tag_close' => '</li>',
        'full_tag_open' =>  '<ul class="pagination">',
        'full_tag_close' => '</ul>',
        'next_link' =>  '&rsaquo;',
        'next_tag_open' =>  '<li>',
        'next_tag_close' => '</li>',
        'prev_link' => '&lsaquo;',
        'prev_tag_open' =>  '<li>',
        'prev_tag_close' => '</li>',
        'num_tag_open' =>   '<li>',
        'num_tag_close' =>  '</li>',
        'cur_tag_open' =>   '<li class="active"><span>',
        'cur_tag_close' =>  '</span></li>'
    ];
}

Как создать "базовый" массив $config, который для каждого контроллера этоЯ бы только написал, что является специфическим ?

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Согласно моей идее, вам необходимо создать одну общую функциональную модель и автоматически загрузить эту модель в autoload.php

. Для справки, пожалуйста, проверьте следующий код.

Создать модель Common_function_modelвнутри application/models

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

Class Common_functions_model extends CI_Model {

public function get_pagination_config($settings = array()) {

    $config = [
        'base_url' => isset($settings['base_url']) ? $settings['base_url'] : base_url(),
        'page_query_string' => isset($settings['page_query_string']) ? $settings['page_query_string'] : TRUE,
        'query_string_segment' => isset($settings['query_string_segment']) ? $settings['query_string_segment'] : 'page',
        'display_pages' => isset($settings['display_pages']) ? $settings['display_pages'] : TRUE,
        'use_page_numbers' => isset($settings['use_page_numbers']) ? $settings['use_page_numbers'] : TRUE,
        'per_page' => isset($settings['per_page']) ? $settings['per_page'] : 12,
        'total_rows' => isset($settings['total_rows']) ? $settings['total_rows'] : "",
        'uri_segment' => isset($settings['uri_segment']) ? $settings['uri_segment'] : 3,
        'first_link' => isset($settings['first_link']) ? $settings['first_link'] : '&laquo;',
        'first_tag_open' => isset($settings['first_tag_open']) ? $settings['first_tag_open'] : '<li>',
        'first_tag_close' => isset($settings['first_tag_close']) ? $settings['first_tag_close'] : '</li>',
        'last_link' => isset($settings['last_link']) ? $settings['last_link'] : '&raquo;',
        'last_tag_open' => isset($settings['last_tag_open']) ? $settings['last_tag_open'] : '<li>',
        'last_tag_close' => isset($settings['last_tag_close']) ? $settings['last_tag_close'] : '</li>',
        'full_tag_open' => isset($settings['full_tag_open']) ? $settings['full_tag_open'] : '<ul class="pagination">',
        'full_tag_close' => isset($settings['full_tag_close']) ? $settings['full_tag_close'] : '</ul>',
        'next_link' => isset($settings['next_link']) ? $settings['next_link'] : '&rsaquo;',
        'next_tag_open' => isset($settings['next_tag_open']) ? $settings['next_tag_open'] : '<li>',
        'next_tag_close' => isset($settings['next_tag_close']) ? $settings['next_tag_close'] : '</li>',
        'prev_link' => isset($settings['prev_link']) ? $settings['prev_link'] : '&lsaquo;',
        'prev_tag_open' => isset($settings['prev_tag_open']) ? $settings['prev_tag_open'] : '<li>',
        'prev_tag_close' => isset($settings['prev_tag_close']) ? $settings['prev_tag_close'] : '</li>',
        'num_tag_open' => isset($settings['num_tag_open']) ? $settings['num_tag_open'] : '<li>',
        'num_tag_close' => isset($settings['num_tag_close']) ? $settings['num_tag_close'] : '</li>',
        'cur_tag_open' => isset($settings['cur_tag_open']) ? $settings['cur_tag_open'] : '<li class="active"><span>',
        'cur_tag_close' => isset($settings['cur_tag_close']) ? $settings['cur_tag_close'] : '</span></li>'
    ];
    return $config;
}

}

для вашего Post контроллера.Измените свой код на следующий.

public function index() {
    $this->load->library('pagination');
    $settings = array(
        "base_url" => base_url("/posts"),
        "total_rows" => $this->Posts_model->get_num_rows(),
    );

    $config = $this->common_functions_model->get_pagination_config($settings);
    // More code
}

Для вашего Categories контроллера.Измените ваш код на следующий.

public function posts($id) {
    $this->load->library('pagination');
    $settings = array(
        "base_url" => base_url('/categories/posts/' . $id),
        "total_rows" => $this->Posts_model->get_num_rows_by_category($id),
    );

    $config = $this->common_functions_model->get_pagination_config($settings);
}

Вы можете использовать функцию get_pagination_config на любом контроллере с теми аргументами, которые вы хотите изменить.

Обратите внимание, что вам нужно автоматически загрузить common_functions_model в файле autoload.php.

0 голосов
/ 21 мая 2018

Единственное, что вам нужно сделать, это создать файл конфигурации pagination.php и поместить в него все, что вам нужно.
При следующей загрузке библиотеки разбивки на страницы он будет использовать этот файл, и вы можете переопределить то, что хранится впри использовании

$config['whatever'] = 'anything';

// Option: 1
$this->load->library('pagination', $config);

// Option: 2
$this->load->library('pagination');
$this->pagination->initialize($config);

Almot все библиотеки CodeIgniter могут иметь свои собственные файлы конфигурации, не нужно создавать библиотеку или вспомогательный метод или даже метод контроллера для обработки того, что может сделать файл конфигурации.
Вы хотитеиметь постоянную конфигурацию пагинации для всего вашего приложения, с возможностью динамического изменения?Используйте файл конфигурации pagination.php и перестаньте тратить свое время и время на написание целой библиотеки или помощника, чтобы справиться с этим.

0 голосов
/ 19 мая 2018

Вы можете создать библиотеку с методом, а затем использовать ее во всем приложении.Как у меня есть файл библиотеки Nuts_lib.php с методом generate_pagination() в папке libraries

public function generate_pagination($url, $total_rows, $per_page = 10, $num_link = 5) {
    $this->CI->load->library('pagination');
    $config['base_url'] = site_url_tr($url);
    $config['total_rows'] = $total_rows;
    $config['per_page'] = $per_page;
    $config['num_links'] = $num_link;
    $config['enable_query_strings'] = TRUE;
    $config['use_page_numbers'] = TRUE;
    $config['query_string_segment'] = 'page';
    $config['page_query_string'] = TRUE;
    $config['full_tag_open'] = '<ul class="pagination no-margin">';
    $config['full_tag_close'] = '</ul>';
    $config['cur_tag_open'] = '<li class="active"><a href="javascript:void();">';
    $config['cur_tag_close'] = '</a></li>';
    $config['prev_tag_open'] = '<li>';
    $config['prev_tag_close'] = '</li>';
    $config['next_tag_open'] = '<li>';
    $config['next_tag_close'] = '</li>';
    $config['num_tag_open'] = '<li>';
    $config['num_tag_close'] = '</li>';
    $config['last_tag_open'] = '<li>';
    $config['last_tag_close'] = '</li>';
    $config['first_tag_open'] = '<li>';
    $config['first_tag_close'] = '</li>';
    $config['next_link'] = 'Next >';
    $config['prev_link'] = '< Prev';
    $config['first_link'] = 'First';
    $config['last_link'] = 'Last';
    $this->CI->pagination->initialize($config);
    return $this->CI->pagination->create_links();
}

Нет, я использую его в контроллерах следующим образом

$total_rows = $this->db->get('routes')->num_rows();
$per_page = 15;
$num_links = 5;
$url = 'routes/all';
$links = $this->nl->generate_pagination($url, $total_rows, $per_page, $num_links);

    if ($this->input->get('page')) {
        $sgm = (int) trim($this->input->get('page'));
        $segment = $per_page * ($sgm - 1);
    } else {
        $segment = 0;
    }

    $data = array(
        'title' => lang('all_routes'),
        'routes' => $this->rm->get_all($per_page, $segment, $d, $t, $ttype, $i),
        'links' => $links,
        'segment' => $segment
    );

, а затем просто вижу

<?php echo $links; ?>

также увеличивается $segment в цикле, как $segment++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...