如何使用过滤器和分页创建视图


8

我想为Joomla 3.x创建带有过滤器和分页的视图,但是我不确定必须包含哪些内容以及在何处。

现在,我的模型扩展了JModelList,我开始使用该getListQuery()方法来获取数据:

<?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看起来像这样:

<?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);      
    }
}

我必须在模型和视图中添加什么?为了使过滤器和分页都能正常工作,我必须在default.php中包括什么?

Answers:


8

请按照以下步骤操作:

筛选条件:

1)确保在模型构造函数中添加所有可过滤字段

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

    parent::__construct($config);
}

2)在模型(products.php)中填充过滤器值,以供如下使用

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)添加您的过滤器xml文件,并在其中定义必需的过滤器字段 models/forms/filter_products.xml

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

4)获取并设置您的过滤器 view.html.php

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

5)在列表视图中显示过滤器 views/products/tmpl/default.php

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

分页:

1)从您的模型中获取分页 view.html.php

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

2)显示在您的 views/products/tmpl/default.php

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

笔记:

  1. 我建议您为任何Joomla MVC组件开发参考Joomla文章(com_content)组件。这是迄今为止可用的最佳资源/文档。

  2. 上面的代码用于管理员组件。对于前端组件,大多数步骤或多或少都是相同的,但是您需要根据需要进行调整。


我不知道如何为过滤器创建xml。您能指出我正确的方向吗?我认为可以将它们直接添加到模型中。
mattosmat 2015年

用于显示过滤器和分页的代码必须放在表格中,对吗?
mattosmat

更新了我的答案
Nagarjun 2015年

对于分页,您不需要任何xml文件。JModelList定义了必需的函数(getPagination),因此可以在模型中轻松使用。
Nagarjun 2015年

我需要xml做什么?我想知道,以便我找出制作方法。
mattosmat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.