Parsing balise "description" de la classe class.plx.feed.php

je-evrardje-evrard Member
décembre 2017 modifié dans Entraide
Bonjour,

J'aimerais pouvoir parser via une fonction maison le contenu de la balise "description" des flux rss des articles (classe class.plx.feed.php).
[== Indéfini ==]
public function getRssArticles() {
...
# On va boucler sur les articles (s'il y en a)
		if($this->plxRecord_arts) {
			while($this->plxRecord_arts->loop()) {

				# On affiche le flux dans un buffer
				$entry .= "\t<item>\n";
				$entry .= "\t\t".'<title>'.plxUtils::strCheck($this->plxRecord_arts->f('title')).'</title> '."\n";
				$entry .= "\t\t".'<link>'.$this->urlRewrite('?article'.$artId.'/'.$this->plxRecord_arts->f('url')).'</link>'."\n";
				$entry .= "\t\t".'<guid>'.$this->urlRewrite('?article'.$artId.'/'.$this->plxRecord_arts->f('url')).'</guid>'."\n";
				$entry .= "\t\t".'<description>'.plxUtils::strCheck(plxUtils::rel2abs($this->racine,$content)).'</description>'."\n";
				$entry .= "\t\t".'<pubDate>'.plxDate::dateIso2rfc822($this->plxRecord_arts->f('date')).'</pubDate>'."\n";
				$entry .= "\t\t".'<dc:creator>'.plxUtils::strCheck($author).'</dc:creator>'."\n";
				# Hook plugins
				eval($this->plxPlugins->callHook('plxFeedRssArticlesXml'));
				$entry .= "\t</item>\n";
			}
		}

...

}

Comme on peux le voir pas très pratique via un hook.

Quelle est à votre avis la meilleure solution a adopter ?

Merci d'avance,

Cordialement,

jeje

Réponses

  • Hum pas si facile... je cogite de mon côté.
  • StéphaneStéphane Member, Former PluXml Project Manager
    Salut Jérôme

    Que veux-tu faire exactement ?
    Rajouter du contenu à toi dans la balise description du flux rss ?

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • je-evrardje-evrard Member
    décembre 2017 modifié
    Salut stef,

    Je m'explique:

    Que se soit spxshortcodes ou visualwizard je créé un hook de sortie IndexEnd qui permet d'interpréter les shortcodes (extrèmement puissant)
    [== Indéfini ==]
    # parse shorcode in output
    	public function IndexEnd() {
    		$string = '
    			$output = do_shortcode($output);
    		';
    		echo '<?php '.$string.' ?>';
    	}
    

    Par ce biais les shortocodes sont interprétés en sortie html via la classe shortcodes.php loadée par mes soins dans "indexBegin"

    Le problème c'est que le flux rss n'interprète pas les shortcodes, il faut donc pouvoir faire l'équivalent de ce parsing :

    Avant :
    [== Indéfini ==]
    ...
    if($this->aConf['feed_chapo']) {
    	$content = $this->plxRecord_arts->f('chapo');
    	if(trim($content)=='') $content = $this->plxRecord_arts->f('content');
    } else {
    	$content = $this->plxRecord_arts->f('chapo').$this->plxRecord_arts->f('content');
    }
    
    ...
    

    Après si on devait le faire directement dans le code ça donnerait ceci :
    [== Indéfini ==]
    ... ligne 238
    if($this->aConf['feed_chapo']) {
    	$content = $this->plxRecord_arts->f('chapo');
    	if(trim($content)=='') $content = $this->plxRecord_arts->f('content');
    } else {
    	$content = $this->plxRecord_arts->f('chapo').$this->plxRecord_arts->f('content');
    }
    $content = do_shortcode($content);
    ...
    

    Voila pour l'explication. Mais comment le faire simplement via un hook d'un plugin ? le seul hook a dispo est plxFeedRssArticlesXml qui permet de rajouter des champs.

    Cordialement,

    jéjé
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Pour faire cela le hook plxFeedRssArticlesXml est mal placé.

    Il faudrait qu'il agisse avant d'alimenter la variable $entry et on devrait prendre en compte sa valeur de retour (true | false) pour savoir si on continue le traitement à l'intérieur de la boucle ou si on passe à l'article suivant.
    Je suis perplexe sur l'intérêt de cette variable $entry qui ne subit aucun traitement à la sortie de la boucle.

    Pour résoudre ton problème, il faut utiliser le hook FeedEnd et traiter la variable $output en considérant que c'est le contenu d'un fichier XML.
    Le hic c'est que cela concerne un lot d'articles.

    Le problème se pose également pour les commentaires.
  • je-evrardje-evrard Member
    décembre 2017 modifié
    Tout à fait.
  • StéphaneStéphane Member, Former PluXml Project Manager
    Tu peux toujours t'en sortir avec ce genre code
    <?php
    
    class test extends plxPlugin {
    
    
    	public function __construct($default_lang) {
    
    		# Appel du constructeur de la classe plxPlugin (obligatoire)
    		parent::__construct($default_lang);
    
    		# Ajouts des hooks
    		$this->addHook('plxFeedRssArticlesXml', 'plxFeedRssArticlesXml');
    	}
    
     	public function plxFeedRssArticlesXml() {
    
    		echo '<?php
    			if(preg_match("/<description>(.*?)<\/description>/", $entry, $capture)) {
    				print_r($capture);
    			}
    		?>';
    	
    	}
    
    }
    ?>
    

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Si c'est pour un site particulier :
    * dupliquer le fichier core/lib/class.plx.feed.php dans un sous-dossier du theme, en ajoutant un fichier .htaccess avec les régles Deny from all et Options -Indexes
    * placer le hook qui va bien au bon endroit dans la copie
    * corriger le chemin pour accèder à la class dans le fichier feed.php dans le thème

    C'est la solution la plus souple.

    P.S. : Cela serait bien d'avoir un fichier .htaccess dans le dossier core/lib avec une règle Deny from all. Le souci est qu'il y a dans ce dossier des fichiers statiques type js qui seraient mieux placés dans un dossier core/assets :(
  • Merci pour vos réponses... Je vais voir ça.
  • Bonjour,

    Voila ma solution :
    [== Indéfini ==]
    public function FeedEnd() {
    		
    		echo '<?php
    		
    			$outputxml = simplexml_load_string($output);
    			foreach ($outputxml->channel->item as $item) {
    				$item->description = do_shortcode($item->description);
    			}
    			$output = $outputxml->asXML();
    		?>';
    		
    	}
    

    ++

    jéjé
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Excellent !

    SimpleXML est un outil puissant et relativement simple d'emploi ( quoique XPath ? ).

    Dommage qu'on en soit encore à xml_parser dans PluXml. http://forum.pluxml.org/viewtopic.php?id=4487
  • Oui cela serait 100 fois plus simple. Ou même passer de xml a json mais c'est une autre histoire.

    ++
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    décembre 2017 modifié
Connectez-vous ou Inscrivez-vous pour répondre.