You are here

matrix.module in Matrix field 5

Same filename and directory in other branches
  1. 8.2 matrix.module
  2. 6.2 matrix.module
  3. 6 matrix.module
  4. 7.2 matrix.module

File

matrix.module
View source
<?php

/**
 * Implementation of hook_field_info().
 */
function matrix_field_info() {
  return array(
    'matrix' => array(
      'label' => 'Matrix Field',
    ),
  );
}

/**
 * Implementation of hook_field_settings().
 */
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;
  }
}

/**
 * Implementation of hook_field().
 */
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;
  }
}

/**
 * Implementation of hook_field_formatter_info().
 */
function matrix_field_formatter_info() {
  return array(
    'default' => array(
      'label' => 'Table View',
      'field types' => array(
        'matrix',
      ),
    ),
  );
}

/**
 * Implemenation of hook_field_formatter
 */
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);
  }
}

/**
 * Implementation of hook_widget_info().
 */
function matrix_widget_info() {
  return array(
    'matrix' => array(
      'label' => 'Textfields',
      'field types' => array(
        'matrix',
      ),
    ),
  );
}

/**
 * Implementation of hook_widget().
 */
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());
}

Functions

Namesort descending Description
matrix_field Implementation of hook_field().
matrix_field_formatter Implemenation of hook_field_formatter
matrix_field_formatter_info Implementation of hook_field_formatter_info().
matrix_field_info Implementation of hook_field_info().
matrix_field_settings Implementation of hook_field_settings().
matrix_widget Implementation of hook_widget().
matrix_widget_info Implementation of hook_widget_info().
theme_matrix_table_form
theme_matrix_table_view