it-swarm-korea.com

프론트 페이지 블록을 전처리하면 다른 페이지에서 오류가 발생합니다. 이유는 무엇입니까?

저는 현재 자체 설정 작업을 통해 Drupal 7)에서보기 및 전처리를 배우고 있습니다. 이미지 목록을 생성하는 형식화되지 않은보기를 만들었습니다 (콘텐츠에 연결된 -type하지만 뷰의 필드를 node : type으로 바꾸면 내가 추구하는 것이 아닌 노드 페이지에 대한 링크가 표시되어 블록에 배치합니다. 블록을 하이라이트에 배치했습니다. region과 views-view-fields--image.tpl.php 파일을 작성하여 목록을 정렬되지 않은 다양한 목록 형식으로 출력 한 다음 jCarousel 또는 featureList jQuery 플러그인에 의해 변환됩니다.

그 위에 페이지 -front.tpl.php 파일을 만들어 프론트 페이지의 스타일을 변경했으며 CSS, js 및 HTML이 올바르게 작동하고 캐 러셀과 목록이 표시되고 작동하는 것처럼 보입니다. 정의 된 블록.

그러나보기가 표시되지 않아야하는 다른 페이지로 첫 페이지를 떠나면 다음 오류가 발생합니다.

알림 : 정의되지 않은 속성 : iaintest_preprocess_views_view_fields ()의 stdClass :: $ _ field_data (/Applications/XAMPP/xamppfiles/htdocs/drupal/sites/all/themes/iaintest/template.php의 10 행).

뷰가 출력하는 목록을 사전 처리하기 위해 다음 사전 처리 코드를 작성했습니다.

function iaintest_preprocess_views_view_fields (&$variables) {
  if (!$variables['view']->result[0]->_field_data) {
    // Line 10 where the error occurs.
  }
  else {
    drupal_add_css(path_to_theme() . '/jcarousel/skins/tango/skin.css');
    drupal_add_css(path_to_theme() . '/featureList.css');
    $js = "
      jQuery.noConflict();
      jQuery(document).ready(function(){
      jQuery('#mycarousel').jcarousel();

      jQuery.featureList(
        jQuery('#tabs li a'),
        jQuery('#output li'), {
          start_item: 1
        }
      );
    });";

    drupal_add_js($js, 'inline');
    $items = array();

    foreach ($variables['view']->result as $key => $vars) {
      foreach ($variables['view']->result[0]->_field_data['nid']['entity']->field_images['und'] as $k => $v) {
        $variables['carousel'][] = array(
          'uri' => $v['uri'],
          'alt' => $v['alt'], 
          'title' => $v['title']
        );
      }
    }
  }
}

drupal_is_front_page() 또는 $variable['is_front'] === TRUE를 사용하여 전처리의이 부분을 원래보기가 나타나는 유일한 위치 인 첫 페이지로 제한했습니다.

이것이 가능합니까, 아니면 내가 오해 한 것이 있습니까?

2
ipe

시험:

<?php
if (isset($variables['view']->result[0]->_field_data)) {
// 
?>

이상한 if/else 구조 대신. 해당 코드로 수행하려는 작업이 확실하지 않으므로 실행 여부를 확인하는 더 좋은 방법이있을 수 있습니다.

1
Berdir

겪고있는 일을 요약하려면 :

  • 프론트 페이지에서만 사용되는 뷰 템플릿에 대해 전처리 기능이 호출됩니다.
  • 첫 페이지를 방문하면 메시지 오류가 발생하지 않지만 바로 방문한 페이지에 오류 메시지가 표시됩니다.
  • 오류 메시지가 첫 페이지에는 나타나지 않지만 다른 페이지에는 표시되는 이유가 궁금합니다.

무슨 일이 일어나는가 :

  • Drupal은 PHP 경고를 가로 채고, 오류/경고 메시지를 표시하도록 설정된 경우 drupal_set_message () 를 호출하여 표시합니다. 그것.
  • drupal_set_message() 세션 변수에 오류 메시지를 저장합니다.
  • 페이지가 이미 출력되었으므로 오류 메시지가 표시되지 않습니다. 다음 페이지가 렌더링 될 때 표시됩니다.

즉, 첫 페이지에 대해 호출되는 함수로 인해 오류가 발생하지만 출력되는 다음 페이지에 오류 메시지가 표시됩니다.

PHP가 오류를 발생시킬 때 어떤 일이 발생하는지 자세히 설명하기 위해, drupal_bootstrap () , 부팅을 위해 호출되는 함수) Drupal, _ drupal_bootstrap_configuration () 을 호출하여 _ drupal_error_handler () 를 =로 설정합니다. PHP 오류 처리기. _drupal_error_handler() 호출 _ drupal_error_handler_real () , 그런 다음 _ drupal_log_error () , drupal_set_message()을 호출하는 함수.

1
kiamlaluno