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


11

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

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

乾杯。

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


Drupalのどのバージョンですか?
keva

これはDrupal 7用です。その情報を元の質問に追加しました。
レスターピーボディ

問題の解決に着手したらすぐに回答を受け入れます。私は現在、コンテンツを適切に表示するための提案を設定する方法を考えています...
Lester Peabody

回答:


11

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

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

ビューを作成する

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

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

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

すべての地域で繰り返す

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

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

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

これはDrupal 7専用です。これで、region.tpl.phpで使用できます。


1
ビュー/ブロックのアプローチは実際に私が好むものですが、一部のアプローチがより親しみやすいと感じたため、Display Suiteを提案しました。
jhedstrom

私が発見しているように、ビューはこれに最適です。ビューは一般的に素晴らしいです。また、メニューブロックモジュールを使用して、サイトのどこにあるかに基づいてメニューを分割します(メインメニューを分割して常に表示されるようにして、サブメニューを、メインメニューに含まれるメニューに基づいて分割します)。完全に素晴らしいモジュール、強くお勧めします。
レスターピーボディ

私がこれを1か月近く尋ねて、答えを受け入れましたが、今はこの答えの適用に近づいています(それ以来私はViewsをトンで使用していますが)。Drupal 7でのビューの使用について少し説明してください。引数:nidはDrupal 7のビュー3には存在しないようです。ありがとうございます。
レスターピーボディ

私はそれを考え出した。引数の概念は、[詳細設定]の[コンテキストフィルター]に置き換えられました。
レスターピーボディ

D7、Contextual Fitler:コンテンツ:NID。編集:私が答える前に、あなたがそれを見つけたことを確認してください
iStryker

7

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


5

同じ問題がありました。解決策は非常に簡単です。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
    }


1
この答えは超超賢く、表示モードを定義する以外に、外部モジュールを必要としません。Display Suiteのシンプルな代替手段は、エンティティビューモードです。drupal.org
paul-m

私はこれが本当に好きだった。特定のページにのみ表示されるように、それをif関数でラップします。以前if (array_key_exists('block_14',$vars['page']['main_content'])){}は特定のブロックのあるページにのみ表示されるようにしていました。
ドミニクウッドマン2013

3

Display Suiteがあなたにとって必要すぎるように思われる場合(これは素晴らしいモジュールですが、いくつかのフィールドを再配置する必要があるだけではやり過ぎかもしれません)この目的のためだけのモジュール-> CCKブロックがあります。

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


1

@Patrik Lucanの回答を少し変更すると、if ($vars['node'])ノードではないページで問題が発生しました。たとえば、ブロック付きのフロントページやビューページがあります。

変更:

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

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


0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.