web-dev-qa-db-ja.com

フロントページブロックを前処理すると、他のページでエラーが発生します:なぜですか?

私は現在、Drupal 7.でビューと前処理を学習するための自己設定タスクに取り組んでいます。画像のリストを作成するフォーマットされていないビューを作成しました(コンテンツにリンクされています) -typeですが、ビュー内のフィールドをnode:typeに置き換えると、ノードページへのリンクが表示されますが、それが目的ではありません)、それらをブロックに配置します。ブロックをハイライトに配置しましたリージョンを作成し、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を起動するために呼び出される関数 drupal_bootstrap()_ drupal_bootstrap_configuration())を呼び出します 、これは _ drupal_error_handler() を次のように設定しますPHPエラーハンドラ。_drupal_error_handler()呼び出し _ drupal_error_handler_real() 、次に _ drupal_log_error() を呼び出します。この関数はdrupal_set_message()を呼び出します。

1
kiamlaluno