HTML 전처리 함수에서 페이지 전처리 함수로 변수를 전달 하시겠습니까?


10

사용자 정의 테마 hook_preprocess_page()hook_preprocess_html()기능에서 종종 동일한 정보를 식별해야합니다. 본질적으로 동일한 if 문이 동일한 정보를 식별하는 두 가지 체크인을 모두 실행하는 대신 두 정보에서 한 번만 수행 한 다음 해당 정보를 다른 전처리 함수에 전달하는 것이 훨씬 더 합리적입니다. 어떻게해야합니까? 다음을 시도했지만 작동하지 않았습니다.

function myTheme_preprocess_page(&$vars){
    $vars['myValue'] = 7;
}

function myTheme_preprocess_html(&$vars){
    //$vars['myValue'] should equal 7...
}

또한 다른 방법으로 시도해 보았습니다 (전처리 html 함수에서 값을 설정 한 다음 페이지 전처리 함수에서 검색). 다음 중 관련 질문이 제기됩니다. 이러한 사전 처리 기능은 어떤 순서로 처리됩니까? 페이지 전처리 기능이 html보다 먼저 오는 것 같습니다. 맞습니까?

답변:


14

이것을 달성하려면 a global또는 static변수 가 필요합니다 ... 개인적으로 staticDrupal의 정적 패턴을 사용하여 일반적인 도우미 함수를 사용하여 구현하는 것이 좋습니다 .

function _myTheme_var($var_name, $new_val = NULL) {
  $vars = &drupal_static(__FUNCTION__, array());

  // If a new value has been passed
  if ($new_val) {
    $vars[$var_name] = $new_val;
  }

  return isset($vars[$var_name]) ? $vars[$var_name] : NULL;
}

function myTheme_preprocess_page(&$vars){
  $vars['some_var'] = _myTheme_var('my_var', 7); // Set the value and retrieve it
}

function myTheme_preprocess_html(&$vars){
  $vars['some_var'] = _myTheme_var('my_var'); // Get the value
}

$vars각 전처리 함수 의 배열은 메모리에서 완전히 다른 객체이므로 해당 배열을 사용하여 물건을 전달할 수 없습니다. Drupal 코어에서 이러한 패턴이 많이 사용되는 것을 보았으므로 가장 좋은 방법이라고 생각합니다.

편집하다

아, 그리고 예, hook_preprocess_page()전에이라고 hook_preprocess_html()나는 알고 있어요 멀리로 드루팔 그래서 "내부 아웃 '방식의 일종으로 작동합니다 ... hook_preprocess_html()아마 페이지 빌드에서 실행있어 마지막이 될 것입니다.


3

나는 다음을 수행하여 비슷한 '노드'와 '페이지'로 이것을 달성했습니다.

function mymodule_preprocess_node(&$vars) {
  _mymodule_preprocess_vars($vars,'node');
}

function mymodule_preprocess_page(&$vars) {
  _mymodule_preprocess_vars($vars,'page');
}

function _mymodule_preprocess_vars(&$vars, $where) {

  // all vars common to both node and page set here

  switch($where) {

    case 'node':

      // node only vars set here;

      break;

    case 'page':

      // page only vars set here;

      break;
  }
}

대신 'page'및 'html'과 비슷하게 작동한다고 생각합니다.


그렇습니다. 그러나 어떤 종류의 처리가 필요한 $ var는 해당 처리를 여러 번 수행해야하므로 매우 효율적이지 않습니다.
maxedison

사실, 복잡한 sql 결과에 변수를 설정하는 것과 같이 전처리 함수간에 공통적으로 무거운 것이 있다면 여러 번 수행하고 싶지는 않지만 static 첫 번째 대답과 같은 일부 처리로 쉽게 해결할 수 있습니다 . 기본 설정에서 처음 호출 할 때마다 각 변수 세트마다 함수 호출 오버 헤드가 없으므로 경량 설정이 실제로 더 빠를 수 있습니다. 그리고 분명히 주요 부분 (노드 및 페이지)은 한 번만 설정됩니다.
Jimajamma
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.