web-dev-qa-db-ja.com

ノードで別のビューモードを使用する

ビューを使用すると、別のビューモードを使用できることを理解しています。ティーザーまたは完全なコンテンツ。

フルコンテンツビューモード以外のビューモードを使用してノードを表示することはできますか?私が達成したいのは、ユーザーの役割に応じてさまざまなフィールドを表示できることです。

4
Jonathon Choo

新しいコンテンツタイプを作成し、ノード参照フィールドを追加するという方法がうまくいきました。
次に、必要なノードを参照し、Nodeレンダラーを使用して、必要なビューモードで表示します。

1
Jonathon Choo

ノードページで使用されるページコールバックをオーバーライドして、現在のユーザーロールに基づいて表示モードを選択する独自の関数を使用できます。

/**
 * Implements hook_menu_alter().
 */
function MODULE_menu_alter(&$items) {
   $items['node/%node']['page callback'] = 'MODULE_node_page_view';
}

/**
 * Copy of the original node_page_view to use result from our
 * MODULE_node_show($node) as return value.
 */
function MODULE_node_page_view($node) {
  global $user;
  // If there is a menu link to this node, the link becomes the last part
  // of the active trail, and the link name becomes the page title.
  // Thus, we must explicitly set the page title to be the node title.
  drupal_set_title($node->title);
  $uri = entity_uri('node', $node);
  // Set the node path as the canonical URL to prevent duplicate content.
  drupal_add_html_head_link(array('rel' => 'canonical', 'href' => url($uri['path'], $uri['options'])), TRUE);
  // Set the non-aliased path as a default shortlink.
  drupal_add_html_head_link(array('rel' => 'shortlink', 'href' => url($uri['path'], array_merge($uri['options'], array('alias' => TRUE)))), TRUE);
  return MODULE_node_show($node);
}


/**
 * Copy of the original node_page_view to use result from our
 * MODULE_node_show($node) as return value.
 */
function MODULE_node_show($node, $message = FALSE) {
  if ($message) {
    drupal_set_title(t('Revision of %title from %date', array('%title' => $node->title, '%date' => format_date($node->revision_timestamp))), PASS_THROUGH);
  }

  $view_mode = MODULE_user_node_view_mode($node, $user); 

  // For markup consistency with other pages, use node_view_multiple() rather than node_view().
  $nodes = node_view_multiple(array($node->nid => $node), $view_mode);

  // Update the history table, stating that this user viewed this node.
  node_tag_new($node);

  return $nodes;
}

/**
 * Determines the view mode to use for the node page of the given node
 * when viewed by the given user.
 * @param $node
 *  The viewed node object
 * @param $account
 *  The viewing user object
 */
function MODULE_user_node_view_mode($node, $account) {
  // ... Implement your custom view mode selection logic here
}

注:特定の表示モードを使用しているページがキャッシュされず、別のユーザーが再利用しないようにするために実行する必要があることがおそらくあります。

6
Pierre Buyle

単純なノード表示の場合、ディスプレイスイートを使用してティーザーモードとデフォルトビューモードを必要に応じて変更できます。新しいモードを作成する必要はありません。 Drupal 7で新しいビューモードを作成する場合は、 エンティティビューモード モジュールを使用できます。次に、Display Suiteでビューモードを変更して使用できます。ビューまたは フィールドボックス 内。

2
pavlovt

Drupal 6は Display suite と関連モジュールを参照してください。これにより、ビューで使用できる新しいビルドモードを簡単に定義できます。同様のプロジェクトと呼ばれる- ビルドモード

2
Attiks

contextual_view_modesは、アクティブコンテキストを使用してビューモードを切り替える別のオプションです https://drupal.org/project/contextual_view_modes

プロジェクトページから:

コンテキストに基づいてノードの表示モードを変更したいと思ったことはありませんか?今できます。コンテキストビューモードでは、検証するコンテキストを選択して特定のビューモードを表示できる垂直タブが追加されます。そのコンテンツタイプのすべてのノードのコンテキストごとにモードの切り替えを表示できるグローバルコンテンツタイプオプションもあります。

2
Thom Toogood

単に hook_entity_view_mode_alter() を使用できます。

表示されているエンティティの表示モードを変更します。

ここでは、ユーザーの役割に応じて表示モードを変更します。

/**
 * Implements hook_entity_view_mode_alter().
 */
function MYMODULE_entity_view_mode_alter(&$view_mode, $context) {
  if (!user_is_anonymous() && $context['entity_type'] == 'node' && $context['entity']->type == 'MYCONTENTTYPE') {
    $view_mode = 'MYVIEWMODE';
  }
}

独自のビューモードを同じモジュールに簡単に登録するには、単純に hook_entity_info_alter 。その後、フィールドを配置してから、上のフックからスイッチをトリガーします。

/**
 * Implements hook_entity_info_alter().
 */
function MYMODULE_entity_info_alter(&$entity_info) {
  $entity_info['node']['view modes']['MYVIEWMODE'] = array(
    'label' => t('My View Mode'),
    'custom settings' => TRUE,
  );
}
1
leymannx

すべてのモードで$nodeオブジェクト、または少なくともノードオブジェクトをロードできるノードID。
node.tpl.phpとまったく同じように、ノードを好きなように表示できます。

また、Viewsにはビューごとに独自のnode-view.tpl.phpがあるため、ティーザーモードとフルモードで好きなように表示できます。

そして、あなたの質問に答えるために、別のモジュール追加モード(そして確信が持てない場合)を除いて、ティーザーとフルモードしかありません。

0
yvan