aide sur plugin

décembre 2011 modifié dans Entraide
Bonjour, je tente de créer un plugin mais comme je suis une bille la dessus, je n'arrive à rien.

l'idée est de mettre dans un plugin une fonction que je mettais avant dans le plxShow. Aussi, j'ai surchargé l'édition d'un article avec un champ supplémentaire dans lequel je glisse une url d'image.

j'ai donc besoin d'aller chercher l'info dans le xml de l'article appelé mais je bloque à ce moment la.
Si vous pouviez me dépatouiller avec le code ci-dessous j'apprécierais beaucoup car je tourne en rond. Merci par avance
<?php
	class plxEtendreClass extends plxPlugin {
	
		public function __construct($default_lang) {
		
			# appel du constructeur de la classe plxPlugin (obligatoire)
			parent::__construct($default_lang);
			
			# déclaration du hook
			$this->addHook('artImagePresse', 'artImagePresse');
		}

	/**
	 * Méthode qui affiche l'image presse dans l'article
	 **/
		public function artImagePresse() {
			$imgpresse = $this->plxMotor->plxRecord_arts->f('imagepresse');

			if (!empty($imgpresse)){
			echo '<div class="art-chapo imgpresse">'.$imgpresse.'</div>';
			}
		}
		

	}
?>

