hook_preprocess_page () : 조회 페이지를 알려주는 방법?


10

뷰 페이지에만 일부 자바 스크립트 및 CSS 파일을 삽입 해야하는 사용자 정의 모듈을 작성 중입니다.

hook_preprocess_page를 사용하고 있지만 현재 페이지가 뷰에 있는지 알 수 없습니다.

function mymodule_preprocess_page(&vars)
{
    var_dump($vars); //output: nothings that reference the views!
    if([view page])
    {
        drupal_add_js([...]);
        drupal_add_css([...]);
        // Rebuild scripts 
        $scripts = drupal_get_js();
        $vars['scripts'] = $scripts;
        // Same for css
    }
}

템플릿 파일 (page-my_view_page_path.tpl.php)을 사용할 수 있다는 것을 알고 있지만 모듈이 활성화 된 경우에만 js 및 추가 CSS를 포함해야합니다. 그래서 나는 이것을 모듈 코드 안에 직접 유지하고 싶다 .

아이디어?


모듈에서 템플릿 파일을 사용할 수 있습니다.
Jeremy French

@Jeremy : 사람들이 투표하고 논쟁 할 수 있도록 방법을 설명하는 답변을 추가하십시오.
Strae

그것은 tpl 파일이 모듈에 포함될 수 있다고 지적하면서 대답과 직접 관련이 없었습니다. DANieL은 그것을 할 수 없음을 나타내는 것 같았습니다.
Jeremy French

물론 .. 테마 page.tpl을 포함 시킬 수 있지만, 나의 목표는이 모듈이 테마와 완전히 독립되도록하는 것입니다.
Strae

Jeremy French의 답변에서 제안한 것처럼 모듈의 사전 처리를 수행하는 Views 템플릿을 구현할 수 있습니다.
Pierre Buyle

답변:


12

views_get_page_view()페이지 뷰가 현재 사용중인 것을 찾습니다. NULL을 반환하면 현재 페이지는 뷰의 페이지가 아닙니다.

그러나 사용 drupal_add_js()drupal_add_css()A의 것은 hook_preprocess_page()변수 때문에 예상대로 작동하지 않습니다 $script$style변수는 이미으로 세트를왔다 template_preprocess_page(). Views의 템플릿 전처리 (Jeremy French의 답변 참조)는 CSS와 JavaScript를 추가하기에 더 좋은 곳일 것입니다.


두 번째 단락에 대한 답변을 업데이트했습니다. 테마 (theme_preprocess_ *)에 CSS 또는 js를 추가하는 것이 좋지만 내 요구는 모듈 의존성입니다.
Strae

우수한 views_get_page_view는 캐시에서 이미로드 된 뷰를 가져 오므로 성능에 영향을 미치지 않아야합니다. IMHO이 답변이 받아 들여 져야합니다.
marcvangend

@Strae 내 제안은 HOOK_preprocess_views_view(&$variables)대신 또는 다른 Views의 템플릿 전처리 후크 를 사용하는 것이 었습니다 HOOK_preprocess_page(&$variables). 이 방법 당신의 의견에서 얻을 수 있습니다 $variables및 사용 drupal_add_js()drupal_add_css()안전을.
Pierre Buyle

11

프리 프로세서에는보기 에 긴 스레드가 있습니다. 이 의견 은 나에게 매우 단순 해 보인다.

function mymodule_theme_registry_alter(&$theme_registry) {
  //dpm($theme_registry);
  $theme_registry['views_view__YOUR_VIEW_NAME_HERE']['preprocess functions'][] = 'mymodule_preprocess_func';
}

// now go on and play with your new preprocess function
function mymodule_preprocess_func(&$vars) {
  // etc
}

전체 페이지 대신보기 출력을 사전 처리하는 것이 더 올바른 접근법 일 것입니다.
개렛 올브라이트

8

hook_preprocess_page () 인 경우 정의에 따라 뷰에는 페이지 표시와 메뉴 경로가 있으며 고유해야합니다. 따라서 다음을 수행 할 수 있습니다.

function mymodule_preprocess_page(&vars)
{
    var_dump($vars); //output: nothings that reference the views!
    if($_GET['q'] == 'my/view/path')
    {
        drupal_add_js([...]);
        drupal_add_css([...]);
    }
}

이 페이지에 인수가 전달되면의 일부가 필요하므로 $_GET['q']Drupal의 arg()함수로 대신하십시오 .

if(arg(0) == 'my' && arg(1) == 'view' && arg(2) == 'path')

http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/arg


$ _GET [ 'q']를 검사하지 않는 것이 좋습니다. 대신 menu_get_item () 또는 menu_get_object ()를 사용하십시오. 현재 페이지를 검사하는 경우 인수가 필요하지 않으며 모두 결과를 캐시합니다.
Mikey P

변수 $ script 및 $ style 변수가 이미 template_preprocess_page ()에 의해 설정 되었기 때문에 hook_preprocess_page ()에서 drupal_add_js () 및 drupal_add_css ()를 사용하면 예상대로 작동하지 않습니다. 사용자 views_get_page_view ()는 현재 페이지의 뷰를 검색합니다 (있는 경우).
Pierre Buyle

3

나를 위해 이것은 작동합니다.

function MYMODULE_preprocess_page(&$vars) {
  $view = (array)views_get_page_view();
  if (!empty($view)) {
    // do stuff
  }
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.