0

私は次のようなメソッドを持つコントローラーを持っています:

    public function browsecategory($category_id)
    {               

        //find any subcategories for this category
        $this->load->model('category/category_model');
                    $this->load->model('category/product_category_model');  
        $records['categories'] = $this->category_model->find_all_by('parent_id', $category_id);

                    //add some product data too. 
                    $records['products'] = $this->product_category_model->find_all_by('category_id', $category_id); 
        Template::set('records', $records);
        Template::render();
    }//end browsecategory

codeigniterのページネーション「もの」について私が見たすべての例は、1つのクエリを使用しています。2つのデータセットを組み合わせて1つのビューで提供する必要があります。

助言がありますか?

編集1

私は以下のMDeSilvaの提案に従おうとしました。また、ページネーションオブジェクトは作成するリンクの数を正しく計算していますが、すべてのアイテムがすべてのページに表示されます。

データを取得するモデルのコードは次のとおりです。

public function get_categories_and_products($limit=12, $offset=0, $category_id=null)
{
    print '<BR>the function got the following offeset:'.$offset;
    $query = "(SELECT cat.category_id, cat.title, cat.image_thumb, cat.deleted, cat.display_weight ";
    $query = $query."FROM bf_categories cat ";
    $query = $query."WHERE cat.parent_id=".$category_id;
    $query = $query." AND cat.category_id <>".$category_id;
    $query = $query.") UNION (";
    $query = $query."SELECT p.product_id, p.name, p.image_thumb, p.deleted , p.display_weight";
    $query = $query." FROM bf_product p ";
    $query = $query."Inner join bf_product_category cp ";
    $query = $query."on p.product_id=cp.product_id ";
    $query = $query."Where cp.category_id=".$category_id.")";

    $this->db->limit($limit, $offset);
    $catsandprods= $this->db->query($query);
    return $catsandprods->result() ;
}

そして、コントローラーのコードは次のとおりです。

public function browsecategory($category_id, $offset=0)
    {
            $this->load->library('pagination');

            $total = $this->product_model->get_cats_prods_count($category_id);

            $config['base_url'] = site_url('/product/browsecategory/'.$category_id);
            $config['uri_segment'] = 4;
            $config['total_rows'] = $total;
            $config['per_page'] = 5;
            $config['num_links'] = 10;

            $this->pagination->initialize($config);
            $offset = ($this->uri->segment($config['uri_segment'])) ? $this->uri->segment($config['uri_segment']) : 0;
                        print $offset;
            //Call the model function here to get the result, 
            $records= $this->product_model->get_categories_and_products(5,$offset,$category_id);
            //add to breadcrumb trail
            $this->build_bread_crumb_trail($category_id);
            $breadcrumbs = $this->breadcrumbs->expand_to_hyperlinks();

            Template::set('currentcategory',$category_id);
            Template::set('breadcrumbs', $breadcrumbs);
            Template::set('records', $records);
            Template::render();     
    }

デバッグしたところ、コード行「$ this-> db-> limit($ limit、$ offset);」が表示されています。モデル内が機能していません。それは常に完全なレコードセットを返します...私が欠けているものを教えてもらえますか?ありがとう。

4

3 に答える 3

1

これは、CIでページ付けリンクを生成する方法です。要件には、結合を使用したクエリがあります。

public function index($offset = 0) {
   $language_id = 1;

    $artwork_id = null;

    if ($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        $artwork_id = $this->input->post('serach_artwork_id', TRUE) ? $this->input->post('serach_artwork_id', TRUE) : null;
        $data['artwork_id'] = $artwork_id;

    }

    $this->load->library('pagination');
    $limit = 10;

    $total = $this->Artwork_model->get_artwork_count($language_id, $artwork_id);

    $config['base_url'] = base_url().'artwork/index/';
    $config['total_rows'] = $total;
    $config['per_page'] = $limit;
    $config['uri_segment'] = 3;

    $config['first_link'] = '<< First';
    $config['last_link'] = 'Last >>';
    $config['next_link'] = 'Next ' . '&gt;';
    $config['prev_link'] = '&lt;' . ' Previous';
    $config['num_tag_open'] = '<span class="number">';
    $config['num_tag_close'] = '</span>';

    $config['cur_tag_open'] = '<span class="current"><a href="#">';
    $config['cur_tag_close'] = '</a></span>';

    $this->pagination->initialize($config);

    //Call the model function here to get the result, 
    $data['artworks'] = $this->Artwork_model->get_artworks($language_id, $limit, $offset, $artwork_id);

    $this->template->write('title', 'Artwork : Manage Artwork');
    $this->template->write_view('content', 'artwork/index', $data);
    $this->template->render();
}

モデルに複数の結合があるクエリの例を次に示します。

public function get_artworks($language_id = 1, $limit = 10, $offset = 0, $arwork_id = null)
    {        
        $this->db->select('a.id, a.price, a.is_shop, at.title,at.status,at.date_added,ats.name as artist_name');
        $this->db->from('artworks a');
        $this->db->join('artwork_translations at', 'a.id = at.artwork_id');
        $this->db->join('artists ats', 'a.artist_id = ats.id');
        $this->db->where('at.language_id', $language_id);
        if(!is_null($arwork_id) && !empty($arwork_id) && $arwork_id != 'all')
        {
            $this->db->where('a.id =', $arwork_id);
        }
        $this->db->order_by('a.id DESC');
        $this->db->limit($limit, $offset);

        $artworks = $this->db->get();

        return $artworks->result();
    }

ビューで

<?= $this->pagination->create_links(); ?>
于 2013-02-18T06:19:16.713 に答える
0

PHP関数array_mergeを使用するだけです

<?php $beginning = 'foo'; $end = array(1 => 'bar');
$result = array_merge((array)$beginning, (array)$end);
$this->load->view('view.php', $result);
?>

使用するアレイのキーに従って抽出します。それは本当にシンプルで機能しています

于 2013-02-18T05:57:08.497 に答える
0

ページネーション クラスは、データ ソースがどのように構築されているかは気にしません。必要なデータ結果オブジェクトを渡すだけです。したがって、制限とオフセットをデータクエリに渡すか、すべてのデータをプルして後でスライスします。

しかし、これらのさまざまなデータを 1 つの結果にまとめて表示する方法をどのように考えているのか、よくわかりません。すべてのカテゴリを表示してから、製品のページ番号を付けようとしていますか? もしそうなら、あなたは正しく設定されていません

于 2013-02-18T00:37:10.287 に答える