News box avec une image, un texte et un timing simples

Eléphant du PHP | 82 Messages

17 mai 2010, 09:15

Et je dois changer quelque chose dans ce code ou pas ? Parce que comme ça, rien ne s'affiche... =(

ViPHP
AB
ViPHP | 5818 Messages

17 mai 2010, 09:54

Bah faudrait que ce code se trouve au moins quelque part dans le code source de ta page. Et quand on le fait afficher (si c'est toujours le lien que tu as donné plus haut), on en trouve aucune trace...

Eléphant du PHP | 82 Messages

17 mai 2010, 10:16

Effectivement... je reviens, je vais voir ça, c'est surement encore un problème de ce bouffon de Drupal... mais quelle poisse...

Edit : j'ai essayé de mettre le code dans un fichier, puis d'écrire dans Drupal la fonction include et il me l'écrit, il me l'interprète pas, j'attends une réponse de la grande réactivité et compétence des forums Drupal afin de savoir comment inclure du PHP dans Drupal... pour aller plus vite je vais chercher qui sait arf

Edit 2 :

C'est bon, tout fonctionne !

Pour certains, au cas où : il fallait activer un module dans le core facultatif de Drupal (filter php), puis revenir dans le bloc (où j'insère mon html et php) et sélectionner le format d'entrée PHP (au lieu de full html etc)

Donc là ça marche, je vais essayer de configurer tout ça car ça m'a l'air un peu tordu mais je pense que ça devrait aller =)

Je valide ce sujet une fois que j'ai réussi réellement à tout mettre en place.

En tout cas, super communauté, merci à vous, et spécialement AB et stealth35 ça fait plaisir de voir ça =)
Modifié en dernier par LightBen le 17 mai 2010, 11:10, modifié 1 fois.

Eléphant du PHP | 82 Messages

17 mai 2010, 11:11

Alors petit problème :

Lorsqu'il y a un caractère spécial ("é" par exemple) il me met null. Si je mets "é" il m'écrit "é"...

Savez-vous comment passer outre ce problème ?

Merci =)

ViPHP
AB
ViPHP | 5818 Messages

17 mai 2010, 18:58

Dans le code original ça fonctionne mais il y a deux conditions pour utiliser json_encode qui transfert le tableau php en javascript.

1/ Tu dois utiliser php 5.2 ou versions ultérieures
2/ La page doit être encodée au format UTF-8

Si ça fonctionne en partie c'est que tu as certainement php 5.2 ou plus mais que ta page n'est peut-être pas encodée avec le charset utf-8.

A/ As-tu bien l'entête
header('Content-type: text/html; charset=UTF-8');
au début de ton code php ?

B/ Comment fabriques-tu le tableau php ? En l'écrivant directement dans le code de ta page ou est-il issu d'une bdd ?

Note : tu as deux fois la déclaration
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
dans le code html de ta page. Tu peux supprimer la deuxième.

Eléphant du PHP | 82 Messages

18 mai 2010, 10:01

Ah, faut que je vois d'où ça vient, Drupal fonctionne en combinant pas mal de fichiers...

J'ai oublié de préciser que le null remplaçait le contenu entier, pas seulement le caractère spécial.

Et pour la version de PHP... PHP Version 5.2.13

Quant au tableau, j'ai fait comme vous m'avez montré, j'écris directement le texte dans le fichier php :

Code : Tout sélectionner

$tab_temoignages[0]['image'] = 'sites/all/images/stars_75_125_blue.png'; $tab_temoignages[0]['text'] = 'Témoignage 1'; $tab_temoignages[1]['image'] = 'sites/all/images/stars_75_125_red.png'; $tab_temoignages[1]['text'] = 'T&eacute;moignage 2'; $tab_temoignages[2]['image'] = 'sites/all/images/stars_75_125_green.png'; $tab_temoignages[2]['text'] = 'Temoignage 3'; shuffle($tab_temoignages);
Mais l'insérer à partir d'une BDD serait franchement super, si vous savez comment faire...

Donc vu que je suis en PHP 5.2 et que c'est en UTF-8... savez-vous d'où peut venir ce problème ? Ne faudrait-il pas utiliser un htmlentities ou équivalent quelque part ? (mais où :P)

J'ai navigué dans les thèmes Drupal etc, apparemment ce doublon de utf8 est normal =)

Merci =)

ViPHP
AB
ViPHP | 5818 Messages

18 mai 2010, 12:09

Puisque tu écris directement dans le fichier il faut que le fichier soit enregistré en choisissant l'encodage UTF-8.
Voir "Configurer votre outil de travail" dans ce tuto

Bien entendu tu pourras alimenter ton tableau de news depuis une base de données. Cependant il faudra également prendre les précautions indiquée dans le tuto mentionné ci-dessus concernant l'encodage de ta table ainsi que la requête pour indiquer à mysql de travailler en utf-8 si tu ne veux pas avoir de problème avec les caractères spéciaux ou accentués.

Eléphant du PHP | 82 Messages

18 mai 2010, 15:48

J'ai tout essayé, même de tout convertir en UTF-8 (avec ou sans BOM) rien n'y fait...

Je vais poursuivre mes recherches mais Drupal... quel cauchemar.

Edit : et puis d'un côté, c'est soit affichage normal, soit "null", ya pas de caractères bizarres... ce serait pas autre chose ?

Edit 2 : j'ai peut-être une piste !

j'ai utilisé htmlentities ici :

Code : Tout sélectionner

$tab_temoignages[2]['text'] = htmlentities('Témoignage 3, T&eacute;moignage 3');
Et ça affiche : T&eacute;moignage 3, T&eacute;moignage 3

il m'affiche les caractères spéciaux dans leur entité html et les entités html... en entités html ^^
J'ai essayé avec html_entities_decode mais là ça me remet null...

une idée ? je continue pendant ce temps...

ViPHP
AB
ViPHP | 5818 Messages

19 mai 2010, 01:14

En utf-8 il faut enregistrer les fichiers SANS BOM

Dans le code php le tableau doit être construit SANS htmlentities ni htmlspecialchars.

Uniquement à l'affichage du code php dans le body (si tu as gardé ces lignes) tu peux faire

Code : Tout sélectionner

<td> <img id = "news_photo" src= "<?php if (isset($tab_temoignages[0]['image'])) echo htmlspecialchars($tab_temoignages[0]['image']); else echo 'sites/all/images/empty_tem.jpg' ?>" /> </td> <td id = "news_texte"> <?php if (isset($tab_temoignages[0]['text'])) echo htmlspecialchars($tab_temoignages[0]['text']); ?> </td>
Effectivement si cela fonctionne dans une page séparée et pas avec Drupal, le pb vient donc de l'affichage avec Drupal...
et là dessus je ne saurai pas t'aider car je ne connais pas :|

Eléphant du PHP | 82 Messages

21 mai 2010, 09:39

De toute façon je me suis bien fait avoir... le client veut un système simple, où il n'a pas à modifier de fichiers... ce qu'il veut, c'est une page du genre "ajouter_news", avec un formulaire où il écrit sa news, il valide et hop, c'est publié sur la page d'accueil... et les news sur la page d'accueil défilent au bout de X secondes, comme maintenant... je suis désespéré, mais apparemment là il faudrait faire un système de news classique, puis ajouter une fonction timer non ? Si quelqu'un a un bon tuto, je suis preneur...

En récapitulatif :

- Page de news avec toutes les dernières news (la dernière en haut, et controle du nombre de news affichées, du genre les 10 dernières)
- Page d'accueil où les news défilent : news 1 >> news 2 >> news 3 >> ... >> news 1 etc. comme actuellement
- page d'insertion des news par formulaire.

Je dois faire ça deux fois : une fois pour afficher des news (texte simple), une autre fois pour les témoignages, image + texte...

Edit : j'ai trouvé un bon moyen pour faire (presque) ce que je veux : http://www.lephpfacile.com/howto/2-comm ... ews-en-php

Donc j'ai ma page ajouter_news pour insérer les news dans la BDD, la page news qui affiche toutes les news, et dans ma page accueil idem... il faudrait n'afficher que la dernière news sur cette page, comment régler ça ? Ce serait une solution temporaire à ce que je voudrais véritablement : que sur cette même page d'accueil, les news s'alternent au bout d'un timing.

ViPHP
AB
ViPHP | 5818 Messages

21 mai 2010, 16:19

