it-swarm-es.com

Señalando el controlador de Vistas para Node Cuerpo en otro controlador de campo

Quiero poder usar un campo CCK como el cuerpo de mi nodo sin afectar la interoperabilidad con las Vistas generadas por módulos independientes. Usando hook_data_alter(), he intentado redirigir el controlador del cuerpo del nodo de Vistas para ver el controlador que CCK ha generado para mi campo, field_body. Desafortunadamente, obtengo algunos errores cuando intento hacer uso de la solución propuesta.

/**
 * 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.');
}

Este código parece funcionar, pero cuando intento usar el controlador en la práctica, aparece una advertencia :

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.

Mi interpretación de esto es que el código no está tirando de la tabla content_field_body cuando se usa el campo, sino que solo intenta usar node_revisions.field_body_value.

Buscando alguna respuesta que resuelva este problema o sugiera una mejor estrategia para mi objetivo.

EDITAR: Opción de respaldo feo

Use hook_views_default_views_alter () para escanear cada Vista en busca de un campo de cuerpo definido y cámbielo por un campo CCK estándar. Sin embargo, esto romperá todo tipo de cosas y no tendrá un gran rendimiento en el borrado de caché.

4
Grayside

Como el campo de la base de datos que está utilizando es externo al node_revisions, probablemente debería declarar una relación, de la misma manera que se hace desde Vistas para el campo 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