2011-05-29 15 views
6

Jak kodować funkcję javascript w PHP? Chcę zakodować funkcję zwrotną z tablicyPHP json_encode koduje funkcję

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

równoważne ini javascript

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

wiem, że mój kod php jest źle, jak można naprawić go? Dzięki za zaawansowany.

+0

JSON pozwala jedynie na zyski kapitałowe. Nie można znaleźć z nim obiektu funkcji. Możesz podać tylko funkcję jako ciąg, a następnie obsłużyć rozdzielczość w JavaScript (używając mapy lub czegoś podobnego). – mario

+0

Co to jest "someCallback"? Stała? Ponieważ tylko stałe mogą być takimi referencjami. – Gumbo

+1

Zgaduję, że 'someCallback' jest funkcją zwrotną. – mc10

Odpowiedz

7

Viola I rozwiązać mój problem z Zend_Json kodować

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

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

wspaniale zobaczyć niektóre rzeczywiste wykorzystanie ZF ;-). I Went brzydki i elegancka, przez dodanie php tablicy 'danych' => '@ aCallBack() @' i po json_encode przed wyjściem, czy str_replace ('' @ '' ') i (' @ '' '') , PHP4ever. – Teson

0

Nie pamiętasz przecinka między "tytułem" a "fnCallback".

+0

oops przepraszam, to nie jest problem celem. someCallback jest nielegalne w PHP, ale nie w js. – brian

+0

Wiem, ale nie zapytałeś, dlaczego kod PHP nie działa. Niby json_encode –

+0

tak mogę odwoływać się do funkcji, ale jestem źle widzę @mario – brian

5

JSON służy do przekazywania wartości w pobliżu, nie nadaje się do przekazywania fragmentów kodu.

Zamiast tego można przekazać nazwę funkcji lub inną znaczącą wartość i pobrać odpowiednią funkcję, aby wywołać ją po stronie JavaScript.

+0

alternatywnie rozwiązać ten wracając ciąg, to celem jest, aby kod nie jest „czysty” $ returnValue = „{«tytuł»,«Tytuł» "fnCallback": someCallback} "; – brian

0

Nie należy mylić JSON-a z faktyczną, natywną składnią notacji obiektów JavaScript (bez względu na jej nazwę). Obiekty JavaScript mogą zawierać odwołania do funkcji; JSON nie może.

1

Aby zawiadomienie odejść w PHP, wystarczy napisać swoją funkcję zwrotną w cudzysłowie:

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

I wtedy, gdy pojawi się JSON w JavaScript, możesz przemapować nazwę funkcji oddzwaniania do rzeczywistej funkcji JS z np .:

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

teraz wiem, że podstawowy, bardzo dziękuję Mario – brian

1

Nie jest to możliwe bez przemyślenia konwencji i samodzielnego jej wdrożenia.

Powiedz, masz ten JSON

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

Następnie można zrobić, po stronie klienta

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

i nazwać, że w kontekście obiektu, który dostarcza swoje funkcje zwrotne

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

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

wireupCallbacks.call(someObject, jsonObject); 

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

Czego brakuje:

  • obecnie ta funkcja wyszukuje tylko właściwości o nazwie "*Callback".
  • nie jest awaryjna do funkcji globalnych (te byłyby właściwości obiektu window)
  • nie ma rekurencji (zagnieżdżone obiekty nie są odwiedzane)
  • nie ma tablicy JSON obsługi

Dodaj te funkcje na własną rękę, żadna z nich nie powinna być trudna do wdrożenia.

+0

piękny Tak, dzięki – brian

0

Oto kod używam w tym celu:

//~ [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>"; 

Rezultat:

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

szt.