it-swarm-ko.tech

컨텐츠 유형별 전처리 기능

다른 방법으로 전처리해야하는 몇 가지 콘텐츠 유형이 있습니다. 내 테마 footemplate.php은 현재 다음과 같습니다.

function foo_preprocess_node(&$variables) {
    if ('news' ==$variables['type']) _preprocess_news($variables);
    if ('event'==$variables['type']) _preprocess_event($variables);
    if ('alert'==$variables['type']) _preprocess_alert($variables);
    ...
}

function _preprocess_news(&$variables) {
    ...
}

function _preprocess_event(&$variables) {
    ...
}

function _preprocess_alert(&$variables) {
    ...
}

콘텐츠 유형의 컴퓨터 이름에 연결되는 Drupal 특정 전처리 기능을 지정할 수 있기를 원합니다. foo_preprocess_news를 사용해 보았지만 호출되지는 않았습니다.

더 좋은 방법이 있습니까?

24
cherouvim

전처리 함수의 이름은 테마 이름을 기반으로하므로 theme_table()의 전처리 함수는 MYTHEME_preprocess_table()입니다.

theme_node_node_type 기능이 없으므로 foo_preprocess_news 또는 foo_preprocess_node_news와 같은 전처리 후크가 기본적으로 작동하지 않습니다.

could 테마 레지스트리를 재정 의하여 노드에 대해 다르게 동작하지만 실제로 권장하지는 않습니다. 매우 지저분해질 수 있습니다.

나는 리팩토링 코드의 열렬한 팬이지만 귀하의 경우에는 그것이 필요하다고 생각하지 않습니다. 노드 유형에 따라 사전 프로세스 후크에서 실행 해야하는 복잡한 논리가있는 경우 현재 수행중인 방식으로 다른 기능으로 팜을 작성하는 것이 나에게 좋은 습관처럼 보입니다.

물론 다른 방법은 서로 다른 컨텐츠 유형 각각에 대해 사용자 정의 모듈을 구현하고 각각에 hook_preprocess_node()을 구현하는 것입니다. 이렇게하면 각 모듈의 전처리 기능이 다른 컨텐츠 유형을 담당 할 수 있습니다.

그러나 이것은 상황에 따라 과도 할 수 있습니다. 각 콘텐츠 유형에 대해 수행 할 추가 논리 (예 : 테마가 아닌 전처리 논리)가없는 경우이 방법은 추가 값을 추가하지 않습니다.

10
Clive

Zen 서브 테마는 이것을 theme_preprocess_node 함수에 추가하여이를 수행합니다.

function foo_preprocess_node(&$variables, $hook) {
  ...
    // Optionally, run node-type-specific preprocess functions, like
  // foo_preprocess_node_page() or foo_preprocess_node_story().
  $function = __FUNCTION__ . '_' . $variables['node']->type;
  if (function_exists($function)) {
    $function($variables, $hook);
  } 
  ...
}

'news'라는 컨텐츠 유형이있는 경우 template.php 파일에 foo_preprocess_node_news라는 함수를 작성할 수 있습니다.

31
Evil E

나는 단지 비슷한 issue 을 가지고 있었기 때문에 Google 이이 페이지로 나를 데려갔습니다. 함수를 여러 파일로.

이미 모든 alter 함수를 포함하는 template.php 파일에서 비슷한 접근 방식을 수행했으며 동일한 방법이 여기에서 완벽하게 작동하기 때문에 내 접근 방식을 공유한다고 생각했습니다.

파일 설정 폴더 MYTHEME/preprocess 내부 :

- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)

이미 만들 수있는 node.preprocess.inc가 있어야합니다. 당신이 그것들을 어떻게 부르는지는 다소 임의적이지만, 그것들을 잘 식별하고 전체 drupal 네이밍 시스템)에 맞는 이름을 부여하는 것이 좋습니다.
이러한 파일의 내용으로!

node.preprocess.inc, 여기서 나는 다음과 같은 일을하고 있습니다 :

<?php

function MYTHEME_preprocess_node(&$variables) {

    switch($variables['type']) {

      case 'blog_post':
        // if the type of the node is a Blog Post, include this:
        include 'node--blog-post.preprocess.inc';
        break;

      case 'device_variation':
        // if Device Variation, include this:
        include 'node--device-variation.preprocess.inc';
        break;

      case 'foo':
        // ...
        break;
    }

    // additional stuff for all nodes

}

기본적으로 현재 노드의 유형을 전환합니다. 당신이 전환하는 것은 당신에게 달려 있습니다. 정확한 요구에 따라 #id, #view_mode.
일치하는 것이 있으면 지정된 파일을로드하고 마치이 함수 안에 작성된 것처럼 내용에 따라 작동합니다.

이러한 included 파일의 내용은 전처리 함수를 다시 호출하지 않는 것을 제외하고는 node.preprocess.inc 파일에 넣은 것과 똑같이 보입니다.

node--device-variation.preprocess.inc

<?php

    // Device Name
    $device = drupal_clean_css_identifier(strtolower($variables['title']));

    // Determine whether only Device Version is of type 'N/A' and set ppvHasVariations accordingly
    $deviceHasVariations = true;
    if( $variables['content']['product:field_model_variation'][0]['#options']['entity']->weight == 0 ) {
        $deviceHasVariations = false;
    }
    //...

기본적으로 원하는만큼 많은 파일을 사용하거나 여러 스위치를 캐스케이드 할 수 있습니다. 예를 들어 #view_mode에 따라 특정 노드 사전 프로세스 파일을 추가로 분할하여 full보기 모드에 대해 하나의 파일이 있습니다. teaser의 다른 하나

누군가 가이 질문을 다시 우연히 발견하면 이것이 도움이되기를 바랍니다 (:

2
Bird-Kid

메인 hook_preprocess_node에서 끝에 다음 코드를 구현하십시오.

$preprocess_function = 'themename_node__' . $node->type . '__preprocess';
if (function_exists($preprocess_function)) {
 $preprocess_function($variables);
}

이제 노드 유형별로 전처리를했을 것입니다

1
Ziftman

call_user_func()은 참조로 매개 변수를 전달하지 않습니다. 따라서 $variables의 경우 preprocess_foo() 함수는 원래 배열의 복사본에서만 작동합니다. 나머지 렌더 프로세스 중에 오브젝트가 아닌 오브젝트에 대한 변경 사항은 적용되지 않습니다.

1
kishkash