Demande d'aide pour création d'un plugin

JulienCognitoJulienCognito Member
septembre 2018 modifié dans Entraide
Bonjour à tous,

Suite à [topic=6048]ce message[/topic], j'imagine bien que Bronco n'est pas dispo et que détricoter un plugin n'enchante personne.
C'est pourquoi je vais prendre les choses dans l'autre sens et demander de l'aide pour construire, en s'inspirant, un plugin de galerie minimaliste.
En fait je souhaiterais pouvoir intégrer une galerie aux articles de manière simplissime.
Le code de l'affichage dans article.php pourrait être celui proposé dans le wiki:
<?php
# Récupération et affichage de la liste des images sous forme de liste
$glob = plxGlob::getInstance($dir);

if ($files = $glob->query('/[a-z0-9-_]+.tb.(jpg|gif|png)$/i')) {
    echo '<ul class="galerie">';
    foreach($files as $filename) {
        $file = $dir.'/'.$filename;
        echo '<li><a href="'.str_replace('.tb', '', $file).'"><img src="'.$file.'" alt="" /></a></li>';
    }
    echo '</ul>';
}
else echo "Aucune image";
?>
ou la variable $dir serait récupérée d'une sélection de dossier dans la page d'édition d'un article... comme dans GalArt de Bronco :8

Mais prenons du début.

CONFIG.PHP pour préciser le dossier recevant les galleries

le code ci-dessous volé à JerryWham fonctionne bien.
<?php 
if(!defined("PLX_ROOT")) exit; ?>
<?php 
	if(!empty($_POST)) {
		$plxPlugin->setParam("rep", ($_POST["rep"] == '' ? $plxAdmin->aConf["medias"].'images/' : plxUtils::strCheck($_POST["rep"])), "string");
		$plxPlugin->saveParams();
		header("Location: parametres_plugin.php?p=minigal");
		exit;
	}
?>
<h2><?php $plxPlugin->lang("L_TITLE") ?></h2>
<p><?php $plxPlugin->lang("L_DESCRIPTION") ?></p>
<form action="parametres_plugin.php?p=minigal" method="post" >
	<p>
		<label>Répertoire principal des images : 
			<input type="text" name="rep" value="<?php echo ($plxPlugin->getParam("rep") == '' ? $plxAdmin->aConf["medias"].'images/' : $plxPlugin->getParam("rep"));?>"/>
            <a class="hint"><span><?php echo L_HELP_SLASH_END ?></span></a>&nbsp;<strong>ex: data/medias/images/</strong>
		</label>
		</p>

	<br />
	<input type="submit" name="submit" value="Enregistrer"/>
</form>

