plugin article(s) liés

Bonjour,
je tente depuis ce matin d'obtenir plugin avec un select multiple qui me permettrai de lier des articles entre eux.
l'affichage pourrai à terme se faire à la façon du plugin suggestion que je viens de découvrir...sauf que je n'en suis pas encore là :(

dans l'ordre :
- function AdminArticleTop() ne me prend pas la valeur par défaut ?
- plxAdminEditArticleXml() n'écrit pas la valeur de $ArticleLinks...alors qu'avec un champ texte ça passe...
bref ça sent le problème de récupération de variable pour champ multiple...mais je patauge

si en passant qq'un peut m'aiguiller sur un chemin pas trop caillouteux, je le remercie par avance
[== PHP ==]
class ArticleLinks extends plxPlugin {

		public function __construct($default_lang) {
			parent::__construct($default_lang);
			
			$this->setConfigProfil(PROFIL_ADMIN);

			$this->addHook('AdminArticleContent', 'AdminArticleContent');
			$this->addHook('AdminArticleTop', 'AdminArticleTop');
			$this->addHook('plxAdminEditArticleXml', 'plxAdminEditArticleXml');
			$this->addHook('plxMotorParseArticle', 'plxMotorParseArticle');
			$this->addHook('AdminTopEndHead', 'AdminTopEndHead');
			$this->addHook('ArticleLinks', 'ArticleLinks');
		}
	
		public function AdminTopEndHead() {
			echo "\t".'<link rel="stylesheet" type="text/css" href="'.PLX_PLUGINS.'ArticleLinks/style.css" />'."\n";
		}
		
		public function AdminArticleTop() { // charge les champs Admin
			$string = "
			\$ArticleLinks= (!empty(\$_POST)) ? \$_POST['ArticleLinks'] : '2_4';
				if (is_array(\$ArticleLinks))
				{   foreach(\$ArticleLinks as \$cle => \$valeur)
					{   if (\$cle==0) {\$ArticleLinks = \$valeur;}
						else {\$ArticleLinks .= '_'.\$valeur;}
					}
				}
			";
			echo "<?php ".$string." ?>";
			
		}

		public function AdminArticleContent()   // affichage dans admin/nouvel article
		{	# obtenir contenu du champ ArticleLinks
			//$ArticleLinks="2_4";
			
			# exploser en array si plusieurs choix
			if( strpos($ArticleLinks, '_') !== false) {$a_ArticleLinks = explode('_', $ArticleLinks);}
			else { $a_ArticleLinks[0] = $ArticleLinks; }
		    
			# requete pour avoir la liste des articles disponibles (en attendant)
			$articles_dispos = array(1=>"article 1", 2=>"article 2", 3=>"article 3", 4=>"article 4", 5=>"article 5");
						
			echo '<div id="ArticleLinks" >article(s) lié(s) :';	
			echo '<select multiple name="ArticleLinks[]" size="6">';
					  foreach ($articles_dispos as $id_art=>$titre_art)
                                          {     //$id_art= row['id_art'];
						$selected = (in_array($id_art,$a_ArticleLinks)) ? 'selected="selected"' : '';
						echo '<option value="'.$id_art.'" '.$selected.' title="$id='.$id_art.'">'.$titre_art.'</option>';
                                          }
                      echo'</select>';
		      echo "</div>";
			
		}


		public function plxAdminEditArticleXml() { // écriture dans article.xml
			echo "<?php 
				\$xml .= \"\t\".'<ArticleLinks><![CDATA['.plxUtils::cdataCheck(trim(\$content['ArticleLinks'])).']]></ArticleLinks>'.\"\n\"; 
				?>";			                  
		}

		public function plxMotorParseArticle() {
			echo "<?php if(isset(\$iTags['ArticleLinks'][0])){ \$art['ArticleLinks'] = trim(\$values[ \$iTags['ArticleLinks'][0] ]['value']);} ?>";
		}

		public function ArticleLinks() { // appel par callHook('ArticleLinks')  
		$plxMotor_inst = plxMotor::getInstance(); // permet de récupérer les champs de l'article
		if($plxMotor_inst->plxRecord_arts->f('ArticleLinks')) {
					$return = $plxMotor_inst->plxRecord_arts->f('ArticleLinks');
					return $return;		
		}
			return false;
		}	
	
	}

Réponses

  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour

    Dans la méthode plxAdminEditArticleXml, tu ne peux pas faire
    plxUtils::cdataCheck(trim(\$content['ArticleLinks']))
    
    car la variable $content est un tableau. Tu ne peux pas la traiter comme une chaine de caractère.
    Essaye en faisant à l'enregistrement
    implode(',', $content['ArticleLinks'] );
    
    et à la lecture utilise explode pour convertir la chaine en tableau

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • Bonjour Steph (de Steph à Steph, je me permets ;)
    grâce à toi j'enregistre désormais ma variable dans le xml et je la récupère dans AdminArticleTop() en fin de traitement avec
    [== PHP ==]
    public function AdminArticleTop() { // charge les champs Admin
    			$string = "
    					if(!empty(\$_POST)) {
    						\$ArticleLinks= trim(\$_POST['ArticleLinks']);
    						if(!empty(\$_POST['preview'])) {
    								\$art['ArticleLinks'] = trim(\$_POST['ArticleLinks']);
    						}
    					}
    					if(!empty(\$_GET['a'])) { \$ArticleLinks = trim(\$result['ArticleLinks']);}
    					else { \$ArticleLinks=''; }
    					
    					if( strpos(\$ArticleLinks, '_') !== false) {\$a_ArticleLinks = explode('_', \$ArticleLinks);}
    					else { \$a_ArticleLinks[0] = \$ArticleLinks; }
    				";
    			echo "<?php ".$string." ?>";	
    		}
    
    dans AdminArticleContent() j'ai maintenant :
    [== PHP ==]
    echo '<?php print_r($a_ArticleLinks); ?><br/>'; //valeurs saisies
    $articles_dispos = array(1=>"article 1", 2=>"article 2", 3=>"article 3", 4=>"article 4", 5=>"article 5"); //valeurs à comparer
    
    echo '<div id="ArticlesJoints" >article(s) joint(s) :';	
    echo '<select multiple name="ArticleLinks[]" size="6">';
    		foreach ($articles_dispos as $id_art=>$titre_art){
                                $selected = (in_array($id_art,$a_ArticleLinks)) ? 'selected="selected"' : '';
    			    echo '<option value="'.$id_art.'" '.$selected.' >'.$titre_art.'</option>';
                     }
    echo'</select></div>';
    
    j'ai bien $a_ArticleLinks = Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 )...mais impossible de passer ce tableau en $selected alors que le select se remplit bien avec $articles_dispos ??????
    j'ai essayé de tout passer en echo'<?php [foreach...] ?>'; (particularité pluxml ) ...mais sans succès
    une dernière idée ?
  • StéphaneStéphane Member, Former PluXml Project Manager
    au lieu de in_array utilise array_search
    http://www.php.net/manual/fr/function.array-search.php

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • paysan hardipaysan hardi Member
    juillet 2013 modifié
    c'est pas mieux...même pire :
    pour un tableau donné : $a_ArticleLinks=Array ( 0=>1, 1=>2, 2=>5 );

    array_search ne me prend pas le rang 0, seuls 2 et 5 sont selected ?
    in_array m'affiche les bons 1,2 et 5

    mon souci serait surtout de ne pas avoir à donner les valeurs, puisque le tableau arrive dans AdminArticleContent(), s'affiche avec
    [== PHP ==]
    echo '<?php print_r($a_ArticleLinks); ?><br/>';
    
    ..sauf que dans le foreach ma variable est vide ????
    c'est cette redondance que j'ai du mal à appréhender, cette syntaxe echo'<?php echo"";?>'; qui me fout la pagaille mais qui doit avoir ses raisons.
Connectez-vous ou Inscrivez-vous pour répondre.