it-swarm-korea.com

drupal_to_js () 및 익명 함수

Drupal에서 그래프를 만들기 위해 flot module 을 사용하고 있습니다. 일반적으로 꽤 잘 작동합니다. 그러나 더 일반적인 문제를 발견했습니다.

대부분의 경우 작동하는 설정 배열을 정의하고 있지만 일부 flot 설정은 익명 기능을 허용합니다.

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

어떻게 이것을 PHP로 인코딩하여 올바르게 출력되도록 할 수 있습니까? flot 모듈은 drupal_to_js() 을 사용하는데, 넣을 수 없습니다.) 따옴표 외부에 PHP 해석을 시도합니다. 따옴표 안에 넣으면 문자열로 처리됩니다.

내 googleing에서 json_encode() 또한 이것을 지원하지 않는 것처럼 보입니다.

좀 더 설명 : drupal_to_js() PHP 구조를 취해 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'),
  );

이것은 다음과 같이 전치됩니다.

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

함수를 바꾸고 싶습니다. 다음 코드는 'function (v) { return Math.log(v); }' 문자열을 제공합니다.

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

다음 코드는 나에게 PHP 구문 분석 오류를 제공합니다.).

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

문자열의 텍스트를 JavaScript 리터럴로 사용하고 싶지만 할 수 있다고 생각하지 않습니다.

누구든지 이것에 대해 좋은 방법을 찾았습니까? 일부 원시 JavaScript를 출력 할 수 있지만 많은 기능을 잃게됩니다.

4
Jeremy French

이 가이드는 http://echodittolabs.org/blog/2011/04/setting-js-callbacks-drupal-json-and-some-jquery-sauce-jcarousel-controls 해결 방법으로 사용할 수 있습니다. =

여기에 대한 일반화 된 솔루션을 찾고 있습니다 . http://drupal.org/node/1148204

2
mikeytown2

문제를 올바르게 이해했다면 여기에 두 가지 옵션이 있습니다.

첫 번째는 인라인 옵션을 true로 설정하여 drupal_add_js 를 사용하는 것입니다. drupal_to_js()은 PHP 변수를 JavaScript에 해당하는 변수로 변환하는 작업을 특별히 다룹니다.이 경우 변수를 처리하는 것이 아니라 함수를 처리하므로 적절하지 않습니다. .

두 번째 옵션은 (아마도 선호하는) 익명 함수를 전혀 사용하지 않는 것입니다. 대신 다음과 같은 자신 만의 JS 파일을 만드십시오.

// 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) {
  // …
}

여기에서 이러한 함수를 호출하는 코드는 다음과 같습니다.

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

여전히 drupal_add_js()을 통해 추가됩니다. JS를 유지하는 것이 자체 파일에 있으면 훨씬 쉽고 논리적이기 때문에이 방법을 선호합니다. 하지만 두 방법 모두 작동합니다.

1
beeradb