How do you filter Joomla 3 articles by article id

2.5k views Asked by At

I'm trying to create a Joomla module that displays articles based on categories and tags.

I've taken code for selecting tagged articles from https://github.com/lasinducharith/joomla-tags-selected) and introduced it into a copy of mod_articles_news:

public static function getList(&$params)
{
    $app = JFactory::getApplication();
    $db         = JFactory::getDbo();

    // Code base on https://github.com/lasinducharith/joomla-tags-selected to fetch ids of tagged articles 
    $tagsHelper = new JHelperTags;
    $tagIds = $params->get('tagid', array());
    $tagIds = implode(',', $tagIds);
    echo '<pre>search for tags[' . $tagIds . ']';

    $query=$tagsHelper->getTagItemsQuery($tagIds, $typesr = null, $includeChildren = false, $orderByOption = 'c.core_title', $orderDir = 'ASC',$anyOrAll = true, $languageFilter = 'all', $stateFilter = '0,1');

    $db->setQuery($query, 0, $maximum);
    $results = $db->loadObjectList();

    $article_ids=array();   
    foreach ($results as $result){
        $article_ids[]=$result->content_item_id;
    }
    echo ' yields articles[' . implode(',', $article_ids ) . ']</pre>';

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

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

    // Set the filters based on the module params
    $model->setState('list.start', 0);
    $model->setState('list.limit', (int) $params->get('count', 15));

    $model->setState('filter.published', 1);

    $model->setState('list.select', 'a.fulltext, a.id, a.title, a.alias, a.introtext, a.state, a.catid, a.created, a.created_by, a.created_by_alias,' .
        ' a.modified, a.modified_by, a.publish_up, a.publish_down, a.images, a.urls, a.attribs, a.metadata, a.metakey, a.metadesc, a.access,' .
        ' a.hits, a.featured' );

    // 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()));

    // Article filter
    $model->setState('filter.id', $article_ids);

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

    // Set ordering
    $ordering = $params->get('ordering', 'a.publish_up');
    $model->setState('list.ordering', $ordering);

    if (trim($ordering) == 'rand()')
    {
        $model->setState('list.direction', '');
    }
    else
    {
        $direction = $params->get('direction', 1) ? 'DESC' : 'ASC';
        $model->setState('list.direction', $direction);
    }

    // Retrieve Content
    $items = $model->getItems();
    $newitems=array();

    foreach ($items as &$item)
    {
        echo '<pre>fetched article[' . $item->id .'] which is ';

        if ( !in_array($item->id, $article_ids )){
            echo 'not tagged';
        } else{
            echo 'tagged';

        }
        echo '</pre>';
        ...
    }
    return $newitems;
}

The debug statements give me:

  • search for tags[2] yields articles[40,44,45]
  • fetched article[45] which is tagged
  • fetched article[44] which is tagged
  • fetched article[43] which is not tagged
  • fetched article[42] which is not tagged
  • fetched article[41] which is not tagged
  • fetched article[40] which is tagged
  • fetched article[39] which is not tagged
  • fetched article[38] which is not tagged

So the articles have not been filtered by id. I'd be very grateful for any advice. Thanks

1

There are 1 answers

1
Murray Longworth On

Found the problem, the filter should be article_id:

    // Article filter
    $model->setState('filter.article_id', $article_ids);

Now it selects articles based on tags and categories