Jump to content

Hyogapag

Actif
  • Content Count

    16
  • Joined

  • Last visited

Everything posted by Hyogapag

  1. Depuis quelques jours, je réfléchis à l'intégration d'un système pour masquer/afficher du contenu sur mon site selon le principe du lien "Lire la suite..." que l'on retrouve sur de nombreux sites, dont les blogs. Ces liens, bien souvent, chargent une nouvelle page contenant la totalité du message, ce qui ne me convenait pas, pas plus que les solutions utilisant AJAX et limitant le référencement auprès des moteurs de recherche. Je me suis donc d'abord penché vers une solution en DHTML ne portant aucun préjudice aux personnes ne disposant pas / ne voulant pas de Javascript, ce que j'ai réussi à obtenir grâce à l'aide d'un des membres de ce forum. Seulement, utiliser du Javascript me gênait quelque peu. J'ai donc cherché une solution en XHTML / CSS. J'y suis finalement parvenu. Nécessite : Un navigateur qui reconnaît la norme CSS3 Pour une automatisation du principe, PHP Le principe : Il s'agit de combiner le principe des ancres et de la pseudo-classe target. Celle-ci permet d'agir directement sur l'élément dont l'ID est donnée (et donc de le cacher / montrer, mais aussi de changer son style, etc.) Limitations : IE ne reconnaisssant pas la norme CSS3, j'ai utilisé des balises IF en HTML pour qu'il affiche la page entièrement développée, sans les liens pour cacher/montrer. Je n'ai pas testé avec Opéra. Par ailleurs, ce système ne fonctionnant qu'avec les ID, il faut créer une ID unique pour chaque élément à masquer/montrer. Une légère modification dans le code PHP (dans un foreach affichant des résultats de requête par exemple, devrait suffire) côté XHTML/HTML mais côté CSS, vous devrez aussi créer ces ID, ce qui implique un style.php et non .css et impose la création d'une boucle foreach similaire dans ce fichier (+ probablement aussi la récupération de variables par la méthode GET). Je pense néanmoins que le jeu en vaut la chandelle. Le code : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title>essai</title> <style type="text/css"> #montrer {display: none;} #cacher:target {display: none;} #montrer:target {display: block;} </style> <!--[if IE]> <style type="text/css"> #montrer {display: block;} </style> <![endif]--> </head> <body> <!--[if !IE]> <--><p><a href="#montrer">Montrer le texte</a></p><!--> <![endif]--> <div id="montrer"> <div id="cacher"> Texte à montrer.<!--[if !IE]> <--> <a href="#cacher">Cacher le texte</a><!--> <![endif]--> </div> </div> </body> Je tiens par ailleurs à faire remarquer qu'utilisé en combinaison avec le Javascript posté dans le forum correspondant (qui ne cache pas le contenu aux moteurs de recherche et ne gêne pas si Javascript n'est pas utilisé), il permet de toucher à la fois les visiteurs acceptant Javascript ceux ne le possédant pas/l'ayant désactivé et n'utilisant pas IE Cette solution qui me semble intéressante m'a été inspirée par CSS Play de Stu Nicholls, et pour la mettre en oeuvre je me suis servi d'un article de Blog & Blues. J'espère que ce code servira à certains.
  2. Je tiens à dire, pour ceux qui souhaitent à tout prix éviter tout Javascript dans leurs pages, qu'il existe une alternative qui utilise seulement le CSS. Cependant, IE (IE7 compris), ne la supporte pas. On peut toutefois imaginer une solution alternative pour les microsoftiens similaire à celle proposée ci-dessus pour les utilisateurs n'acceptant pas le Javascript. Voici la page qui m'a inspiré cette solution. Il suffit de faire deux liens ( montrer le texte | cacher le texte) au lieu d'un, et de jouer sur les visibility et autres display, et le tour est joué. Je pense que je vais implémenter cette solution sur mon site. Lorsque j'aurai finalisé le résultat, je le posterai dans la rubrique de ce forum consacrée au CSS. Voilà l'url en question.
  3. RRaaaahhh merci ! En fait j'avais déjà fait un code comme ça, mais je l'avais positionné au-dessus de la balise à cacher... et ça ne marchait pas (logique en fait !).
  4. Pour commencer, je suis novice en Javascript. Comme je ne suis pas un fan des effets visuels et autres artifices esthétiques, je ne me suis pour ainsi dire jamais penché sur les possibilités offertes par le DHTML. Seulement je voudrais ajouter à l'une des pages de mon site une fonctionnalité, très répandue de nos jours, qui permet de masquer/afficher du contenu par un simple clic sur un lien. Le script que j'utilise marche à merveille, d'ailleurs le voici pour ceux qui tomberaient sur ce post en cherchant un script offrant cette possibilité : <script type="text/javascript"> <!--Merci à Dustin Diaz function switchMenu(obj) { var el = document.getElementById(obj); if ( el.style.display != "none" ) { el.style.display = 'none'; } else { el.style.display = ''; } } //--> </script> Le remerciement est de moi. On appelle ensuite le code de la façon suivante : <a onclick="switchMenu('poster-message');">écrire un message</a> où poster-message indique la valeur de l'attribut id de la balise dont le contenu doit être affiché ou masqué. Cependant, il se pose encore un problème qui, tant qu'il ne sera pas résolu, m'empêchera d'utiliser ce script sur mon site : la compatibilité avec les navigateurs où Javascript est désactivé ou n'est pas supporté. Je n'ai pas trouvé comment vérifier si Javascript est désactivé, mais je pense avoir une idée élégante, et j'aurais besoin de vous pour la finaliser. Je précise au passage que les possibilités offertes par les balises <noscript> ne m'ont pas convenues. Ma solution est simple : en général, par défaut, on cache le contenu, et lors d'un événement comme onclick on le fait apparaître. Il est caché au départ par du CSS comme style="display: none". Seulement si ce display none est appelé lui-même par du Javascript, alors une personne ayant désactivé Javascript verra la page entièrement dépliée, ce qui n'est franchement pas gênant. Seulement je n'ai pas réussi à réaliser un tel script. J'ai bien tenté de faire des fonctions mais aucune n'a fonctionné. La seule solution que j'ai réussi à exploiter n'est pas reconnue par le W3C, car elle suppose que javascript ou document.write soit un attribut possible de balises comme <div> : <div id="poster-message" document.write("style="display: none"");> Pourriez-vous me proposer une alternative à cette solution qui ne vienne par troubler la validation de mon site selon la DTD XHTML 1.0 Strict? Merci d'avance.
  5. Bonjour, quelqu'un connait-il ou a-t-il écrit une fonction permettant de scinder une variable de type string en éléments de tableaux (comme explode) en faisant en sorte que chaque élément ait une longueur déterminée (comme wordwrap)? En fait, ma variable est un message de forum d'environ 3000 caractères et composé d'une multitude de pseudo-paragraphes délimités par des <br /> . Je voudrais scinder cette variable en plusieurs morceaux, disons de 600 caractères environ chacun. Seulement, je voudrais que la scission ne puisse se faire qu'à des <br /> , en considérant ce retour à la ligne comme un séparateur de la fonction explode() (c'est-à-dire que le retour à la ligne en question ne se trouve dans aucun des éléments de tableau de sortie). Voici un exemple : function foo($texte, $taille, $separateur) { jgklfghlgkh; } $message="première partie du message<br />deuxième partie du message<br />troisième partie du message"; $message=foo($message, 40, "<br />"); //Et on aurait donc : $message[0]==="première partie du message<br />deuxième partie du message"; //n'a pas coupé au premier <br /> car le nombre de caractères aurait été insuffisant $message[1]==="troisième partie du message"; J'espère que ma description est compréhensible. Merci d'avance.
  6. Bonjour, j'ai une question à propos des alias. Ma requête est du type : SELECT c.id, c.nom, a.id AS a_id, a.nom AS a_nom FROM table1 LEFT OUTER JOIN table2 ON <condition-jointure>WHERE <conditions> Je parviens à mettre comme conditions dans le WHERE (par exemple) a.nom=foo mais pas a_nom=foo , ce qui me gène. Est-ce normal? Peut-on feinter?
  7. Hyogapag

    Double-jointure?

    Hummm... en fait je pensais que dans le WHERE il fallait utiliser l'alias du champ que j'avais défini dans le select. Or o.id AS o_id... Mais maintenant ça marche. Merci beaucoup
  8. Hyogapag

    Double-jointure?

    Merci pour vos réponses. En fait, j'avais déjà essyaé le "AS" mais à chaque fois PHP me retourne "Query failed". Voici ma requête exacte (j'ai vérifié scrupuleusement le nom des champs/tables). $requete = " SELECT p.id, p.nom, p.nom_url, p.divinite_protectrice, p.classe, p.protecteur, p.surplis, p.fonction, p.age, p.taille, p.poids, p.anniversaire, p.groupe_sanguin, p.pays_origine, p.lieu_entrainement, p.techniques, p.commentaire, p.fiche_detaillee, c.id as classe_id, c.nom as classe_nom, c.nom_url as classe_nom_url, d.id as divi_id, d.nom as divi_nom, d.nom_url as divi_nom_url, o.id as o_id, o.nom as o_nom, o.nom_url as o_nom_url, e.id as e_id, e.nom as e_nom, e.nom_url as e_nom_url FROM personnages p, classes c, divinites_protectrices d, lieux o, lieux e WHERE p.classe=classe_id AND p.divinite_protectrice=divi_id AND p.pays_origine=o_id AND p.lieu_entrainement=e_id";
  9. Hyogapag

    Double-jointure?

    Bonjour, je ne vais pas rentrer dans les détails de ma base, mais on peut résumer le problème comme suit: Considérons une liste de voyageurs. Soient les champs suivants pour chaque voyageur : id nom origine destination Les valeurs des champs origine et destination sont des codes postaux. Je voudrais afficher le nom de la commune. Pour cela, je crée une base nommée communes, avec les champs code_postal nom_commune Il me faut faire deux fois la jointure pour que le nom de la ville d'origine et de destination s'affichent. Pour l'instant ma requpete ressemble à ceci SELECT * FROM voyageurs v, communes o, communes d WHERE v.origine=o.code_postal AND v.destination=d.code_postal Cette requête n'affiche que le nom de la ville de destination (la dernière demandée). Dans ma boucle while mysql_fetch_assoc, je ne peux pas préciser o.code_postal ou d.code_postal, je peux seulement dire code_postal. Je ne parviens pas à trouver la syntaxe correcte pour réaliser cette "double jointure". PS : en fait j'ai le même problème dès qu'un champ d'une table possède un homonyme dans une autre table à joindre, mais j'ai résolu ce problème en ajoutant des préfixes aux noms des champs.
  10. En fait, le problème est que si je fais : SELECT * FROM ma_table WHERE (condition quelconque) AND LIMIT BETWEEN valeur1 AND valeur2 ORDER BY nom alors effectivement il y aura un classement alphabétique, mais sur chaque page et non sur la totalité des résultats (c'est-à-dire sans le limit). Autrement dit, si je veux 3 résultats par page, sur la première page j'aurai 3.Alain 1.Paul 2.Pierre sur la seconde 4. André 6. Jacques 5. Vincent etc. Sinon je n'ai pas de table liée, donc pas de problème de ce côté là. La solution de Théo me convient assez, je n'ai plus qu'à faire quelques modifications, mais j'aurais voulu une requête sans PHP, que j'aurais pu directement rentrer dans mon SGBD. Enfin si personne n'a mieux, je me contenterai de ça (c'est déjà pas mal). EDIT : j'ai réussi à faire ce que je voulais. J'ai supprimé mon champ id, puis j'ai fait la requête : ALTER TABLE ma_table ORDER BY nom puis j'ai recréé un champ id que j'ai mis avec les mêmes options que l'autre (clé primaire et auto-increment) et voilà c'est bon.
  11. Justement, je ne veux pas qu'il se cale. Je veux que le classement continue comme si de rien n'était. Par exemple, avant le classement : 1. Pierre 2. Alain 3. Jacques Après : 1. Alain 2. Jacques 3. Pierre Et si on rajoute un 4e nom : 1. Alain 2. Jacques 3. Pierre 4. Jean C'est vrai qu'avec un exemple c'est plus parlant.
  12. Bonsoir. Je souhaiterais effectuer quelques modifications sur l'une des mes tables SQL à l'aide d'une requête, dont malheureusement je ne connais pas la syntaxe et à propos de laquelle je ne parviens pas à trouver de renseignements. La table en question possède une vingtaine de champs, mais juste 2 nous intéressent. Le champ id et le champ nom. Le champ id est ma clé d'index primaire, et est configuré pour s'incrémenter de 1 à chaque nouvelle entrée. Le numéro id correspond donc à l'odre dans lequel la table a été renseignée. Je voudrais réorganiser ma table par ordre alphabétique des noms, c'est-à-dire trier les "fiches" par ordre alphabétique du champ nom, et changer l'id pour qu'il corresponde à cet ordre. Une fois cette opération terminée, j'aimerais que si de nouvelles données sont saisies, la nouvelle fiche ait pour id l'id la plus élevée+1 (que ça fonctionne comme avant pour les fiches rentrées ensuite en fait...) J'ai bien chercher des renseignements sur Google mais en vain. En vous remerciant par avance.
  13. Hyogapag

    ORDER BY

    Bon j'ai trouvé la solution. Le problème venait d'ailleurs, de bien au-delà de ce que j'imaginais... Julien, aucun des derniers codes que tu a écrit ne fonctionne : tous retournent le même erreur que celle que j'ai déjà montré. En fait, sur ma page, il y a deux requêtes SQL : une pour compter le nombre total de résultats (la même que celle ci-dessus mais sans les limites), et celle que je vous ai montré, qui régulait l'affichage de la page proprement dite. Il me semblait donc logique de jouer sur cette dernière requête pour le classement. Visiblement je me trompais lourdement. J'ai mis le ORDER BY dans la première requête et tout fonctionne à présent. Je suis assez confus. En semaine, je n'ai pas le net (j'ai seulement mon manuel php en PDF et une copie d'un site sur les requêtes SQL), et je suis bien obligé de me débrouiller seul. A force de suer, je finis par arriver à mes fins. J'aurais pu trouver la solution tout seul (en fait je l'ai trouvé tout seul ), ou plutôt sans vous déranger. Je suis vraiment confus. C'est vraiment une erreur de débutant (enfin c'est ce que je suis d'un autre côté...). Je suis désolé. J'aimerais toutefois, comprendre pourquoi le classement d'une deuxième requête n'annule pas celui de la précédente. Si quelqu'un pouvait m'expliquer... Merci pour tout. J'espère pouvoir un jour aider d'autres débutants, mais avant d'arriver à ce stade, j'ai beaucoup de progrès à faire.
  14. Hyogapag

    ORDER BY

    Désolé Julien, mais aucune de tes méthodes ne résout mon problème. La première me renvoie l'erreur : tandis que la deuxième ne change strictement rien. Je ne sais pas si cela a une importance, mais le champ id est ma clé d'index primaire. PS : qu'est-ce qu'une injection SQL au fait? PS bis : En fait ta deuxième méthode ne marche plus non plus maintenant (je ne l'avais pas testéé sur le même serveur hier soir, faut que je regarde ça de plus près...) PS ter : j'ai tenté de faire une requête avec l'exemple que j'avais fourni à JUlien, c'est-à-dire en remplaçant les variables par des valeurs entrées "manuellement" dans la requête. Là, le ORDER BY fonctionne...
  15. Hyogapag

    ORDER BY

    Pour Gilbert : Merci, mais ce que tu proposes ne semble pas fonctionner. Si je prends la syntaxe que tu proposes, j'obtiens le message : Si je mets plutôt : $requete = "SELECT * FROM $bd_personnages.$table_cartes_identite WHERE ($champ_classement LIKE '$valeur_classement' AND id BETWEEN $limite_min AND $limite_max ) ORDER BY nom"; ça ne change rien à mon problème (classement non affecté). Pour Julien L. : Tout d'abord, un petit exemple : $requete = "SELECT * FROM personnages.cartes_identite WHERE pays_origine LIKE 'URSS' AND id BETWEEN 1 AND 12 ORDER BY nom"; Quant au LIKE, je dois dire que je me suis appuyé sur ce cours pour apprendre les rudiments des requêtes SQL. On y trouve ce paragraphe : Sachant que la variable que je souhaitais intégrer au prédicat était de type string (une chaîne donc), il m'a semblé logique d'utiliser l'opérateur LIKE. Sinon, je suis toujours en train de chercher une solution. Je cherche une solution dans le sens de ce qu'a proposé Gilbert, à savoir de jouer avec les parenthèses. Mais pour l'instant je vais me coucher. Bonne nuit à tous.
  16. Hyogapag

    ORDER BY

    Bonjour. Je me suis lancé dans la programmation il y a quelque temps et jusque là tout allait bien. J'ai fait pas mal de trucs que je trouvais assez compliqués, et je ne pensais pas que ce détail allait me poser problème : je l'avais donc gardé pour la fin, puisque c'est un peu du fignolage. Mais voilà : je peux mettre ORDER BY suivi de n'importe quel nom de champ : ça ne change rien au classement. En effet, les résultats sont toujours classés par ordre croissant d'id (id est le premier champ de ma table). Avez-vous une idée de l'origine du problème? Si ça peut vous aider, voici ma requète : $requete = "SELECT * FROM $bd_personnages.$table_cartes_identite WHERE $champ_classement LIKE '$valeur_classement' AND id BETWEEN $limite_min AND $limite_max ORDER BY nom"; Merci d'avance. PS : si vous pensez que ça peut venir du reste du code, je peux le poster, mais comme il est assez long et que je vois pas en quoi il pourrait jouer, je ne l'ai pas posté.
×
×
  • Create New...