it-swarm-es.com

drupal_to_js () y funciones anónimas

Estoy usando módulo flot para crear algunos gráficos en Drupal. Generalmente, está funcionando bastante bien. Sin embargo, me he encontrado con un problema que es más general.

Estoy definiendo una matriz de configuración, que funciona para la mayoría de las cosas, pero algunas configuraciones de flot permiten funciones anónimas:

  xaxis: {
    transform: function (v) { return Math.log(v); },
    inverseTransform: function (v) { return Math.exp(v); }
  }

¿Cómo podría codificar esto en PHP para que se genere correctamente? El módulo flot usa drupal_to_js() , y no puedo ponerlo fuera de las comillas como PHP intentará interpretarlo. Si lo pongo entre comillas, será tratado como una cadena.

Según mi búsqueda en Google, parece que json_encode() tampoco es compatible con esto.

Un poco más de explicación: drupal_to_js() toma una estructura PHP y la transpone a JavaScript.

  $top = array(
    'a_string' => 'A string will convert fine',
    'a_number' => 123 // as will a number,
    'an_array' => array('a' => 'nested arrays work fine too'),
  );

Esto se transpondrá a algo como

 [ a_string: 'A string will convert fine', a_number: 123 ...

Quiero transponer una función; el siguiente código me dará la cadena 'function (v) { return Math.log(v); }'.

  $top = array(
    'a_string' => 'function (v) { return Math.log(v); }',
  );

El siguiente código me dará un PHP error de análisis (como debería ser).

  $top = array(
    'a_string' => function (v) { return Math.log(v); },
  );

Quiero que el texto de la cadena se use como un literal de JavaScript, pero no creo que se pueda hacer.

¿Alguien ha encontrado una buena forma de evitar esto? Podría generar algo de JavaScript sin procesar, pero luego perderé mucha funcionalidad.

4
Jeremy French

Esta guía se puede utilizar como una solución http://echodittolabs.org/blog/2011/04/setting-js-callbacks-drupal-json-and-some-jquery-sauce-jcarousel-controls =

Estamos buscando una solución generalizada para esto aquí http://drupal.org/node/1148204

2
mikeytown2

Si entiendo el problema correctamente, aquí tiene dos opciones.

La primera es usar drupal_add_js con la opción en línea establecida en true. drupal_to_js() se ocupa específicamente de transformar PHP variables en su equivalente de JavaScript; en este caso, no se trata de variables, sino de funciones, por lo que no es un ajuste adecuado .

La segunda opción (que probablemente prefiero) es no usar funciones anónimas en absoluto. En su lugar, cree su propio archivo JS que se parece a esto:

// Give yourself a namespace to play Nice with other JS.
if ( !ProjectName.flot ) { ProjectName.flot = {}; }

ProjectName.flot.transform = function (v) {
  // …
}

ProjectName.flot.inverseTransform = function (v) {
  // …
}

A partir de ahí, su código para llamar a estas funciones se parecería más a:

xaxis: {
  transform: ProjectName.flot.transform(v),
  inverseTransform: ProjectName.flot.transform(v)
}

Que aún se agregaría a través de drupal_add_js(). Prefiero este método porque mantener su JS es mucho más fácil/más lógico si está en su propio archivo. Sin embargo, cualquiera de los métodos debería funcionar.

1
beeradb