Donc j'ai ma page ajouter_news pour insérer les news dans la BDD, la page news qui affiche toutes les news, et dans ma page accueil idem... il faudrait n'afficher que la dernière news sur cette page, comment régler ça ? Ce serait une solution temporaire à ce que je voudrais véritablement : que sur cette même page d'accueil, les news s'alternent au bout d'un timing.
Bon alors tu as tes news d'enregistrer en bdd et ce que tu cherche c'est comment créer le tableau php pour alimenter l'affichage javascript.
C'est bien ça ta question ?

Eléphant du PHP | 82 Messages

21 mai 2010, 17:33

Euh... j'ai mes news en BDD, elles s'affichent sur ma page news.php toutes à la suite, mais aussi sur ma page d'accueil, je voudrais que sur la page d'accueil ce soit différent : je voudrais qu'il y ai l'affichage de la dernière news, puis au bout de quelques secondes que la précédente news apparaisse, puis la précédente, etc, en boucle...

ViPHP
AB
ViPHP | 5818 Messages

22 mai 2010, 05:36

Et bien dans ta requête qui s'affiche dans la page new tu dois faire une requête avec un ORDER BY 'date_new' ASC (ordre ascendant sur le champ date)

Et dans l'autre page tu fais une requête avec ORDER BY 'date_new' DESC et voilà.

Par contre par rapport au code php que je t'ai donné en exemple il faudra supprimer la ligne shuffle qui mélange les éléments du tableau.

Eléphant du PHP | 82 Messages

23 mai 2010, 13:28

Euh, attends, ya un truc que j'ai pas compris, déjà : il faudrait 2 fichiers news ? un news-accueil qui serait inclus dans la page d'accueil et un autre news.php qui serait inclus sur la page de news, avec chacun des requêtes différentes ?

Et après je me sers du code que tu m'as donné en enlevant shuffle pour effectuer la transition ?

Eléphant du PHP | 82 Messages

24 mai 2010, 09:25

J'ai réussi à limiter l'affichage à 1 pour la page d'accueil et à illimité pour la page de news, mais j'utilise deux fichiers différents (presque identiques à deux mots près :p)

Pouvons-nous faire plus simple pour le défilement ? Est-il possible de faire une boucle en PHP qui afficherait les données de la BDD une par une au bout d'un timing précis au lieu d'utiliser du javascript ?

Je vais faire un petit récapitulatif de mon code :

Mon fichier news-front.php qui affiche la dernière news sur la page d'accueil (il est inclus sur cette même page d'accueil) :

Code : Tout sélectionner

<?php // on se connecte à notre base $base = mysql_connect ('***', '***', '***'); mysql_select_db('***', $base); // lancement de la requête. on sélectionne les news que l'on va ordonner suivant l'ordre "inverse" des dates (de la plus récente à la plus vieille : DESC) tout en ne sélectionnant que le nombre voulu de news à afficher (LIMIT) $sql = 'SELECT auteur, titre, date, texte_news FROM news ORDER BY date DESC LIMIT 1;'; // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die) $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); // on compte le nombre de news stockées dans la base de données $nb_news = mysql_num_rows($req); if ($nb_news == 0) { echo 'Aucune news enregistr&eacute;e.'; } else { // si on a au moins une news, on l'affiche while ($data = mysql_fetch_array($req)) { // on décompose la date sscanf($data['date'], "%4s-%2s-%2s %2s:%2s:%2s", $an, $mois, $jour, $heure, $min, $sec); // on affiche les résultats echo '<br />News de : ' , htmlentities(trim($data['auteur'])) , '<br />'; echo 'Titre : ' , htmlentities(trim($data['titre'])) , '<br />'; echo 'Post&eacute;e le : ' , $jour , '/' , $mois , '/' , $an , ' &agrave; ' , $heure , ':' , $min , ':' , $sec , '<br /><br />'; echo 'News : ' , nl2br(htmlentities(trim($data['texte_news']))) , '<br /><br /><br />'; } } // on libère l'espace mémoire alloué à cette requête mysql_free_result ($req); // on ferme la connexion à la base de données mysql_close (); ?>
Est-ce qu'avec un while ou un for et un timing c'est possible d'afficher la dernière news, puis au bout de X secondes la seconde, etc...

Merci à vous =)
Modifié en dernier par LightBen le 24 mai 2010, 13:38, modifié 1 fois.