Index: composite.module =================================================================== --- composite.module (revision 275) +++ composite.module (working copy) @@ -42,12 +42,12 @@ } // Helper function: Filter out properties, fill in 'info' field -function _composite_references_preprocess($original, $zones) { +function _composite_references_preprocess($original, $zones, $node) { // Build a list of references, also generating labels in the process $references = array(); foreach (element_children($original) as $id) { $reference = $original[$id]; - composite_invoke_referenceapi($reference, 'info'); + composite_invoke_referenceapi($reference, 'info', $node); $references[$id] = $reference; } Index: composite.pages.inc =================================================================== --- composite.pages.inc (revision 275) +++ composite.pages.inc (working copy) @@ -166,7 +166,7 @@ $form['vid'] = array('#type' => 'value', '#value' => $node->vid); // Composite references - $references = _composite_references_preprocess($node->composite_references, $layout_zones); + $references = _composite_references_preprocess($node->composite_references, $layout_zones, $node); _composite_compare('reset-zones', $layout_zones); usort($references, '_composite_compare'); Index: modules/content/composite_cck.module =================================================================== --- modules/content/composite_cck.module (revision 275) +++ modules/content/composite_cck.module (working copy) @@ -71,21 +71,39 @@ // Special: If this content type has a body, add it as a field $node_content_type = node_get_types('type', $node); if ($node_content_type->has_body) { - $options['body'] = t('Node: Body'); // array('@label' => check_plain($node_content_type->body_label))); + $element['value'] = $node->body; + $preview = _composite_cck_preview_element($element); + if (!empty($preview)) { + $options ['body'] = t('!preview
Node: Body', array('!preview' => $preview)); // array('@label' => check_plain($node_content_type->body_label))); + } + else { + $options['body'] = t('Node: Body'); // array('@label' => check_plain($node_content_type->body_label))); + } } - // Get a list of available fields + // Get a list of individual field values for multi valued fields or single fields foreach ($fields as $field => $field_info) { - $options[$field] = t('Field: @label', array('@label' => $field_info['widget']['label'])); - } - - // Get a list of individual field values for multi valued fields - foreach ($fields as $field => $field_info) { + $item = $node->$field; if ($field_info['multiple']) { foreach ($node->$field as $delta => $field_value) { - $options[$field . '-' . $delta] = t('Field value: @label @delta', array('@label' => $field_info['widget']['label'], '@delta' => "[$delta]")); + $preview = _composite_cck_preview_element($item[$delta]); + if (!empty($preview)) { + $options[$field . '-' . $delta] = t('!preview
Field value: @label @delta', array('@label' => $field_info['widget']['label'], '@delta' => "[$delta]", '!preview' => $preview)); + } + else { + $options[$field . '-' . $delta] = t('Field value: @label @delta', array('@label' => $field_info['widget']['label'], '@delta' => "[$delta]")); + } } } + else { + $preview = _composite_cck_preview_element($item[0]); + if (!empty($preview)) { + $options[$field] = t('!preview
Field: @label', array('@label' => $field_info['widget']['label'], '!preview' => $preview)); + } + else { + $options[$field] = t('Field: @label', array('@label' => $field_info['widget']['label'])); + } + } } return $options; @@ -99,7 +117,14 @@ switch ($op) { // Generate and insert an informative human-readable string into ['info'] case 'info': - $reference['info'] = t('Node: Body'); // array('@label' => check_plain($node_content_type->body_label))); + $element['value'] = $node->body; + $preview = _composite_cck_preview_element($element); + if (!empty($preview)) { + $reference['info'] = t('!preview
Node: Body', array('!preview' => $preview)); // array('@label' => check_plain($node_content_type->body_label))); + } + else { + $reference['info'] = t('Node: Body'); // array('@label' => check_plain($node_content_type->body_label))); + } break; // Return a rendering of the reference item @@ -127,7 +152,14 @@ // Generate and insert an informative human-readable string into ['info'] case 'info': $field = content_fields($reference['parent_field']); - $reference['info'] = t('Field value: @label @delta', array('@label' => $field['widget']['label'], '@delta' => '['. $reference['delta'] .']')); + $item = $node->$reference['parent_field']; + $preview = _composite_cck_preview_element($item[$reference['delta']]); + if (empty($preview)) { + $reference['info'] = t('Field value: @label @delta', array('@label' => $field['widget']['label'], '@delta' => '['. $reference['delta'] .']')); + } + else { + $reference['info'] = t('!preview
Field value: @label @delta', array('@label' => $field['widget']['label'], '@delta' => '['. $reference['delta'] .']', '!preview' => $preview)); + } break; // Return a rendering of the reference item @@ -179,3 +211,34 @@ return $formatter_options; } + +/** + * Take a cck element and return a preview string for use when sorting. + * + * @param $element + * The raw cck element, taken from node_load(). + * @return + * A human-readable and sanitized preview string. + */ +function _composite_cck_preview_element($element) { + if (isset($element['value'])) { + if (strlen($element['value']) < 40 || is_int($element['value'])) { + return check_plain($element['value']); + } + else { + return check_plain(substr($element['value'], 0, 40)) .'...'; + } + } + else if (isset($element['nid'])) { + $data = db_fetch_object(db_query("SELECT nid, title FROM {node} WHERE nid = %d", $element['nid'])); + if (!empty($data->nid)) { + return l($data->title, "node/$data->nid"); + } + } + else if (isset($element['uid'])) { + $data = db_fetch_object(db_query("SELECT uid, name FROM {users} WHERE uid = %d", $element['uid'])); + if (!empty($data->uid)) { + return l($data->name, "user/$data->uid"); + } + } +}