web-dev-qa-db-fra.com

Comment faire pour que le module "Le plus lu" affiche uniquement les articles dans une plage de temps

J'essaie d'afficher uniquement le contenu le plus lu d'il y a deux mois.

J'ai essayé de vérifier dans le fichier mod_article_popular/helper.php mais je n'arrive pas à comprendre comment utiliser $ model-> setState pour obtenir ce que je veux.

Comment puis-je afficher uniquement les articles d'une plage de dates?

2
Josh

Vous devriez examiner la classe ContentModelArticles pour laquelle les états de filtre doivent être manipulés. La méthode getStoreId à l'intérieur de la classe est la réponse:

protected function getStoreId($id = '')
{
    // Compile the store id.
    $id .= ':' . serialize($this->getState('filter.published'));
    $id .= ':' . $this->getState('filter.access');
    $id .= ':' . $this->getState('filter.featured');
    $id .= ':' . serialize($this->getState('filter.article_id'));
    $id .= ':' . $this->getState('filter.article_id.include');
    $id .= ':' . serialize($this->getState('filter.category_id'));
    $id .= ':' . $this->getState('filter.category_id.include');
    $id .= ':' . serialize($this->getState('filter.author_id'));
    $id .= ':' . $this->getState('filter.author_id.include');
    $id .= ':' . serialize($this->getState('filter.author_alias'));
    $id .= ':' . $this->getState('filter.author_alias.include');
    $id .= ':' . $this->getState('filter.date_filtering');
    $id .= ':' . $this->getState('filter.date_field');
    $id .= ':' . $this->getState('filter.start_date_range');
    $id .= ':' . $this->getState('filter.end_date_range');
    $id .= ':' . $this->getState('filter.relative_date');

    return parent::getStoreId($id);
}

Ainsi, les deux états de filtre pour lesquels vous devez définir des états sont:

    $model->setState('filter.date_filtering', $range);

Pour votre information, on dirait que vous éditez les fichiers de base directement; ce qui n'est pas recommandé car toute mise à jour ultérieure de Joomla pourrait écraser toute personnalisation.

J'espère que cela t'aides...

3
Brian Bolli

J'ai trouvé deux méthodes pour résoudre ce problème.

.1) Définissez une date en arrière par rapport à la date du jour. (J'utilise 60 parce qu'il me faut des articles à partir de 2 mois)

        $model->setState('filter.date_filtering', 'relative');
        $model->setState('filter.relative_date', $params->get('relative_date', 60)); 

        $items = $model->getItems();

2) Définissez une plage de dates préférée

    $model->setState('filter.date_filtering', 'range');
    $start_date = strtotime('-2 months');
    $start_date = date("Y-m-d h:i:s", $start_date);
    $end_date = strtotime('now');
    $end_date = date("Y-m-d h:i:s", $end_date);        
    $model->setState('filter.start_date_range', $start_date);
    $model->setState('filter.end_date_range', $end_date);

    $items = $model->getItems();
3
Josh

Un module gratuit est disponible chez JED qui fait exactement cela. Contenu le plus populaire par plage de dates vous permet de définir différentes plages de dates pour les articles populaires, avec des options pour le dernier jour, les 7 derniers jours, les 30 derniers jours et Toutes les heures.

Most Popular Content by Date Range module

1
johanpw