7
votes

Php json_encode coder une fonction

Comment encoder une fonction JavaScript dans PHP? Je veux coder la fonction de rappel avec le tableau xxx

équivalent INI JavaScript: xxx

Je sais que mon code PHP est faux, comment puis-je Fixez-le?


5 commentaires

JSON ne permet que des valeurs. Vous ne pouvez pas faire référence à un objet de fonction avec elle. Vous pouvez uniquement fournir le nom de la fonction en tant que chaîne, puis gérer la résolution dans JavaScript (à l'aide d'une carte ou de quelque chose).


Qu'est-ce que Somecallback est censé être? Une constante? Parce que seules les constantes peuvent être des références comme ça.


Je suppose que Somecallback est une fonction de rappel.


@Gumbo Somecallback est une fonction JavaScript.


@Mario hmmm il y a un sens. Thx Mario


8 Réponses :


-1
votes

Vous avez oublié la virgule entre "titre" et "fncallback"


2 commentaires

Oups, je suis désolé, mais ce n'est pas le problème. Somecallback est illégal dans PHP mais pas dans JS.


ouais je suppose que json_encode peut faire référence à la fonction mais je me trompe voir @mario



5
votes

JSON est pour passer des valeurs qui ne conviennent pas pour passer des morceaux de code.

Vous pouvez plutôt passer un nom de fonction ou une autre valeur significative et récupérer la fonction correcte à l'appeler sur le côté JavaScript.


1 commentaires

Sinon, je résoudrai que en retournant une chaîne, mais cela ne fait pas que le code n'est pas "propre" $ retourvalue = "{" Titre ":" Titre "," Fncallback ": Somecallback}";



0
votes

Ne confondez pas JSON pour la syntaxe de notation d'objet JavaScript réelle, native, JavaScript (quel que soit le nom). Les objets JavaScript peuvent contenir des références de fonction; JSON ne peut pas.


0 commentaires

1
votes

Pour que l'avis disparaisse en PHP, écrivez simplement votre fonction de rappel dans des guillemets: xxx

puis lorsque vous recevez le JSON en JavaScript, vous pouvez remapper le nom de la fonction de rappel à la Fonction JS réelle avec par exemple: xxx


0 commentaires

0
votes

Ce n'est pas possible sans penser à une convention et à la mettre en œuvre vous-même.

dire, vous avez ce json xxx

alors vous pouviez faire, du côté du client xxx

et appelez celui-ci dans le contexte d'un objet qui fournit vos fonctions de rappel xxx

Quelles manquent:

  • Actuellement, la fonction recherche uniquement les propriétés nommées "* rappel" .
  • Il n'y a pas de retombe aux fonctions globales (celles-ci seraient propriétés de la fenêtre objet )
  • Il n'y a pas de récursion (les objets imbriqués ne sont pas visités)
  • Il n'y a pas de manipulation de tableau JSON

    Ajoutez ces fonctions par vous-même, aucune de ces informations ne doit être difficile à mettre en œuvre.


0 commentaires

8
votes

Viola j'ai résolu mon problème avec Zend_Json Encoder

 $options = array(
     'title' => 'Title',
     'fnCallback' => new Zend_Json_Expr('someCallback')
 );      

 Zend_Json::encode(
     $options,
     false,
     array('enableJsonExprFinder' => true));


1 commentaires

Super de voir une utilisation réelle de ZF ;-). Je suis allé laid et élégant en ajoutant dans le tableau PHP 'Data' => '@ acallback () @' et après JSON_ENCODE avant la sortie, STR_REPLACE ('"@" ",' ') . Php4ever.



0
votes

XXX PRE>

VOICI LE RÉULTAT: P>

    <script>
        var oTest = {
            "Numeric":1,
            "string":"hello world !",
            "myFunction":function(test) {  if (test==1) { alert('myFunction(1)'); return true; } else return false; },
            "myObject":{
                "Numeric":1,
                "string":"hello world !",
                "myFunction":function(test) {  alert('myFunction(1)'); return true; }
            }
        };
        if (oTest.myFunction(0) == false) alert('myFunction(0)');
        if (oTest.myObject.myFunction(1) == false) alert('myFunction(0)');
    </script>


0 commentaires

0
votes

J'ai aimé l'idée dans Ce commentaire , donc j'ai développé sur elle.

Ceci utilise une carte d'identité unique pour le remplacement, de sorte qu'il est peu probable d'avoir des conflits de caractère ou des remplaçants accidentels. Vous pouvez également utiliser un GUID . P>

  $config = <<<EOF
    {
      foo: "bar",
      callback: function(value){return'$'+value+(value?'K':'');}
    }
  EOF;


0 commentaires