Cách tạo chế độ xem với các bộ lọc và phân trang


8

Tôi muốn tạo chế độ xem với các bộ lọc và phân trang cho Joomla 3.x, nhưng tôi không chắc chắn về những gì tôi phải đưa vào và ở đâu.

Hiện tại, mô hình của tôi mở rộng JModelListvà tôi bắt đầu sử dụng getListQuery()phương pháp để tìm nạp dữ liệu:

<?php
defined('_JEXEC') or die;

class smartModelProducts extends JModelList{    

    protected function getListQuery(){
        // Initialize variables.
        $db    = JFactory::getDbo();
        $query = $db->getQuery(true);

        // Create the base select statement.
        $query->select('*')
        ->from($db->quoteName('#__smart_products'));

        return $query;
    }

}

View.html.php của tôi trông như thế này:

<?php
defined('_JEXEC') or die;

class smartViewProducts extends JViewLegacy{

    function display($tpl=null){
        $app=JFactory::getApplication();
        $jinput = $app->input;
        $option = $jinput->get('option', null, null);
        $user=JFactory::getUser();

        // Get data from the model
        $this->state = $this->get('State');
        $this->items = $this->get('Items');
        $this->pagination = $this->get('Pagination');

        parent::display($tpl);      
    }
}

Tôi phải thêm gì vào mô hình và quan điểm của mình? Tôi phải đưa cái gì vào default.php của mình để cả bộ lọc và phân trang hoạt động?

Câu trả lời:


8

Thực hiện theo các bước dưới đây:

Bộ lọc:

1) Đảm bảo thêm tất cả các trường có thể lọc của bạn trong hàm tạo mô hình của bạn

public function __construct ($config = array())
{
    if (empty($config['filter_fields']))
    {
        $config['filter_fields'] = array(
           'id', 'a.id',
           'catid', 'a.catid',
           ....
           ....
        );
    }

    parent::__construct($config);
}

2) Đưa các giá trị bộ lọc vào mô hình của bạn (sản phẩm.php) để sử dụng như bên dưới

protected function populateState ($ordering = null, $direction = null)
{
    $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
    $this->setState('filter.search', $search);

    $authorId = $app->getUserStateFromRequest($this->context . '.filter.author_id', 'filter_author_id');
    $this->setState('filter.author_id', $authorId);

    $published = $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', '');
    $this->setState('filter.published', $published);

    $categoryId = $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id');
    $this->setState('filter.category_id', $categoryId);

    // and so on .....
}

3) Thêm tệp xml bộ lọc của bạn với các trường bộ lọc được yêu cầu được xác định trong models/forms/filter_products.xml

See administrator/components/com_content/models/forms/filter_articles.xml

4) Nhận và đặt bộ lọc trong view.html.php

$this->filterForm = $this->get('FilterForm');
$this->activeFilters = $this->get('ActiveFilters');

5) Hiển thị các bộ lọc trong chế độ xem danh sách views/products/tmpl/default.php

<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));?>

Phân trang:

1) Nhận phân trang từ mô hình trong của bạn view.html.php

$this->pagination = $this->get('Pagination');

2) Hiển thị trong của bạn views/products/tmpl/default.php

<?php echo $this->pagination->getListFooter(); ?>

Ghi chú:

  1. Tôi đề nghị bạn nên tham khảo thành phần Bài viết Joomla (com_content) cho bất kỳ sự phát triển thành phần Joomla MVC nào. Đây là tài nguyên / tài liệu tốt nhất hiện nay.

  2. Các mã trên có nghĩa là cho thành phần quản trị. Đối với thành phần front-end, hầu hết các bước đều giống nhau hoặc ít hơn nhưng bạn cần điều chỉnh chúng theo yêu cầu của bạn.


Tôi không biết cách tạo xml cho các bộ lọc. Bạn có thể vui lòng chỉ cho tôi đi đúng hướng? Tôi nghĩ rằng có thể thêm chúng trực tiếp vào mô hình.
mattosmat

Mã để hiển thị các bộ lọc và phân trang phải đi trong một biểu mẫu, phải không?
mattosmat

đã cập nhật câu trả lời của tôi
Nagarjun

Để phân trang, bạn không cần bất kỳ tệp xml nào. JModelList định nghĩa các hàm cần thiết (getPagination), vì vậy nó có sẵn trong mô hình của bạn.
Nagarjun

Tôi cần xml để làm gì? Tôi muốn biết để tôi có thể tìm ra cách tạo ra nó.
mattosmat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.