View source
<?php
function matrix_field_info() {
return array(
'matrix' => array(
'label' => 'Matrix Field',
),
);
}
function matrix_field_settings($op, $field) {
switch ($op) {
case 'form':
$form = array();
$form['size'] = array(
'#type' => 'textfield',
'#size' => 20,
'#title' => t('Size of textfields'),
'#default_value' => isset($field['size']) ? $field['size'] : 15,
);
$form['rows'] = array(
'#type' => 'textarea',
'#title' => t('Headers in Row'),
'#default_value' => $currfield['extra']['questions'],
'#description' => t('List down left side headers. One per line.') . '<br />',
'#cols' => 60,
'#rows' => 5,
'#weight' => -2,
'#required' => TRUE,
'#default_value' => isset($field["rows"]) ? $field["rows"] : '',
);
$form['cols'] = array(
'#type' => 'textarea',
'#title' => t("Headers in Column"),
'#default_value' => $currfield['extra']['questions'],
'#description' => t('List down top row headers. One per line.') . '<br />',
'#cols' => 60,
'#rows' => 5,
'#weight' => -2,
'#required' => TRUE,
'#default_value' => isset($field["cols"]) ? $field["cols"] : '',
);
return $form;
case 'save':
$values[] = 'rows';
$values[] = 'cols';
$values[] = 'size';
return $values;
}
}
function matrix_field($op, &$node, $field, &$node_field, $teaser, $page) {
switch ($op) {
case 'load':
$result = db_query("SELECT value, row, col FROM {node_field_matrix_data} WHERE vid = %d AND field_name = '%s'", $node->vid, $field['field_name']);
$values = array();
while ($data = db_fetch_array($result)) {
$values[$data["row"]][$data["col"]] = $data['value'];
}
$additions = array(
$field['field_name'] => $values,
);
return $additions;
case 'update':
db_query("DELETE FROM {node_field_matrix_data} WHERE vid = %d and field_name= '%s'", $node->vid, $field['field_name']);
case 'insert':
$rows = trim($field['rows']);
$cols = trim($field['cols']);
$rows = explode("\n", $rows);
$cols = explode("\n", $cols);
$i = 0;
foreach ($rows as $row) {
if ($row) {
$j = 0;
foreach ($cols as $col) {
if ($col) {
db_query("INSERT INTO {node_field_matrix_data} (nid, vid, field_name, row, col, value)\n VALUES (%d, %d, '%s', %d, %d, '%s')", $node->nid, $node->vid, $field['field_name'], $i, $j, $node_field[$i][$j]);
$j++;
}
}
$i++;
}
}
break;
}
}
function matrix_field_formatter_info() {
return array(
'default' => array(
'label' => 'Table View',
'field types' => array(
'matrix',
),
),
);
}
function matrix_field_formatter($field, $item, $formatter, $node) {
static $_matrix_field_count;
$_matrix_field_count[$field['field_name']]++;
if ($_matrix_field_count[$field['field_name']] == 1) {
return theme('matrix_table_view', $node->{$field}['field_name'], $field);
}
}
function matrix_widget_info() {
return array(
'matrix' => array(
'label' => 'Textfields',
'field types' => array(
'matrix',
),
),
);
}
function matrix_widget($op, &$node, $field, &$node_field) {
if ($field['rows'] && $field['cols']) {
$rows = trim($field['rows']);
$cols = trim($field['cols']);
$rows = explode("\n", $rows);
$cols = explode("\n", $cols);
}
switch ($op) {
case 'form':
$form = array();
if ($field['required']) {
$label = '<label for="' . form_clean_id($field['field_name']) . '">' . t($field['widget']['label']);
$label .= '<span class="form-required" title="This field is required.">*</span>';
$label .= '</label>';
}
else {
$label = '<label for="' . form_clean_id($field['field_name']) . '">' . t($field['widget']['label']) . '</label>';
}
$form[$field['field_name']] = array(
'#tree' => TRUE,
'#weight' => $field['widget']['weight'],
'#theme' => 'matrix_table_form',
'#value' => $label,
'#prefix' => '<div class="form-item matrix_field">',
'#suffix' => '</div>',
);
if ($cols) {
$header = array_merge(array(
'',
), $cols);
}
$first_col = $rows;
$i = 0;
foreach ($rows as $row) {
if ($row) {
$j = 0;
foreach ($cols as $col) {
if ($col) {
$form[$field['field_name']][$i][$j] = array(
'#type' => 'textfield',
'#size' => $field['size'],
'#default_value' => isset($node_field[$i][$j]) ? $node_field[$i][$j] : $field['widget']['default_value'][$i][$j],
);
$j++;
}
}
$i++;
}
}
$form[$field['field_name']]['header'] = array(
'#value' => $header,
);
$form[$field['field_name']]['first_col'] = array(
'#value' => $first_col,
);
return $form;
case 'validate':
if ($field['required']) {
$i = 0;
foreach ($rows as $row) {
if ($row) {
$j = 0;
foreach ($cols as $col) {
if ($col) {
if (!$node_field[$i][$j]) {
form_set_error('', t('%title is required', array(
'%title' => t($field['widget']['label']),
)));
}
$j++;
}
}
}
$i++;
}
}
break;
}
}
function theme_matrix_table_form($form) {
if (empty($form)) {
return t('No matrix rows and columns defined yet.');
}
$rows = array();
$header = $form['header']['#value'];
foreach ($form as $row_key => $fields) {
if (!empty($form['first_col']['#value'][$row_key])) {
$row = array();
$row[] = $form['first_col']['#value'][$row_key];
foreach ($fields as $col_key => $field) {
if ($field['#type'] == 'textfield') {
$row[] = drupal_render($form[$row_key][$col_key]);
}
}
$rows[] = $row;
}
}
drupal_render($form['header']);
drupal_render($form['first_col']);
$output = drupal_render($form);
$output .= theme('table', $header, $rows, array(
'class' => 'matrix',
));
return $output;
}
function theme_matrix_table_view($node_field, $field) {
$rows = trim($field['rows']);
$cols = trim($field['cols']);
$rows = explode("\n", $rows);
$cols = explode("\n", $cols);
$header = array_merge(array(
'',
), $cols);
$i = 0;
foreach ($rows as $row) {
if ($row) {
$j = 0;
$outputs = array(
$row,
);
foreach ($cols as $col) {
if ($col) {
if (!empty($node_field[$i][$j])) {
$outputs[] = $node_field[$i][$j];
}
else {
$outputs[] = '-';
}
$j++;
}
}
$i++;
}
if ($outputs) {
$output[] = $outputs;
}
}
return theme('table', $header, $output, array());
}