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é.
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'),
),
);