방금 비슷한 문제 가 있었기 때문에 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
누군가 가이 질문을 다시 우연히 발견하면 이것이 도움이되기를 바랍니다 (:
foo_preprocess_node
구현 하여 "자동화"할 수도call_user_func('_preprocess_' . $vars['type'], $vars);
있지만 단순하게 유지하는 것이 가장 좋습니다.