Données JSON avec PHP

Petit nouveau ! | 4 Messages

14 oct. 2016, 10:41

Bonjour,

Je poste ma question dans la rubrique xml / json, mais elle relève sans doute plus de la rubrique débutant.

J'essaye de générer des données JSON avec PHP (via un CMS (ionize) basé sur CodeIgniter).
J'ai un problème avec les données de type HTML quand elles ont un attribut et que j'ouvre les guillemets double.
( ex : <a href="mon lien"> )

Dans la version statique (à la main, sans php), il me suffit d'échapper les guillemets double ( \" ) et ça marche !
Alors, j'ai essayé str_replace('"', '\"', $text); , mais ça génère une erreur :
Parse error: syntax error, unexpected T_STRING in /application/libraries/ftl/parser.php(327) : eval()'d code on line 119

J'ai ensuite essayé avec htmlspecialchars et htmlentities, mais ça génère la même erreur.

Je suis bloqué, c'est grave docteur ?
Merci

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8726 Messages

14 oct. 2016, 11:31

salut,

c'est pas clair tous ça ;)

tu as du texte que tu veux envoyer dans du json ?

c'est quoi ton code ? (tu as quoi comme données en entrée et en sortie ?)


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

14 oct. 2016, 14:03

Désolé pour le manque de clarté...

Je souhaite utliser StoryMap JS avec un CMS (ionize basé sur CodeIgniter), c'est à dire donner la possibilité de créer des "slides" depuis le back office du site.

Les données de StoryMap sont au format JSON :
var storymap_data ={
storymap: {
slides: [
text: {
headline: "TAG Titre de mon CMS",
text: "<?php echo str_replace('"', '\"', $monTexte); ?>"
},
]}}

Dans l'exemple ci dessus, j'alimente le headline du "slide" avec un champ du CMS et ainsi de suite... ça fonctionne.

Cela plante quand le champ contient des attributs HTML, il n'aime pas les double guillemet (<a href="monLien">).
Je m'en étais rendu compte dès le début en préparant l'intégration et ça fonctionnait en échappant les guillemets double avec un antislash (\).
Naïvement je pensais m'en sortir avec php en créant une variable alimenté par le TAG text de mon CMS et en utilisant la fonction str_replace pour ajouter automatiquement les antislash, mais non, j'ai les erreurs décrites dans mon premier post.

NB : Au préalable, j'ai eu un premier souci avec les retours chariots générés par le CMS qui faisaient planter StoryMap, et que j'ai réglé avec preg_replace("/(\r\n|\n|\r)/", " ", $text);
J'étais donc assez confiant pour la suite... quelle déception (n'ayant jamais vraiment appris PHP, entre nous c'est je t'aime moi non plus).

Ma méthode est peut être HhhOOooorible :-)
J'aimerais vraiment trouver une solution, t'as une idée ?
Merci

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8726 Messages

14 oct. 2016, 16:03

je vois tu peux aussi éviter de te faire chier, créer un objet PHP que tu va encode en JSON avec une fonction native très pratique json_encode :-)

cela devrait te faire le boulot correctement.
Pour les sauf de ligne c'est toi qui les génère en les écrivant dans ton code pas le CMS ;)

donc un objet standar php qui contient un tableau d'objet, c'est simple

la version un peu goret
<?php
$monTexte = <<<eot
<h1>le texte</h1>
<p>
je met du html_<a href="url a toi>"urrrrlll</a>
</p>
eot;
$storymap = new stdClass();
$txt = new stdClass();
$txt->headline = 'TAG Titre de mon CMS';
$txt->text = $monTexte;
$storymap->slide[]=$txt;

$data = new stdClass();
$data->storymap = $storymap;
echo json_encode($data);
qui donne :

Code : Tout sélectionner

{"storymap":{"slide":[{"headline":"TAG Titre de mon CMS","text":"<h1>le texte<\/h1>\n<p>\nje met du html_<a href=\"url a toi>\"urrrrlll<\/a>\n<\/p>"}]}}
Tu peux valider le JSON avec des outils en ligne comme : https://jsonformatter.curiousconcept.com/

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

15 oct. 2016, 11:13

Merci moogli !
C'est cool d'envisager une solution adaptée, au lieu de bricoler, j'essayerai (même si je ne comprends pas ton code goret :D , c'est quoi eot, pourquoi la chaîne ne se brise pas alors qu'il y a des guillemets non échappés dedans ?, ...)
J'ai quand même l'impression que le fichier "parser" du CMS continuera de m'embêter avec les attributs HTML, je sens l'impasse...
A l'apéro hier soir, je pensais que si je ne m'en sortais pas avec json_encode, je tenterai de contourner le parser avec javascript...

PS : je t'assure que le CMS génère lui même les sauts de ligne dans le code.
il y a un éditeur et aussi un accès au code, je supprime tous les sauts de ligne entre les TAG HTML, j'enregistre, j'ouvre pour vérifier et là tous les sauts de ligne sont revenus...

Petit nouveau ! | 4 Messages

15 oct. 2016, 15:28

moogli, encore merci, ça marche ! =D>
j'ai juste essayé sur une variable et pas sur toute la structure JSON, car elle est un peu différente, il faut que je l'adapte (j'ai un niveau supplémentaire, un objet dans un objet ? et je remarque que le nom de l'objet est entouré par des guillemets double, mais pas dans mon code).

T'as raison moogli, il en faut peu pour être heureux... mais c'est déjà beaucoup !
Merci

{
"storymap":
{
"slide":
[
{
type: "mon type",
text:
{
"headline":"mon titre",
"text":"mon htmf"
},
}
]
}
}