From 2f2f98db56ccc355208ab3b97ef9ca46f66094de Mon Sep 17 00:00:00 2001
From: Joost van der Locht <joost@trisum.nl>
Date: Mon, 21 Mar 2011 09:57:16 +0100
Subject: [PATCH] Add Table option to formatter_view

---
 field_collection.module    |   80 ++++++++++++++++++++++++++++++++++++++++++++
 field_collection_table.css |    1 +
 2 files changed, 81 insertions(+), 0 deletions(-)
 create mode 100644 field_collection_table.css

diff --git a/field_collection.module b/field_collection.module
index 055ef0a..82d5e19 100644
--- a/field_collection.module
+++ b/field_collection.module
@@ -560,6 +560,16 @@ function field_collection_field_formatter_info() {
         'description' => TRUE,
       ),
     ),
+	'field_collection_table' => array(
+		'label' => t('Table field-collection items'),
+		'field types' => array('field_collection'),
+		'settings' =>  array(
+			'edit' => t('Edit'),
+			'delete' => t('Delete'),
+			'add' => t('Add'),
+		    'description' => TRUE,
+		),
+	),
   );
 }
 
@@ -667,6 +677,76 @@ function field_collection_field_formatter_view($entity_type, $entity, $field, $i
         }
       }
       break;
+
+	case 'field_collection_table':
+
+		$field_collection_items = field_info_instances('field_collection_item', $field['field_name']);
+		$header = array();
+		$field_names = array();
+		foreach ($field_collection_items as $field_collection_item) {
+			$weight = $field_collection_item['display']['default']['weight'];
+			$field_names[$weight] = $field_collection_item['field_name'];
+			$header[$weight] = array(
+				'data' => $field_collection_item['label'],
+				'class' => $field_names[$weight],
+			);
+		}
+		ksort($header);
+		ksort($field_names);	
+
+		$element['#attached']['css'][] = drupal_get_path('module', 'field_collection') . '/field_collection_table.css';
+		$rows = array();
+		foreach ($items as $delta => $item) {
+			if ($field_collection = isset($item['entity']) ? $item['entity'] : field_collection_item_load($item['value'])) {
+				$content = $field_collection->buildContent();
+				$content['#empty'] = '<span class="empty_field"></span>';
+				$column = array();
+				foreach ($field_names as $field_name) {
+					if (isset($content[$field_name])) {
+						$field_data_items = array();
+						foreach ($content[$field_name]['#items'] as $key => $value) {
+							$field_data_items[] = "<div id=\"item-{$key}\">" . $content[$field_name][$key]['#markup'] . "</div>";
+						}
+						$field_data = implode($field_data_items);
+					} else {
+						$field_data = $content['#empty'];
+					}
+					$column[] = array(
+						'data' => $field_data,
+						'class' => $field_name,
+					);
+				}
+			}
+
+			$links = array();
+	        foreach (array('edit', 'delete') as $op) {
+	        	if ($settings[$op] && field_collection_item_access($op == 'edit' ? 'update' : $op, $field_collection)) {
+	        		$links[] = l($settings[$op], $field_collection->path() . '/' . $op, array('query' => drupal_get_destination()));
+	        		$header['operations'] = t('Operations');
+	            }
+			}
+
+	         	if ($links) {	
+	         		$output = theme('item_list', array('items' => $links));          		
+	         		$column[] = array(
+						'data' => $output,
+						'class' => "field_collection_item_operations",
+					);
+			}
+
+			$rows[] = array(
+				'data' => $column,
+				'class' => array('field_collection_item'),
+			);
+		}
+
+		$element[0] = array(
+			'#theme' => 'table', 
+			'#header' => $header, 
+			'#rows' => $rows,
+		);
+		break;
+		
   }
 
   if ($settings['add'] && ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED || count($items) < $field['cardinality'])) {
diff --git a/field_collection_table.css b/field_collection_table.css
new file mode 100644
index 0000000..bf67b66
--- /dev/null
+++ b/field_collection_table.css
@@ -0,0 +1 @@
+@CHARSET "UTF-8";
\ No newline at end of file
-- 
1.7.4.1

