2011-05-29 19 views
6

¿Cómo codificar una función javascript en PHP? Quiero para codificar la función de devolución de llamada con arregloPHP json_encode codificar una función

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

equivalente ini Javascript

var options = { 
'title': 'Title', 
'fnCallback': someCallback }; 

Sé que mi código php está mal, ¿cómo puedo arreglado? Gracias por avanzar.

+0

JSON sólo permite ganancias de capital. No puedes encontrar un objeto función con él. Solo puede suministrar la función como una cadena, y luego manejar la resolución en Javascript (usando un mapa o algo así). – mario

+0

¿Qué se supone que es 'someCallback'? Una constante? Porque solo constante pueden ser referencias como esa. – Gumbo

+1

Supongo que 'someCallback' es una función de devolución de llamada. – mc10

Respuesta

7

Viola i resuelto mi problema con Zend_Json codificar

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

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

Grandes Para ver algunos uso real de ZF ;-). I Went feo y elegante mediante la adición de la php array 'datos' => '@ aCallBack() @' y después de la json_encode antes de la salida, DID str_replace ('' @ '' ') y (' @ '', '') . PHP4ever. – Teson

0

Olvidó la coma entre 'título' y 'fnCallback'.

+0

oops Lo siento, pero no es el problema. someCallback es ilegal en PHP pero no en js. – brian

+0

Lo sé, pero no preguntó por qué el código PHP no funciona. json_encode supuesta –

+0

sí me puede hacer referencia a la función pero yo soy incorrecto veo @mario – brian

5

JSON es para transmitir valores, no son adecuados para pasar fragmentos de código.

En su lugar, puede pasar un nombre de función u otro valor significativo y recuperar la función correcta para llamar desde el lado de JavaScript.

+0

resolver, alternativamente, que mediante la devolución de una cadena, este objetivo es hacer que el código $ returnValue = "{ 'título', 'Título' no "limpia" 'fnCallback': someCallback} "; – brian

0

No confundas JSON con la sintaxis de notación de objetos JavaScript nativa (independientemente del nombre). Los objetos Javascript pueden contener referencias a funciones; JSON no puede.

1

Para hacer el aviso desaparece en PHP, acaba de escribir la función de devolución de llamada entre comillas:

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

Y entonces cuando recibe el JSON en Javascript, puede volver a asignar el nombre de la función de devolución de llamada a la función real JS con por ej .:

json = $.getJSON(..); 
json.fnCallback = window[json.fnCallback]; // for global callbacks 
+0

Ahora sé lo básico, muchas gracias Mario – brian

1

Eso no es posible sin pensar en una convención y aplicarla usted mismo.

Diga, usted tiene este JSON

'{"title": "Title", "fnCallback": "someCallback" }' 

Posteriormente, se podría hacer, en el lado del cliente

function wireupCallbacks(jsonObject) { 
    if (typeof jsonObject === "object") { 
    for (var prop in jsonObject) { 
     var callbackName = jsonObject[prop]; 
     if (/Callback$/.test(prop) && typeof callbackName === "string") { 
     if (typeof this[callbackName] === "function") { 
      jsonObject[prop] = this[callbackName]; 
     } 
     } 
    } 
    } 
    return jsonObject; 
} 

y llamar a que, en el contexto de un objeto que proporciona las funciones de devolución de llamada

var someObject = { 
    someCallback: function() { alert("It works!"); } 
} 

var jsonObject = {"title": "Title", "fnCallback": "someCallback" }; 

wireupCallbacks.call(someObject, jsonObject); 

jsonObject.fnCallback(); // alerts "It works!" 

Lo que falta:

  • Actualmente, la función solo busca propiedades llamadas "*Callback".
  • no hay ninguna reserva para las funciones globales (estos serían propiedades del objeto window)
  • no hay recursividad (objetos anidados no son visitados)
  • que no hay manipulación

Agregar matriz JSON estas características por su cuenta, ninguna de estas debería ser difícil de implementar.

+0

hermosa sí, gracias – brian

0

Aquí está el código que utilizo para hacer esto:

//~ [FUNCTION] 
function __json_encode($mVar,$fnCallback="stripcslashes") { 
    return preg_replace_callback('#"[ ]{0,}function[ ]{0,}\([^)$]{0,}\)[ ]{0,}\{[ ]{0,}(?(?![ ]{0,}}[ ]{0,}").){0,}[ ]{0,}\}[ ]{0,}"([(?,")|(?\}{0,}$)]{0,})#si', 
     function ($aRes) use ($fnCallback) { 
      for($aRes[0]=substr($aRes[0],1),$sOut="",$i=0,$iOpen=0,$iClose=0;$i<= strlen($aRes[0]) && $sOut.= substr($aRes[0],$i,1);$i++) 
       if (substr($aRes[0],$i,1) == "{") $iOpen++; 
       else if (substr($aRes[0],$i,1) == "}" AND $iOpen == ++$iClose) break; 
      return is_callable($fnCallback) ? $fnCallback($sOut).$aRes[1] : $sOut.$aRes[1]; 
     },json_encode($mVar) 
    ); 
} 



//~ [TEST] 
print "<script>\n"; 
print sprintf(
    "\tvar oTest = %s;", 
    __json_encode(
     array( 
      "Numeric"=>1, 
      "string"=>"hello world !", 
      "myFunction"=>"function(test) { if (test==1) { alert('myFunction(1)'); return true; } else return false; }", 
      "myObject"=>array(
       "Numeric"=>1, 
       "string"=>"hello world !", 
       "myFunction"=>"function(test) { alert('myFunction(1)'); return true; }") 
     ) 
    ) 
); 
print "\n\tif (oTest.myFunction(1) == false) alert('myFunction(0)');"; 
print "\n\tif (oTest.myObject.myFunction(0) == false) alert('myFunction(0)');"; 
print "\n</script>"; 

El resultado:

<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> 

Cant.

Cuestiones relacionadas