web-dev-qa-db-ja.com

コンテンツフィールドを異なる領域に分割する

私の状況は次のとおりです。コンテンツタイプセミナーがあり、フィールドA、B、Cがあります。ヘッダー、フッター、コンテンツ、サイドバー左の領域があります。セミナーのコンテンツ領域に表示したいフィールドがいくつかありますが、サイドバー左領域にもあります。

これを行うにはどうすればよいですか?これが以前にすでに回答されている場合はお詫びします。私は開発者であり、フック関数とプリプロセッサー関数に飛び込むことをためらっていません。 Viewsモジュールをインストールしましたが、使用していません(これが私の最初のDrupalサイトで、:Pがわからない場合))。

乾杯。

編集:これはDrupal 7用です。

11
Lester Peabody

ノードのコンテンツをページの異なる領域に追加する簡単な方法はありません。この問題に取り組む方法はいくつかあります。

非コーディング方法:ビューとブロック

ビューを作成する

  • タイプ:ブロック
  • コンテキストフィルター:コンテンツ:Nid
    • デフォルト値:現在のページから取得
  • フィールド:どちらでもかまいません
  • フィルタ:
    • コンテンツタイプ:セミナー

(プラスあなたが望む追加設定)

次に、管理者ブロックページに移動します。新しく作成したビューブロックを、表示するリージョンに移動します。セミナーノードページにのみ表示されます。

すべての地域で繰り返す

theme_preprocess_region()を使用したコーディング方法:

コードは次のようになります

MYTHEME_preprocess_region(&$variables) {
  if (isset($node) && ($node->type == 'seminar' )) {
     //add new variable here.     
  }
}

これはDrupal 7の場合のみです。現在では、region.tpl.phpで使用できます。

11
iStryker

Display Suite モジュールでこれを行うことができます。 Display Suite Extrasモジュールを有効にして、テーマリージョンをノードコンポーネントのターゲットとして公開する必要があります。これを行う方法についての情報は、Display Suiteドキュメントの ブロックにフィールドを追加 ページにあります。

7
jhedstrom

同じ問題がありました。解決策は非常に簡単です。 Drupal 7では、FULLとTEASERだけでなく(最も古いバージョンからわかるように)独自のview_modeを定義できるという事実を基にすることができます。したがって、地域で使用する別のview_modeを定義します。例LEFTHAND。Drupalはコンテンツ領域に完全なview_modeを表示します。したがって、サイドバーの左側の領域にLEFTHANDを表示するにはDrupalと言う必要があります。

  1. Template_preprocess_page()内

    if ($vars['node']) {
    $vars['page']['sidebar_left'][] = node_view($vars['node'], 'lefthand');
    }

  2. Node.tpl.phpに、左側ビューモードの新しいディスプレイを追加します

    if ($view_mode == 'lefthand') {
    // render content fields here
    }

5
Patrik Lucan

Display Suiteが必要以上に思える場合(素晴らしいモジュールですが、いくつかのフィールドを再配置する必要があるだけではやり過ぎかもしれません)この目的のためだけのモジュールがあります-> CCK Blocks =。

私はそれが「CCK」ブロックと呼ばれていることを知っていますが、Drupal 7(CCKの機能をコアにもたらしました)で動作します。

3
Chance G

@Patrik Lucanの回答を少し変更しました。if ($vars['node'])は、ノードではないページで問題を引き起こしていました。ブロックまたはビューページのあるカスタムフロントページ。

変更:

if (array_key_exists('node', $vars))

これで問題は解決したようです。

1
Dominic Woodman

一方、このためのモジュールがあります。モジュールページから:

Field as Block は、現在のノードの1つ以上のフィールドをブロックに表示する簡単な方法を提供します。

このモジュールは、PanelsやDisplay Suiteなどのモジュールの軽量な代替手段を目指しています。または、ビューを使用して、1つのフィールドのみを取得するブロックを定義しています。

0
phils