【问题标题】:Joomla 2.5 limit query results from each categoryJoomla 2.5 限制每个类别的查询结果
【发布时间】:2012-09-20 19:46:04
【问题描述】:

我在 Joomla 2.5 中使用 Module minifrontpage。网址:http://www.bigideaadv.com/wright_flood_OLD/

我要做的是检索 4 篇最新文章。 2 个来自一个类别,2 个来自另一个类别。并且顺序需要是第一类文章,然后是第二类文章(我已经设置了,只是无法获得每个类别的限制。)

任何帮助将不胜感激。谢谢。

我的数据库功能代码如下:

    // Get the dbo
    $database = JFactory::getDbo();

    //Get the config
    $config =& JFactory::getConfig();
    $user =& JFactory::getUser();
    $tzoffset = $config->getValue('config.offset');

    // Get an instance of the generic articles model
    $model = JModel::getInstance('Articles', 'ContentModel', array('ignore_request' => true));

    // Set application parameters in model
    $app = JFactory::getApplication();
    $appParams = $app->getParams();
    $model->setState('params', $appParams);

    // Get Module Parameters
    $number_of_article = (int) $params->get('number_of_article', 5);
    $order          = $params->get( 'order_by', 1);
    $order_type     = $params->get( 'order_type', 'asc');
    $period         = intval( $params->get( 'period', 366 ) );

    echo "ORDER: ".$order."<br />";
    //echo "ORDER BY: ".$order_by;

    //$query2 = "SELECT * FROM ()"

    // Set the filters based on the module params
    $model->setState('list.start', (int) $params->get('number_of_skip', 0));
    $model->setState('list.limit', (int) $params->get('number_of_article', 5));
    $model->setState('filter.published', 1);

    // Access filter
    $access = !JComponentHelper::getParams('com_content')->get('show_noauth');
    $authorised = JAccess::getAuthorisedViewLevels(JFactory::getUser()->get('id'));
    $model->setState('filter.access', $access);

    // Category filter
    $model->setState('filter.category_id', $params->get('catid', array()));

    // User filter
    $userId = JFactory::getUser()->get('id');
    switch ($params->get('user_id'))
    {
        case 'by_me':
            $model->setState('filter.author_id', (int) $userId);
            break;
        case 'not_me':
            $model->setState('filter.author_id', $userId);
            $model->setState('filter.author_id.include', false);
            break;

        case '0':
            break;

        default:
            $model->setState('filter.author_id', (int) $params->get('user_id'));
            break;
    }

    // Filter by language
    $model->setState('filter.language',$app->getLanguageFilter());

    //  Featured switch
    switch ($params->get('show_featured'))
    {
        case '0':
            $model->setState('filter.featured', 'hide');
            break;
        case '1':
        default:
            $model->setState('filter.featured', 'show');
            break;
        case '2':
            $model->setState('filter.featured', 'only');
            break;
    }

    // Set ordering
    $order_map = array(
        '0' => 'a.created',
        '1' => 'a.hits',
        '2' => 'a.ordering',
        '3' => 'RAND()',
    );

    $ordering = "catid, ";
    $ordering .= JArrayHelper::getValue($order_map, $params->get('order_by'), 'a.publish_up');
    //$ordering = JArrayHelper::getValue($order_map, $params->get('order_by'), 'a.publish_up');

    echo $ordering;     

    //help ordering system for DESC or ASC
    switch ($params->get( 'order_type' ))
    {
        case 1:
            $dir = 'DESC';
            break;
        case 0:
        default:
            $dir = 'ASC';
            break;
    }

    $model->setState('list.ordering', $ordering);
    $model->setState('list.direction', $dir);

    //Filter and Set Period (days)
    $model->setState('filter.date_filtering', 'relative');
    $model->setState('filter.relative_date', $period);

    $items = $model->getItems();

【问题讨论】:

    标签: php mysql joomla2.5


    【解决方案1】:

    这也是我需要的。限制每个类别的文章。想知道是否有一个简单的过滤器可以设置来实现这一点。 希望避免模型被黑。

    谢谢!

    编辑 由于缺乏共鸣,我自己以一种非常丑陋的方式尝试了这个,它解决了我的部分问题。为了简单起见,我为每个类别选择了 1 篇文章。 首先,我更改了 models\category.php 并在第 224 行左右向模型添加了一个名为 filter.subcategories_article_limit 的状态(检查博客布局) $model-&gt;setState('filter.subcategories_article_limit', 1);

    基本上这是为过滤器设置一个标志

    然后在 models\articles.php 中,我在第 322 行附近添加了 where 子句 $subcategories_article_limit = (int) $this->getState('filter.subcategories_article_limit', 0); if(!empty($subcategories_article_limit)){ $whereClause = '(a.id IN (SELECT a1.id FROM wiz3j_content AS a1 WHERE a1.catid=a.catid AND a1.publish_up=(SELECT MAX(a2.publish_up) FROM wiz3j_content AS a2 WHERE a1.catid=a2.catid) ))'; $query->where($whereClause);
    }

    我知道这是一个核心 hack,它并没有处理很多事情,比如用户权限、文章状态等。我相信这可以改进。

    但我确实希望一些大师能得到更好的解决方案。

    【讨论】:

    • 这应该是评论,而不是答案。您可以添加赏金来吸引注意力。
    • “我也是”的答案不被认为是建设性的。尽量远离他们。
    • @Jleagle 和 DirkMcQuickly 我试过了,但在主帖上找不到评论链接,这是我在 SO 上的第一篇文章,所以请原谅我。我会学得很快;)。回到主题,有什么线索吗?非常感谢!
    • 我基本上重新设计了中间列的 index.php 布局,以包括 2 个相互堆叠的模块位置。这是在不侵入模块或核心代码的情况下实现我想要的最佳方式。
    猜你喜欢
    • 2015-10-05
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 2020-02-27
    • 2017-10-13
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多