Bladeren bron

Added new "v8js.use_date" ini setting to convert PHP DateTime objects to Javascript Date objects
when set as V8JS object properties.

Taneli Leppa 11 jaren geleden
bovenliggende
commit
da53c90f88
5 gewijzigde bestanden met toevoegingen van 57 en 1 verwijderingen
  1. 1 0
      package.xml
  2. 2 0
      php_v8js_macros.h
  3. 23 0
      tests/datetime_pass.phpt
  4. 17 0
      v8js.cc
  5. 14 1
      v8js_convert.cc

+ 1 - 0
package.xml

@@ -92,6 +92,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
    <file name="array_pass_flags.phpt" role="test" />
    <file name="timezones.phpt" role="test" />
    <file name="long.phpt" role="test" />
+   <file name="datetime_pass.phpt" role="test" />
 </dir>
 </dir>
  </contents>

+ 2 - 0
php_v8js_macros.h

@@ -54,6 +54,7 @@ extern "C" {
 #define V8JS_INT(v)			v8::Integer::New(v, isolate)
 #define V8JS_FLOAT(v)		v8::Number::New(isolate, v)
 #define V8JS_BOOL(v)		((v)?v8::True(isolate):v8::False(isolate))
+#define V8JS_DATE(v)		v8::Date::New(isolate, v)
 #define V8JS_NULL			v8::Null(isolate)
 #define V8JS_UNDEFINED		v8::Undefined(isolate)
 #define V8JS_MN(name)		v8js_method_##name
@@ -230,6 +231,7 @@ ZEND_BEGIN_MODULE_GLOBALS(v8js)
 
   /* Ini globals */
   char *v8_flags; /* V8 command line flags */
+  bool use_date; /* Generate JS Date objects instead of PHP DateTime */
 
   // Timer thread globals
   std::stack<php_v8js_timer_ctx *> timer_stack;

+ 23 - 0
tests/datetime_pass.phpt

@@ -0,0 +1,23 @@
+--TEST--
+Test V8::executeString() : Pass JS date to PHP
+--SKIPIF--
+<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
+--FILE--
+<?php
+	
+ini_set('v8js.use_date', 1);
+$a = new V8Js();
+$a->var = new \DateTime("Wed, 19 Mar 2014 14:37:11 +0000");
+$a->executeString('print(PHP.var.toGMTString()); print("\n");');
+ini_set('v8js.use_date', 0);
+
+$a = new V8Js();
+$a->var = new \DateTime("Wed, 19 Mar 2014 14:37:11 +0000");
+$a->executeString('print(PHP.var.toString()); print("\n");');
+
+?>
+===EOF===
+--EXPECT--
+Wed, 19 Mar 2014 14:37:11 GMT
+[object DateTime]
+===EOF===

+ 17 - 0
v8js.cc

@@ -54,10 +54,27 @@ static ZEND_INI_MH(v8js_OnUpdateV8Flags) /* {{{ */
 
 	return SUCCESS;
 }
+
+static ZEND_INI_MH(v8js_OnUpdateUseDate) /* {{{ */
+{
+	bool value;
+	if (new_value_length==2 && strcasecmp("on", new_value)==0) {
+		value = (bool) 1;
+    } else if (new_value_length==3 && strcasecmp("yes", new_value)==0) {
+		value = (bool) 1;
+	} else if (new_value_length==4 && strcasecmp("true", new_value)==0) {
+		value = (bool) 1;
+	} else {
+		value = (bool) atoi(new_value);
+	}
+	V8JSG(use_date) = value;
+	return SUCCESS;
+}
 /* }}} */
 
 ZEND_INI_BEGIN() /* {{{ */
 	ZEND_INI_ENTRY("v8js.flags", NULL, ZEND_INI_ALL, v8js_OnUpdateV8Flags)
+	ZEND_INI_ENTRY("v8js.use_date", "0", ZEND_INI_ALL, v8js_OnUpdateUseDate)
 ZEND_INI_END()
 /* }}} */
 

+ 14 - 1
v8js_convert.cc

@@ -854,6 +854,7 @@ v8::Handle<v8::Value> zval_to_v8js(zval *value, v8::Isolate *isolate TSRMLS_DC)
 {
 	v8::Handle<v8::Value> jsValue;
 	long v;
+	zend_class_entry *ce;
 
 	switch (Z_TYPE_P(value))
 	{
@@ -862,7 +863,19 @@ v8::Handle<v8::Value> zval_to_v8js(zval *value, v8::Isolate *isolate TSRMLS_DC)
 			break;
 
 		case IS_OBJECT:
-			jsValue = php_v8js_hash_to_jsobj(value, isolate TSRMLS_CC);
+             if (V8JSG(use_date)) {
+				 ce = php_date_get_date_ce();
+				 if (instanceof_function(Z_OBJCE_P(value), ce TSRMLS_CC)) {
+					 zval *dtval;
+					 zend_call_method_with_0_params(&value, NULL, NULL, "getTimestamp", &dtval);
+					 if (dtval)
+						 jsValue = V8JS_DATE(((double)Z_LVAL_P(dtval) * 1000.0));
+					 else
+						 jsValue = V8JS_NULL;
+				 } else
+					 jsValue = php_v8js_hash_to_jsobj(value, isolate TSRMLS_CC);
+			 } else
+				 jsValue = php_v8js_hash_to_jsobj(value, isolate TSRMLS_CC);
 			break;
 
 		case IS_STRING: