web-dev-qa-db-ja.com

Node Bodyのビューハンドラを別のフィールドハンドラに向ける

独立したモジュールによって生成されたビューとの相互運用性に影響を与えることなく、CCKフィールドをノード本体として使用できるようにしたい。 hook_data_alter()を使用して、CCKがフィールドfield_bodyに対して生成したハンドラーを確認するために、Viewsノードの本体ハンドラーのターゲットを変更しようとしました。残念ながら、提案したソリューションを利用しようとすると、エラーが発生します。

/**
 * Implementation of hook_views_data_alter().
 */
function fieldbody_views_data_alter(&$data) {
  // When node_revisions table is added, join in content_field_body too.
  $data['node_revisions']['table']['join']['content_field_body'] = array(
    'left_field' => 'vid',
    'field' => 'vid',
  );

  // Use field_body handler info for node body.
  $data['node_revisions']['body'] =
    $data['node_data_field_body']['field_body_value'];

  // Really emphasize that we are using a different table.
  // Since this isn't doing anything, it may be redundant.
  $data['node_revisions']['body']['table'] = 'content_field_body';

  // A couple tweaks so it's a friendly Node Body replacement in the UI.
  $data['node_revisions']['body']['group'] = t('Node');
  $data['node_revisions']['body']['help'] =
    t('Full body text of the node.');
}

このコードは機能しているようですが、実際にハンドラーを使用しようとすると、警告が表示されます:

user warning: Unknown column 'node_revisions.field_body_value' in 'field list' query: SELECT DISTINCT node.nid AS nid, node_revisions.field_body_value AS node_revisions_field_body_value, node_revisions.field_body_format AS node_revisions_field_body_format, node.type AS node_type, node.vid AS node_vid FROM node node LEFT JOIN node_revisions node_revisions ON node.vid = node_revisions.vid LIMIT 0, 10 in ../workspace/oa/profiles/openatrium/modules/contrib/views/includes/view.inc on line 771.

これについての私の解釈は、フィールドが使用されたときにコードがcontent_field_bodyテーブルを取得せず、代わりに単にnode_revisions.field_body_valueを使用しようとするというものです。

この問題を解決する、または私の目標のためのより良い戦略を提案する答えを探しています。

編集:醜いフォールバックオプション

Hook_views_default_views_alter()を使用して、定義された本文フィールドのすべてのビューをスキャンし、それを標準のCCKフィールドと交換します。ただし、これによりあらゆる種類の問題が解決され、キャッシュのクリアのパフォーマンスが低下します。

4
Grayside

使用しているデータベースフィールドはnode_revisionsテーブルの外部にあるため、ビューからuidフィールドに対して行ったのと同じ方法で、関係を宣言する必要があります。

// uid field
$data['node_revisions']['uid'] = array(
  'title' => t('User'),
  'help' => t('Relate a node revision to the user who created the revision.'),
  'relationship' => array(
    'handler' => 'views_handler_relationship',
    'base' => 'users',
    'base field' => 'uid',
    'label' => t('user'),
  ),
);
1
kiamlaluno