Filtre, sıralamak ve Codeigniter içinde sayfalandırmak

7 Cevap php

Ive son zamanlarda ben çok hafif bir çerçeve arıyor gibi CodeIgniter'ı kullanmaya başladı ve en iyi seçenek olarak gelip gibiydi.

Ben zevk, tüm MVC şey yeni duyuyorum ama çok basit görünüyor bir şey ile şaşırıp.

Ben bir CMS kodlama ve sonuçları, filtre sıralamak ve sayfalandırmamayı bir şekilde ihtiyaç duyuyorum. Ben querystrings ile yapmaya alışkınım, bu yüzden satırlar boyunca bir şey olurdu:

articles.php?order=title&sort=desc&filter=articletitle&page=5

Ben bu yüzden sadece config EnableQueryStrings açık ve gayet iyi çalışıyor, ama duygu onun muhtemelen en zarif çözüm alıyorum ben CI bunu hakkında gitmek nasıl hiçbir fikrim yok.

Ben olabilir varsayalım

index.php/articles/index/order/title/sort/desc/filter/articletitle/page/5

ama bana bu çok katı görünüyor, örneğin ne i sıralamak gerek yok, nasıl ben doğru uri segmentinde bakıyorum emin olur?

herhangi bir fikir?

7 Cevap

Eğer _remap işlevi uygulamak denediniz mi? Bu size istediğiniz kadar çok (veya az) olanların uygulamaya izin bu işlev için denetleyicisi tüm sorguları yönlendirmek olacaktır.

Daha sonra böyle bir şey yapabilirsiniz:

class Articles extends Controller
{
    // Note: No need for a "order" or even an "index" function!
    public function _remap()
    {
        $assoc = $this->uri->uri_to_assoc( 4 );
        /* $assoc is now 
           array( "order"=>"title",
                  "sort"=>"desc",
                  "filter"=>"articletitle", 
                  "page"=>5); */
    }
}

Ben bu sorunun içine kez bir ton çalıştırmak ve nihayet düzgün çözmeye karar verdik.

Benim çözüm açılan yol / sorgu dizesi yaklaşımı (o a solution like the one Stephen linked to gerektirir) içerir.

URL'ler şöyle biçimlendirilir:

http://www.myapp.dev/controller/index/10?order_by=id+asc&status=open

Bu isteğe bağlı $ _GET params sonra sorgu koşulları olarak kullanılabilir, ve CI sayfalamayı ofset vidalama olmadan istediğiniz gibi birçok kullanabilirsiniz.

Varsayılan olarak, CodeIgniter'ın Sayfalandırması kütüphane URI sonuna kadar ofset yerleştirerek desteklemiyor. http://pastie.org/1393513: Bu destek CI almak için hile şöyle pagination kütüphanesini genişletmek için

Ardından, kontrolör, bunu gibi sayfalamayı başlatabilirsiniz:

$config['url_format'] = site_url('controller/index/{offset}?'.http_build_query($params));
$config['total_rows'] = $this->model->count_rows();
$config['per_page'] = 5;
$this->pagination->initialize($config);

Özel Numaralandırma yöntemi {offset} url_format dize düşer yere göre algılar başlatılamıyor :: yok, çünkü uri_segment, gerekli olduğunu unutmayın.

Ile inşa edilmiştir Linkler $this->pagination->create_links() uygun bir yere yerleştirin ofset ve kuyruklanmasız sorgu dizesi koruyacaktır.

Ben CodeIgniter sorgu dizesi yok gerçeğini sevmiyorum. Sorgu dizesi isteğe bağlı parametreler için harika. URI segmentlerde isteğe bağlı parametreleri koymak için çalışıyor ve işler garip bir hal almaya başlar.

Bu gibi bir URL kesmek biraz görünüyor:

index.php/articles/index/order/title/sort/desc/filter/articletitle/page/5

Bu nedenle ben URI segmentleri ve sorgu dizesi bir karışımı kullanmak CodeIgniter'ı yapılandırın. This answer shows you how you can achieve this.

Bu varsayılan olarak sorgu dizeleri kullanamazsınız bu biraz garip. Ben form sonrası sıralama tercihi göndermek bir kaç alanda benim geçerli projede bu üstesinden gelmek ve daha sonra kullanıcının oturumunda bu tercihi depolama ettik.

Her zaman böyle bir şey yapabilirsiniz:

www.yourdomain.com/articles/order-title/sort-desc/filter-articletitle/page-5

. htaccess ile index.php kaldırarak. "-" Her bir URI için Segment sonra sadece patlayabilir.

$order = $this->uri->segment(2, 0);
$sort = $this->uri->segment(3, 0);
$filter = $this->uri->segment(4,0);
$page = $this->uri->segment(5, 0;

if(!empty($order)){
    $order = explode('-', $order);
} else {
    $order = 'defaultorder';
}

/** And so on for the rest of the URI segments **/

hatta bütün denklemin dışında patlayabilir çıkarın ve sadece bunu:

www.yourdomain.com/articles/title/desc/articletitle/5

$order = $this->uri->segment(2, 0);
$sort = $this->uri->segment(3, 0);
$filter = $this->uri->segment(4,0);
$page = $this->uri->segment(5, 0;

Bu Kod Igniter kullanmak en büyük iş kendi sıralama ve sayfalama yapmak nasıl.

$config['url_format'] = site_url('controller/index/{offset}?'.http_build_query($params));

çalışmıyor. Ben CodeIgniter 1.7.3 sürümünü kullanın.

Şahsen ben Lou önerilen büyük bir hayranıyım veya yol / sorgu dizesi açılan değilim, ama ben onun daha basit bir yöntem olduğunu düşünüyorum.

Benim çözüm filtreleme parametrelerini örneğin birlikte sorgu dizesinde sayfa başına parametresini koyar

http://mysite.com/admin/contacts?status=open&per_page=20

Bu sayfalama sınıfının page_query_string seçeneği sayesinde çalışıyor. İşte:

$query_string = some_function_to_get_your_filter_query_string_params();

$config['base_url'] = site_url("admin/contacts?". $query_string);
$config['total_rows'] = $total_rows;
$config['per_page'] = $per_page;
$config['page_query_string'] = TRUE;
$this->pagination->initialize($config);