Réponses

  • Hehe je vois qu'on a les mêmes bidouilles mais chez moi ça marche... :p

    Par contre, ça fait longtemps que j'ai laissé mon code en attente et j'ai plus beaucoup de temps. Je peux rejeter un oeil dessus que ce week end (ou peut être avant mais c'est pas sûr...)

    Ca coince à quel niveau chez toi ?
    L'étape de sauvegarde, c'est bon ? Tu as bien ton fichier .xml de l'article qui contient ton champs ? Le champs à saisir lors de la rédaction ?
  • oui je bidouille et torture toujours beaucoup mes pluxml, j'adore ça en fait ;)

    la sauvegarde c'est bon, la restitution dans le back et sur le front (avec la fonction dans le plxshow) c'est bon, mon .xml de l'article contient bien l'info, en fait, ce qui bloque c'est la restitution sur le front mais avec la fonction dans un plugin.

    regarde qd tu pourras. Merci par avance.

    P.S : j'ai installé ton adaptation de SIMPLO et c'est une tuerie. merci pour ce boulot.
  • StéphaneStéphane Member, Former PluXml Project Manager
    Voilà LA bonne méthode pour rajouter un champ de saisie sur la page de rédaction d'un article à partir d'un plugin.

    pour tester
    - créer un dossier plxNewArticleField dans le répertoire "plugins"
    - ajouter dans ce dossier un fichier infos.xml
    - créer un fichier plxNewArticleField.php dans el dossier plugins avec dedans le code ci-dessous

    Servir frais.
    <?php
    
    class plxNewArticleField extends plxPlugin {
    
    	public function __construct($default_lang) {
    
    		# appel du constructeur de la classe plxPlugin (obligatoire)
    		parent::__construct($default_lang);
    
    		# Ajoute des hooks
    		$this->addHook('AdminArticleContent', 'AdminArticleContent');
    		$this->addHook('plxAdminEditArticleXml', 'plxAdminEditArticleXml');
    		$this->addHook('plxMotorParseArticle', 'plxMotorParseArticle');
    		$this->addHook('AdminArticlePostData', 'AdminArticlePostData');
    		$this->addHook('AdminArticleParseData', 'AdminArticleParseData');
    		$this->addHook('AdminArticleInitData', 'AdminArticleInitData');
    		$this->addHook('plxShowArtNewField', 'plxShowArtNewField');
    	}
    
    	# Méthode qui ajoute le nouveau champ sur la page de rédaction d'un article
    	public function AdminArticleContent() {
    		$string = <<<END
    		<?php
    			echo '<fieldset>';
    			echo '<p><label for="id_myfield">Mon nouveau champ :</label></p>';
    			plxUtils::printInput('myfield',plxUtils::strCheck(\$myfield),'text','66-255');
    			echo '</fieldset';
    		?>
    END;
    		echo $string;
    	}
    
    	# Méthode qui écrit la valeur du nouveau champ dans le fichier xml de l'article
    	public function plxAdminEditArticleXml() {
    		echo "<?php	\$xml .= \"\t\".'<myfield><![CDATA['.plxUtils::cdataCheck(trim(\$content['myfield'])).']]></myfield>'.\"\n\"; ?>";
    	}
    
    	# Méthode qui récupère la valeur du nouveau champ dans le fichier xml de l'article
    	public function plxMotorParseArticle() {
    		echo "<?php
    			\$myfield = plxUtils::getValue(\$iTags['myfield'][0]);
    			\$art['myfield'] = plxUtils::getValue(\$values[\$myfield]['value']);
    		?>";
    	}
    	
    	# Méthode qui initialise la valeur du nouveau champ à partir du champ du formulaire 
    	public function AdminArticlePostData() {
    		echo '<?php $myfield = $_POST["myfield"]; ?>';
    	}
    	
    	# Méthode qui récupère la valeur du nouveau champ à partir de l'article
    	public function AdminArticleParseData() {
    		echo '<?php $myfield = trim($result["myfield"]); ?>';
    	}	
    	
    	# Méthode qui initialise la valeur du nouveau champ (nouvel article)
    	public function AdminArticleInitData() {
    		echo '<?php $myfield = ""; ?>';
    	}		
    
    	/*
    	 * Méthode à appeler à partir du theme pour affichier la valeur du champ de l'article en cours
    	 * <?php $plxShow->callHook('plxShowArtNewField') ?>
    	 */
    	public function plxShowArtNewField() {
    		echo "<?php echo plxUtils::strCheck(\$this->plxMotor->plxRecord_arts->f('myfield')) ?>";
    	}
    
    }
    ?>
    
    edit: j'ai volontairement utilisé 3 syntaxes différentes qui permettent d'obtenir le même résultat
    <<<END .... END;
    echo "<?php \$var ?>";
    echo '<?php $var ?>';

    Consultant PluXml

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

  • Mortel Stéphane..... tu es mon sauveur une fois encore. trop bien, tu sais que tu viens de faire un plugin de tueur. pouvoir ajouter des champs dans le back office aussi facilement !!!!
  • StéphaneStéphane Member, Former PluXml Project Manager
    Merci. Avec ça tu as de quoi te faire plaisir ;)

    Consultant PluXml

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

  • Va falloir que je regarde ça ! Merci Stéphane !

    PS : et merci SapinTremblant pour ton avis sur Simplo ;)
  • Merci à tous les 2 de vous être penché dessus. je vais bidouiller encore un peu plus.

    d'ailleurs Stéphane, comment puis-je solutionner mon 2eme problème. Dans ce plugin je voudrais une condition sur un nouveau champs. Si le champs est vide alors je n'affiche rien en Front. et aussi, comment passer des paramètres à cette fonction pour les "régler" dans mes Templates:
    public function plxShowDOCPresse($picto, $phrase) {
    		$documentpresse = $this->plxMotor->plxRecord_arts->f('myfield2');
    		if (!empty($documentpresse)){
    		        echo '<div class="art-chapo '.$picto.'"><a class="picto telecharger encadre" href="'."<?php echo \$this->plxMotor->plxRecord_arts->f('myfield2') ?>".'">'.$phrase.'</a></div>';
    			}
        }
    
    P.S. : aussi, dans ton code les infos du .xml de l'article ne remontent pas dans article.php en BO. Elles s'enregistrent bien mais ne s'affiche pas.
  • StéphaneStéphane Member, Former PluXml Project Manager
    Toi, t'as pas lu la doc... :)

    http://telechargements.pluxml.org/docs/PluXml_-_Plugins_Guide_du_developpeur_5.1.5.zip

    C'est expliqué dedans: il y a 2 nouveaux chapitres qui expliquent comment passer des paramètres à la fonction callHook et comment récuperer une valeur de retour.

    Allez je suis bon prince, je te fais un résumer

    tu as donc ta fonction
    public function plxShowDOCPresse($picto, $phrase) {
            $documentpresse = $this->plxMotor->plxRecord_arts->f('myfield2');
            if (!empty($documentpresse)){
                    echo '<div class="art-chapo '.$picto.'"><a class="picto telecharger encadre" href="'."<?php echo \$this->plxMotor->plxRecord_arts->f('myfield2') ?>".'">'.$phrase.'</a></div>';
                }
        }
    
    dans ton theme tu peux donc appeler ta fonction de cette façon

    si tu as besoin d'un seul parametre:
    <?php $plxShow->callHook('plxShowDOCPresse', 'param1') ?>
    
    ou si 2 ou plusieurs paramètres:
    <?php $plxShow->callHook('plxShowDOCPresse', array('param1', 'param2')) ?>
    
    quand tu dois appeler ta fonction avec + de un paramètres, il faut les placer sous forme de tableau

    Consultant PluXml

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

  • décembre 2011 modifié
    le guide, j'en étais encore à la version 5.13 et je l'ai ouvert quasi tout le tps mais certains concepts m'échappent en fait. Je vais étudier la 5.15 alors. Merci pour tout.
  • je dois etre vraiment trop nul mais je n'arrive à rien n'afficher avec les hooks à paramètres. J'ai lu et relu la doc, fais des tests et rien ne ressort. je ne comprends pas.

    voila ce que j'ai :
    <?php
    
    class plxNewArticleField extends plxPlugin {
    
        public function __construct($default_lang) {
    
            # appel du constructeur de la classe plxPlugin (obligatoire)
            parent::__construct($default_lang);
    
            # Ajoute des hooks
            $this->addHook('plxShowDOCPresse', 'DOCPresse');
    }
    
    public function DOCPresse($params) {
    		echo $params[0];
    		echo $params[1];
    
    		$plxMotor = plxMotor::getInstance();
    		$plxShow = plxShow::getInstance();
    		$documentpresse = $plxMotor->plxRecord_arts->f('myfield2');
    
    		if (!empty($documentpresse)){
    		        echo '<div class="art-chapo '.$params[0].'"><a class="picto telecharger encadre" href="'."<?php echo \$this->plxMotor->plxRecord_arts->f('myfield2') ?>".'">'.$params[1].'</a></div>';
    			}
        }
    
    ?>
    
    puis dans mon template :
    <?php $plxShow->callHook('plxShowDOCPresse', array('docpress','download')); ?>
    
    et cela n'affiche pas les paramètres passés, le reste oui mais les paramètres.

    Si quelqu'un veut bien m'aider, je tourne en rond.
  • Jerry WhamJerry Wham Member
    décembre 2011 modifié
    A mon avis l'erreur vient de là :
    echo '<div class="art-chapo '.$params[0].'"><a class="picto telecharger encadre" href="'."<?php echo \$this->plxMotor->plxRecord_arts->f('myfield2') ?>".'">'.$params[1].'</a></div>';
    
    tu devrais écrire ainsi :
    $string =<<<END
    <?php
                  echo  '<div class="art-chapo '.$params[0].'">';
                  echo  '        <a class="picto telecharger encadre" href="'.\$this->plxMotor->plxRecord_arts->f('myfield2').'">'.$params[1].'</a></div>';
    ?>
    END;
    
         echo $string;
    
    Ayant écris ce code dans le formulaire de réponse du forum sans coloration syntaxique il se peut que j'ai fait des erreurs de guillemets. A vérifier mais l'idée est là.

    Wham ;)

    PS : Vérifie dans le log php s'il n'y a pas d'erreur de syntaxe.
Connectez-vous ou Inscrivez-vous pour répondre.