MINIGAL.PHP - hook=AdminArticleContent - Ajout de la liste déroulante en bas de la page d'édition d'un article
Encore volé à GalArt
public function AdminArticleContent(){
		$label=$this->getLang("L_ARTICLE_FOLDER");		
		echo '<?php 
		function recursiveDirContent($root=null){
			if (empty($root)){return false;}
			if (!is_dir($root)){return array($root);}
			$iter = new RecursiveIteratorIterator(
			    new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
			    RecursiveIteratorIterator::SELF_FIRST,
			    RecursiveIteratorIterator::CATCH_GET_CHILD # Ignore "Permission denied"
			);

			$paths = array($root);
			foreach ($iter as $path => $dir) {		
				$paths[] = $path; 
			}

			return $paths;
		}
			$folders=recursiveDirContent(PLX_ROOT."'.$this->getParam('rep').'");
			?>';

		echo '
					<div class="sml-12"><label for="id_url_link">'.$label.'</label><select name="folder" id="folder_image">';
					echo "<option value=''></option>\n";
		echo '<?php
		foreach ($folders as $item) {
			if (is_dir($item)){	
				if (PLX_ROOT.$folder==$item){$selected="selected=\"true\"";}else{$selected="";}
				echo "<option value=\'".str_replace(PLX_ROOT,\'\',$item)."\' $selected>".str_replace(PLX_ROOT.$plxAdmin->aConf[\'medias\'],\'\',$item)."</option>\n";
			}
		} ?>
		</select></div>';
	}	

MINIGAL.PHP - hook=plxAdminEditArticleXml - Ajout de l'info dossier au fichier XML de l'article
Toujours emprunté à Bronco
public function plxAdminEditArticleXml(){
		echo '<?php 
			$folder = plxUtils::getValue($content["folder"]);
			$xml .= "\t<folder><![CDATA[".plxUtils::cdataCheck(trim($folder))."]]></folder>\n";					
			?>';
	}
	

MINIGAL.PHP - hook= AdminArticleParseData/AdminArticleInitData - On récupère l'info dans l'article
Là je comprends déjà plus rien.
	# Ajout de la variable $url_link (édition d'un article)
	public function AdminArticleParseData(){
		echo '<?php 
			if (!isset($result["folder"])){
				$folder="";
			}else{
				$folder=$result["folder"];
			}
		?>';
	}

		# Ajout de la variable $url_link lors de l'initialisation
	public function AdminArticlePostData(){
		echo '<?php	$folder = plxUtils::strCheck($_POST["folder"]);?>';
		
	}

Qu'est ce qu'il manque?
Ah oui, l'appel de l'info ci dessus, et son insertion dans le code tout en haut! Là, le code de Bronco rajoute la génération de vignette, la cration d'un flux rss, et ma méconnaissance totale en prog php m’empêche d'avancer:
  1. Quel hook pour apparaître en fin de contenu ArtContent? plxMotorParseArticle?
  2. J'ai oublié des trucs?
  3. Comment modifier le code indiqué tout en haut issu du wiki pour afficher la gallerie.
  4. Comment insérer un peu de css? Dans l'idéal, il apparaîtra dans l'administration du plugin.

Bref, il y a du boulot mais les essais en php, je n'y arrive pas (une erreur de syntaxe et vlan!) donc mon tatonement habituel à base de "afficher le code source" dans firefox n'est pas efficace.

Merci d'avance aux programmeurs chevronnés que je lis ici pour leur attention;

Julien

PS: je peux héberger ça sur un dépôt Gitea, si c'est plus simple.

Réponses

  • Bonjour;

    Non, ce n'est pas un UP, c'est un point sur mes avancés. ;)
    J'ai hébergé le code sur gitea là pour plus de facilité mais je le pose ici aussi pour l'historique.

    La partie config, admin et xml semble fonctionner. Mais pour l'ajout côté public, je ne m'en sort pas (derniers paragraphe)
    <?php
    
    class minigal extends plxPlugin {
    	public function __construct($default_lang) {
    		
    # defaut
    	parent::__construct($default_lang);
    	$this->setConfigProfil(PROFIL_ADMIN);
    		
    		
    # Declaration des Hooks
    	$this->addHook('plxAdminEditArticleXml','plxAdminEditArticleXml');		
    	$this->addHook('AdminArticleContent','AdminArticleContent');
    	$this->addHook('AdminArticlePreview','AdminArticlePreview');
    	$this->addHook('AdminArticlePostData','AdminArticlePostData');
    	$this->addHook('AdminArticleInitData','AdminArticleInitData');
    	$this->addHook('AdminArticleParseData','AdminArticleParseData');
    	$this->addHook('plxMotorParseArticle','plxMotorParseArticle');
    		}
    
    # Fonctions Activation/Désactivation, inutilisé
    	public function OnActivate() {}
    	public function OnDeactivate() {}
    	
    #################################################################################################################
    
    
    # Ajoute le stockage dossier dans le fichier de l'article
    	public function plxAdminEditArticleXml(){
    		echo '<?php 
    			$folder = plxUtils::getValue($content["folder"]);
    			$xml .= "\t<folder><![CDATA[".plxUtils::cdataCheck(trim($folder))."]]></folder>\n";					
    			?>';
    	}
    
    # Ajout d'un input sur la page admin pour gérer le dossier associé à un article
    	public function AdminArticleContent(){
    		$label=$this->getLang("L_ARTICLE_FOLDER");		
    		echo '<?php 
    		function recursiveDirContent($root=null){
    			if (empty($root)){return false;}
    			if (!is_dir($root)){return array($root);}
    			$iter = new RecursiveIteratorIterator(
    			    new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
    			    RecursiveIteratorIterator::SELF_FIRST,
    			    RecursiveIteratorIterator::CATCH_GET_CHILD # Ignore "Permission denied"
    			);
    
    			$paths = array($root);
    			foreach ($iter as $path => $dir) {		
    				$paths[] = $path; 
    			}
    
    			return $paths;
    		}
    			$folders=recursiveDirContent(PLX_ROOT."'.$this->getParam('rep').'");
    			?>';
    
    		echo '
    					<div class="sml-12"><label for="id_url_link">'.$label.'</label><select name="folder" id="folder_image">';
    					echo "<option value=''></option>\n";
    		echo '<?php
    		foreach ($folders as $item) {
    			if (is_dir($item)){	
    				if (PLX_ROOT.$folder==$item){$selected="selected=\"true\"";}else{$selected="";}
    				echo "<option value=\'".str_replace(PLX_ROOT,\'\',$item)."\' $selected>".str_replace(PLX_ROOT.$plxAdmin->aConf	[\'medias\'],\'\',$item)."</option>\n";
    			}
    		} ?>
    		</select></div>';
    	}
    
    	
    # Gestion du lien dans la prévisualisation d'un article	
    	public function AdminArticlePreview(){
    		echo '<?php	$art["folder"] = plxUtils::strCheck($_POST["folder"]);?>';
    	}
    
    # Gestion du lien posté dans l'article
    	public function AdminArticlePostData(){
    		echo '<?php	$folder = plxUtils::strCheck($_POST["folder"]);?>';
    	}
    
    # Ajout de la variable $url_link (nouvel article)
    	public function AdminArticleInitData(){
    		echo '<?php	$folder = "";?>';
    	}
    
    # Ajout de la variable $url_link (édition d'un article)
    	public function AdminArticleParseData(){
    		echo '<?php 
    			if (!isset($result["folder"])){ $folder="";
    			}else{$folder=$result["folder"];
    			}
    		?>';
    	}
    
    # Gestion du dossier dans le parsing d'un article
    	public function plxMotorParseArticle(){
    		echo '<?php 
    		if (!empty($iTags["folder"])){
    			$art["folder"] = $values[$iTags["folder"][0]]["value"];
    			if (!defined("PLX_ADMIN")){				
    				$art["content"].="
    					".$this->plxPlugins->aPlugins["minigal"]->galerie(PLX_ROOT.$art["folder"],true);
    			}
    		}else{
    			$art["folder"] = "";
    		}
    		?>';
    	}
    
    ##################################################################################################################
    	
    	public function galerie($path=null,$title=null,$infos=false){
    		$plxMotor = plxMotor::getInstance();
    		if (!$path || $path == PLX_ROOT){return false;}
    		$liste=array_merge(glob($path.'/*.png'),glob($path.'/*.gif'),glob($path.'/*.jpg'),glob($path.'/*.jpeg'));
    		echo  '<?php 		
    		$content.= '<div class="gallery">';
    			foreach($liste as $image){	
    				$i=basename($image);
    				$content.=  "<a href='".$plxMotor->urlRewrite($image)."' class='photo' ><img src='".$plxMotor->urlRewrite($image,'.tb',)."' /></a>";
    		}
    	?>';
    		else{$content.=  '<p class="error">Pas d\'image dans <em>'.$path.'</em></p>';}
    		return $content;
    	}
    }
    
    

    Bien amicalement,

    Julien
Connectez-vous ou Inscrivez-vous pour répondre.