Skip to main content Help Control Panel

Login   A+   A-

Community «   Le forum «   Nouvelles fonctions «   Ajout d'une nouvelle option dans les options avancées des articles «  

Comment: Ajout d'une nouvelle option dans les options avancées des articles

<< Previous Next >>

by Nuxwin on Mar. 25

Edit :

Après avoir mis les mains dans le code de yacs, et plus particulièrement la partie qui permet de lister les articles qui doivent être affichés dans l'objet flash, voici mes observations ainsi qu'un solution d'attente que je soumets pour ceux que cela intéresse.

Le mieux serait de rajouter une option spécifique 'no_flash' dans les options des sections et articles mais dans l'immédiat, la méthode que je propose se cantonne à interdir le listage d'un article dans l'objet flash si les conditions suivantes sont réunies :

L'article est paramétré avec l'option 'Options avancées' --> 'n'est pas affichée sur la page d'accueil'

Note : ( soit une valeur autre que 'main' pour le champ home_panel de la table yacs_articles pour l'article concerné )

ou encore :

L'article est paramétré avec l'option 'Options avancées' --> 'affichée normalement, en fonction des paramètres de la section' et que la section parente, c'est à dire, celle qui contient l'article, est paramétrée avec l'option 'Contribution à la page d'accueil' --> 'ne sont pas affichées sur la page d'accueil'

Note : ( Soit une valeur autre que 'main' pour le champ home_panel de la table yacs_sections pour la section concernée. ).

Pour décrire la méthode proposée, je remonte l'analyse que j'ai effectué :

L'objet flash est géré par le script ./feeds/slashdot.php

Ce script fait appel à la méthode Feeds::get_local_news de la class Feeds situées dans le script ./feeds/feeds.php :

Fichier ./feeds/slashdot.php : Appel de la méthode get_local_news :
if(!$items Feeds::get_local_news(20'compact'))
    return;



Fichier feeds/feeds.php - Méthode get_local_news :
function get_local_news($count=20$variant='feeds') {
        global 
$context;

        
// list the newest published articles
        
return Articles::list_by_date(0$count$variant);

    }



Cette méthode get_local_news fait elle-même appelle à la méthode list_by_date de la class Articles située dans le script ./articles/articles.php.

Fichier ./articles/articles.php - Méthode list_by_date :
function &list_by_date($offset=0$count=10$layout='full'$since=NULL) {
        global 
$context;

        
// order by reverse date of publication
        
$result =& Articles::list_by('publication'$offset$count$layout,
    
$since);
        return 
$result;
    }



Dans la doc de cette méthode, il est clairement indiqué que :

* Only articles matching following criteria are returned:
..........
* - related section is regularly displayed at the front page


Donc, on est bien d'accord ( sauf si mon anglais me fait défaut ) que normalement, les articles sont seulement selectionnés si la section les contenant est affichée en première page.

Or, dans le cas présent, ce n'est pas le cas. En effet, le critère ne s'applique pas à l'objet flash. Ceci est clairement mis en évidence dans la méthode évoquée ci-après.

De plus, convient-il de préciser ( sauf encore si mon anglais fait défaut ) que la doc de la méthode ne précise pas le critère selon lequel les articles paramétrés avec l'option 'Options avancées' --> 'n'est pas affichée sur la page d'accueil' ne sont pas selectionnés.

Bref, ceci n'est pas très grave puisque dans la méthode évoquée ci-après, ce critère est clairement mis en évidence.

La méthode list_by_date de la classe Articles fait elle-même appelle à la méthode list_by de cette même classe.

La méthode list_by est celle qui construit la requête Sql à exécuter pour récupérer la liste des articles. Cette requête Sql est construite selon divers critères.

Dans le cas qui nous préoccupe, la partie du code qui nous intérresse est celle-ci :

function &list_by($order=NULL$offset=0$count=10$layout='full',
    
$since=NULL) {
..............
..............

        
// avoid articles pushed away from the front page
        
$sections_where '';
        if(isset(
$context['skin_variant']) && ($context['skin_variant'] ==
    
'home')) {
            
$sections_where .= " AND (sections.home_panel LIKE 'main')"
                
." AND (sections.index_map LIKE 'Y')"
                
." AND (articles.home_panel LIKE 'main')";
        }
        
.............
.............
}



Dans cette partie du code, un complément conditionnel pour la clause WHERE de la requête définie. Ce complément comprend les deux critères qui permettent d'écarter la selection des articles qui ne doivent pas êtres affichés sur la page d'accueil.

Nous voyons ici que la condition est ajoutée si, et seulement si la variable $context['skin_variant'] existe et qu'elle est positionnée à home, ce qui correspond bien à la page d'accueil.

Pour apporter les modification nécessaires, nous pourrions bien entendu étendre la condition (en ajoutant un elsif...) dans la méthode list_by mais comme ce qui nous préoccupe est l'ajout de critères de selection pour les articles devant êtres listés dans notre objet flash, autant positionner la variable $context['skin_variant'] à home --> directement dans le script gérant cet objet, soit le fichier ./feeds/slashdot.php.

Ainsi, pour arriver à nos fin, il nous suffit, dans le script ./feeds/slashdot.php, de rajouter cette ligne :

$context['skin_variant'] = 'home';



Soit le résultat final suivant :

Fichier ./feeds/slashdot.php après modifications :
........
........
// list fresh news
include_once '../feeds.php';

// Adding to prohibit the listing of items that should not appear on the
// home page
$context['skin_variant'] = 'home';

if(!
$items Feeds::get_local_news(20'compact'))
    return;
.........
.........



Voilà, une fois ceci fait, purger votre cache est vous remarquerez que seuls les articles pouvant être affichés en page d'accueil seront listés dans votre objet flash.

Bien entendu, il s'agit d'une solution d'attente comme indiqué au début de ce post.

Laurent

This comment has inspired: