Rechercher : dans
Par :

[PHP] concaténation dans une boucle

Dernière réponse le 22 jui 2007 à 22:19:16 Ourse, le 14 jui 2007 à 19:34:50 
 Signaler ce message aux modérateurs

Bonjour,

J'utilise une boucle PHP pour afficher une liste de liens.
Voici l'extrait de la boucle concerné :

$title = $article["title"];
		$link = $article["link"];
		$description = $article["description"];
		$page .= "<li><a href=\"$link\">$title</a>";
		if($description != false)
		{
			$page .= "<br>$description";
		}
		$page .= "</li>\n";			
		
		if($type==0)
		{
			$page .="</b><br />";
		}


Je voudrais ajouter un rollover sur chaque lien.

Donc, j'essaie de rajouter dans la concaténation, la chaîne :
onMouseOver=\"cache('map');montre('text')\"  onMouseOut=\"cache('text');montre('map')\"


J'ai essayé plusieurs formes de concaténation. Ça ne marche pas.

Pouvez-vous m'aider svp ?
Configuration: Mac OS X
Firefox 2.0.0.4

Meilleures réponses pour « [PHP] concaténation dans une boucle » dans :
PHP - Concaténation Voir PHP permet de concaténer des chaînes de caractères grâce à l'opérateur "." : $concatenation= $a . $b; Ou encore pour affecter, dans la variable $a, la valeur de la concaténation de $a et de $b : $a.=$b; Pour concaténer des chaînes et des...
Javascript - Concaténation de chaînes de caractères VoirLe terme "concaténer" signifie joindre deux chaînes bout à bout pour n'en former qu'une seule. Dans la plupart des langages tels que PHP, la concaténation se fait avec le caractère ".". En javascript, il suffit d'utiliser le caractère plus (+) ou...
[PHP] Les ressemblances à ne pas confondre VoirIntroduction Concaténation ou paramètres ? Guillemets/Apostrophe Structure require/include isset vs empty htmlentities ou htmlspecialchars ? Nombre de signes égal Introduction Cette astuce présente plusieurs fonction ou astuces en...
PHP - Structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (le PHP associe le mot clé true à 1...
PHP - Les fichiers VoirLa gestion des fichiers avec PHP Avec PHP, la création ou la lecture de fichiers est, une fois de plus, assez simple. Il existe une multitude de fonctions dédiées à l'utilisation des fichiers. La communication entre le script PHP et le fichier...
PHP - Récupération de données VoirPHP rend très simple la récupération de données envoyées par l'intermédiaire de formulaires HTML. Création d'un formulaire Grâce à la balise FORM du langage HTML, il est très simple de créer des formulaires comprenant : des champs de saisie des...

1

Posotaz, le 14 jui 2007 à 20:10:31

Bonsoir Ourse,

Ca dépend aussi du code JavaScript, c'est peut-être lui qui est en tort.

Le onmouseover et le onmouseout sont bien mis à l'intérieur du "<a>", avant ou après le "href" ?

$page .= "<li><a href=\"$link\" onmouseover=\"cache('map');montre('text')\" onmouseout=\"cache('text');montre('map')\">$title</a>";

Donc il faut bien que ton HTML contienne deux balises identifiées "text" et "map" et que je JavaScript (par un document.getElementById("lenomdelabalise")) utilise la propriété visibility, mise à "visible" dans un cas et "hidden" dans l'autre.

Quoiqu'il en soit c'est le résultat final en HTML qui compte. Donc compare le code retourné par le script avec tes attentes. Et au fait je ne suis pas certain que "onmouseout" et "onmouseover" prennent des majuscules mais dans ce cas précis ça ne devrait pas avoir d'incidence.

Répondre à Posotaz

2

Ourse, le 14 jui 2007 à 22:11:57

Bonsoir Posotaz et merci.

Oui, j'ai bien isolé la source du problème.
Le javascript fonctionne très bien et les div text et map existent :
la portion que j'essaie d'insérer dans le php, je l'ai d'abord testée sur un autre lien de la même page, mais codée "en dur". Elle donne exactement le comportement attendu.

Je viens d'essayer avec la ligne que tu proposes. Cela donne le même résultat étonnant que j'avais moi avant de poser la question ici :

la portion [onmouseover=\"cache('map');montre('text')\" onmouseout=\"cache('text');montre('map')\"] semble ignorée. La liste de liens s'écrit dans le navigateur client comme si elle n'existait pas !
J'ai bien vérifié sur le serveur que le code php avait été uploadé dans sa version corrigée.

C'est un vrai mystère ! Je ne comprends pas.

Répondre à Ourse

3

Gihef, le 15 jui 2007 à 19:26:51

Bonjour,

Tu te simplifierais peut-être la vie en utilisant des CSS ?
Le style s'appliquant aux <a> munis de la “class="liens_liste"”, seuls ceux de la liste seront concernés.

Par exemple :

  a.liens_liste {
    color : #fff;
    text-decoration : underline overline;
    }
  a.liens_liste:hover {
    color : #000;
    text-decoration : none;
    }
etc. (avec des images c'est aussi possible).

et
  $page .= "<li><a class="liens_liste" href=\"$link\">$title</a>";
 

Répondre à Gihef

4

Ourse, le 16 jui 2007 à 17:25:34

Merci Gihef, mais ma question porte sur du contenu dynamique, pas sur du style.
D'ailleurs, j'utilise bien les CSS, très pratiques, tu as raison.
Et mes feuilles de styles sont valides W3C ;-) Mon code XHTML 1.1 aussi ;-))

Répondre à Ourse

5

Reivax962, le 16 jui 2007 à 17:38:51

Bonsoir,

Tu pourrais nous montrer ce que donne ton code php ?
Et un bout du code html généré ?

Merci,

Xavier

Répondre à Reivax962

6

Ourse, le 16 jui 2007 à 22:45:17

Bonsoir Xavier,

Voici la portion de code PHP concernée. Elle est dans une <div> :

$page .="<ul>\n";

   foreach($recents as $article)
   {
      $type = $article["type"];
      if($type == 0) continue;
      $title = $article["title"];
      $link = $article["link"];
      $page .= "<li><a href=\"$link\">$title</a></li>\n";         
   }

   $page .="</ul>\n";
   return $page; 
}


Le html retourné est une liste. En voici un extrait :

<ul>
<li><a href="http://www.xxx/">Article 1</a></li>
<li><a href="http://www.yyy/">Article 2</a></li>
[ETC]
</ul>


Je voudrais insérer dans le code PHP un instruction de rollover pour permettre d'afficher au 1er plan, dans un bloc voisin qui contient une image (z-index:0), un autre bloc (z-index=1)avec des informations complémentaires sur l'article dont on survole le titre ; cela permettrait à l'utilisateur de savoir si l'article l'intéresse vraiment avant qu'il ne clique.


Côté code javascript, c'est du tout classique et cela fonctionne très bien sur un lien simple (hors de la liste produite par php )

<script language="javascript">
  function montre(id) {
	  if (document.getElementById) {
		  document.getElementById(id).style.visibility="visible";
		} else if (document.all) {
		  document.all[id].style.visibility="visible";
		} else if (document.layers) {
		  document.layers[id].visibility="visible";
		} } 
		
    function cache(id) {
	  if (document.getElementById) {
		  document.getElementById(id).style.visibility="hidden";
		} else if (document.all) {
		  document.all[id].style.visibility="hidden";
		} else if (document.layers) {
		  document.layers[id].visibility="hidden";
		} }
</script>




Donc, je voudrais insérer, dans le code de chaque ligne de la liste, donc dans le code PHP qui fabrique cette liste :

onMouseOut="cache('map');montre('text')" onMouseOut="cache('text');montre('map')"


map et text sont respectivement les id des zones image et texte qui doivent alterner.

Merci par avance.

Répondre à Ourse

7

Reivax962, le 17 jui 2007 à 09:36:14

Bonjour,

En fait c'est surtout le code qui ne marche pas qui m'intéresse ;)

Xavier

Répondre à Reivax962

9

Ourse, le 17 jui 2007 à 19:53:36

Dans le fil, j'ai déjà exposé que j'avais essayé la concaténation suivante :

$page .= "<li><a href=\"$link\" onmouseover=\"cache('map');montre('text')\" onmouseout=\"cache('text');montre('map')\">$title</a>"; 


Dans le html résultant, la partie onmouseover--> onmouseout est ignorée. La ligne s'écrit comme une ligne usuelle de liste.

Répondre à Ourse

12

Reivax962, le 17 jui 2007 à 20:21:20

Ah oui, je l'avais ratée...
Bref, effectivement, il n'y a aucune raison pour que cela ne marche pas.
Si, à la place du bloc complet, tu ne mets que " onmouseout ", sans rien d'autre (je sais, cela n'a aucun sens html, là n'est pas la question), est-ce qu'il apparait en sortie ou pas ?

Répondre à Reivax962

13

Ourse, le 17 jui 2007 à 20:46:40

Je viens d'essayer :

$page .= "<li><a href=\"$link\" onmouseout>$title</a>";


Le mot "onmouseout" est tout simplement ignoré. C'est exactement là le mystère.
Est-ce un problème de syntaxe ou autre chose ?

Répondre à Ourse

16

Reivax962, le 18 jui 2007 à 09:25:40

Ben... Je ne vois que deux solutions possibles :
- tu n'ouvres pas le même fichier que celui que tu modifies ;
- ton navigateur garde en cache l'ancienne version et ne veut rien savoir. Auquel cas, essaie de bien raffraichir la page, de supprimer tes fichiers temporaires, voire carrément d'accéder à ton site depuis un autre navigateur.

Répondre à Reivax962

8

Alain42, le 17 jui 2007 à 15:13:12

Est ce qu'une infoBull t'irrai:

Mettre des informations a l'aide d'une bulle lorsque vous passez votre souris sur un lien

Bien souvent vous souhaitez informer l'internaute sur le lien d'une page. Cette information consiste a expliquer par un court texte le contenu de la page avant de cliquer sur le lien:

* <a href="url de votre lien" target="_blank" title="texte souhaité pour expliquer le lien"></a>
* Exemple avec ce lien (Placez juste votre souris sur le lien sans cliquer et attendez que l'infobulle s'affiche ):

* Trucs et Astuces Astwinds

Voici la balise pour obtenir ce résultat:
<a href="http://www.astwinds.com/" target="_blank" title="Tous les trucs et Astuces pour Windows Xp et la conception de votre site sur http://www.astwinds.com/">Trucs
et Astuces Astwinds</a>

<a href= ouvre la balise du lien

"url de votre lien" lien de la page vers laquelle pointe votre lien. Dans ce cas le lien pointe sur la page d'accueil d'Astwinds

target="_blank" votre page s'ouvrira dans une autre fenêtre

title="Tous les trucs et Astuces pour Windows Xp et la conception de votre site sur http://www.astwinds.com/"> Texte que vous souhaitez afficher lorsque l'internaute passe la souris sur le lien sans cliquer

Le texte en bleu est le texte visible du lien sur votre page

</a> ferme la balise du lien

Répondre à Alain42

10

Ourse, le 17 jui 2007 à 19:55:24

Merci Alain. Mais non, une infobulle ne convient pas. J'ai besoin d'afficher un texte plus long et mis en forme, qui doit venir dans un bloc prédéfini et positionné à un endroit précis.

Répondre à Ourse

11

Alain42, le 17 jui 2007 à 20:04:21

Alors une piste:

ton lien appelle une foncton javascript /Ajax qui va appeler un script php en lui transmetant les valeurs voulues qui irra chercher les infos et chargera ensuite la réponse dans un div à l'endroit que tu veux dans ta page.

pour ça va voir sur google comment se font les appels AJAX

Répondre à Alain42

14

Alain42, le 17 jui 2007 à 22:36:26

Voilà une fonction Javascript /Ajax qui devrait te convenir:

<script language="Javascript"type="text/JavaScript">
// Requette AJAX
function makeRequest(url,valeur,id_ecrire){
	var http_request = false;
		//créer une instance (un objet) de la classe désirée fonctionnant sur plusieurs navigateurs
        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');//un appel de fonction supplémentaire pour écraser l'en-tête envoyé par le serveur, juste au cas où il ne s'agit pas de text/xml, pour certaines versions de navigateurs Mozilla
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Abandon :( Impossible de créer une instance XMLHTTP');
            return false;
        }
        http_request.onreadystatechange = function() { traitementReponse(http_request,id_ecrire); } //affectation fonction appelée qd on recevra la reponse
		// lancement de la requete
		http_request.open('POST', url, true);
		//changer le type MIME de la requête pour envoyer des données avec la méthode POST ,  !!!! cette ligne doit etre absolument apres http_request.open('POST'....
		http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		data="val_sel=valeur;
        http_request.send(data);
}

function traitementReponse(http_request,id_ecrire) {
	var affich="";
	if (http_request.readyState == 4) {
		if (http_request.status == 200) {
					// cas avec reponse de PHP en mode texte:
			//chargement des elements reçus dans la liste
			var affich_list=http_request.responseText;
				obj = document.getElementById(id_ecrire); 
                obj.innerHTML = affich_list;
		} 
		else {
                alert('Un problème est survenu avec la requête.');
        }
    }
}
</script>


dans ta page tu met sur le lien onmouseOver=makeRequest('repPhpAjax.php','la_valeur_du_lien','details');


tu mets un <div id="details">
//la apparaitra la réponse
</div>

tu fais un script php:
repPhpAjax.php

avec $valeur_passee=$_POST['valeur'];
variable que tu utilises pour interroger ta base et obtenir le complément d'info que tu mettra dans la variable $reponse

$reponse="..................................";
$reponse.="................................";


echo $reponse;

Cette reponse envoyée ainsi à Ajax sera affichée dans ton div.

Est ce que ça te va ?

Répondre à Alain42

15

Reivax962, le 18 jui 2007 à 09:23:46

Oui mais là, tu te heurtes à nouveau à son problème, qui est qu'il n'arrive pas à mettre de onmouseover dans son code...

Répondre à Reivax962

17

 Ourse, le 22 jui 2007 à 22:19:16

Bonsoir,

Je reviens pour vous dire que j'ai résolu le problème.

Le code suivant marche très bien :

$page .="<li><a href=\"$link\"";	
		$page .= "onmouseover=\"cache('map');cache('map2');cache('map3');montre('text')\"";	
	
	$page .= "onmouseout=\"cache('text');montre('map');montre('map2');montre('map3')\">";	
	$page .= "$title</a></li>\n";	


J'ai laissé le problème de côté pendant 48 heures puis j'ai recommencé depuis le début et ça a marché.
Ce qui s'est passé : dans ma bibliothèque de fonctions, je ne mettais pas le code dans la bonne fonction. Il y a en a deux qui se ressemblent beaucoup : une qui fabrique le lien pour le code source et l'autre qui fabrique l'affichage pour le navigateur, je crois. Vraisemblablement, j'ai dû essayer sans m'en rendre compte dans le seconde fonction au lieu de la première.

Merci pour votre aide à tous. Ce qui m'a aidée, c'est que vous ne trouviez pas normal que ça ne marche pas. Cela m'a encouragée à persévérer.
Merci aussi pour la portion de code Ajax. je vais pouvoir l'essayer maintenant, ça m'intéresse.

Répondre à Ourse
Collection CommentÇaMarche.net