2

私はこれについて私の機知に富んでいるので、ここの誰かが私を正しい方向に向けることができることを願っています. field_portfolio_description というテキスト フィールドを持つ、portfolio_item というコンテンツ タイプがあります。ビューを使用せずに、そのフィールドに存在するすべての値のリストを印刷しようとしています。これは、これまでに template.php ファイルにある preprocess_page 関数です。

function blocks_preprocess_page(&$vars, $hook) {
  $node = menu_get_object();
  if ($node->type == 'portfolio_item') {
    $portfolios = field_get_items('node', $node, 'field_portfolio_description');
    $items = array();
    foreach ($portfolios as $folio) {
      $items['data'] = $folio['value'];
    }
    $vars['description'] = theme('item_list', array('items' => $items));
  }
}

最後に、次のようにページ テンプレートでそれを呼び出そうとしています。

<?php print render($description); ?>

私はいくつかの異なるバリエーションを試しましたが、役に立ちませんでした。どんな助け/提案も大歓迎です。

更新: ようやくデバッグ結果が得られました。次のエラーが表示されます: 注意: blocks_preprocess_page() で非オブジェクトのプロパティを取得しようとしています (/sites/all/themes/blocks/template.php の 24 行目)。これは 24 行目です:

if ($node->type == 'portfolio_item') {

Portfolio_item はコンテンツ タイプのマシン名であるため、これは問題ではありません。

更新 2: よし、関数を $node = menu_get_object(); まで削除しました。行を調べて var_dump を実行し (dpm が機能していませんでした)、非オブジェクト エラーが原因で、ページにアクセスしたときに、portfolio_item が出力に存在しないことを発見しました。ポートフォリオ アイテムが存在するのは、実際のポートフォリオ アイテムにアクセスしたときだけです。

そのため、私はこれについて完全に間違った方法で行っているように見えます。また、ビューでは、そのフィールドに項目の単純なリストを表示できないようです。

私はおそらくこれを後で再検討し、解決策を見つけた場合は必ず最終的なコードを投稿します. 繰り返しますが、他の誰かがアイデアを持っているなら、私はそれらを試してみましょう. 声をかけてくれた人たちに改めて感謝します。

4

2 に答える 2

0

これを試して:

$node = menu_get_object();
if ($node->type == 'portfolio_item') {
  $portfolios = field_get_items('node', $node, 'field_portfolio_description');
  $vars['description'] = array(
    '#theme' => 'item_list',
    '#items' => $portfolios
  );
}

render 関数を使用するには、render 配列を渡す必要があります。field_get_items 関数は、配列またはレンダリング可能な要素を既に返しています。次に、適切に構造化されたレンダー配列内でその戻り値を渡すだけです。render 関数はそれをマークアップに変換します。

theme('item_list', array('items' => $items));

このテーマ関数呼び出しはマークアップを返すため、render 関数を介して渡す必要はありません。コードが機能しないもう 1 つの理由は、反復ごとに $items['data'] 値をリセットしているためです。

$items['data'] = $folio['value'];

する必要があります

$items['data'][] = $folio['value'];

上記の解決策はあなたのためにそれを行うべきであり、それはマークアップをレンダリングする Drupal 7 の方法です

参照: Drupal 7 での配列のレンダリング - http://drupal.org/node/930760

于 2012-12-06T11:52:29.213 に答える
0

hook_preprocess_page()すでにノード オブジェクトを取得しています。再度ロードする必要はありません。コードは、配列の内容をループしても、値を常に に保存するため、テキスト フィールドに含まれる値の 1 つだけを使用します$items['data']

記述する必要があるコードは、次のようなものです。

function blocks_preprocess_page(&$vars, $hook) {
  $items = array();

  if (!empty($vars['node']) && $vars['node']->type == 'portfolio_item') {
    $portfolios = field_get_items('node', $vars['node'], 'field_portfolio_description');
    foreach ($portfolios as $folio) {
      $items[] = $folio['value'];
    }

    $vars['description'] = theme('item_list', array('items' => $items));
  }
}

render()取得する引数のデータ型を最初にチェックするため、 に文字列を安全に渡すことができます。

function render(&$element) {
  if (is_array($element)) {
    show($element);
    return drupal_render($element);
  }
  else {
    // Safe-guard for inappropriate use of render() on flat variables: return
    // the variable as-is.
    return $element;
  }
}
于 2012-12-10T05:38:13.810 に答える