You are here

function matrix_field in Matrix field 6.2

Same name and namespace in other branches
  1. 5 matrix.module \matrix_field()
  2. 6 matrix.module \matrix_field()

Implementation of hook_field().

2 calls to matrix_field()
matrix_handler_cell::render in ./matrix_handler_cell.inc
matrix_handler_field::render in ./matrix_handler_field.inc

File

./matrix.module, line 293
Defines simple matrix field types.

Code

function matrix_field($op, &$node, $field, &$items, $teaser, $page) {
  switch ($op) {
    case 'load':
      $db_info = content_database_info($field);
      $result = db_query("SELECT value, row, col FROM {node_field_matrix_data} WHERE vid = %d AND field_name = '%s' ORDER BY row", $node->vid, $field['field_name']);
      $values = array();
      while ($data = db_fetch_object($result)) {
        $values[$data->row][$data->col] = $data->value;
      }
      return array(
        $field['field_name'] => array_values($values),
      );
    case 'delete':
    case 'delete revision':
      db_query("DELETE FROM {node_field_matrix_data} WHERE vid = %d and field_name= '%s'", $node->vid, $field['field_name']);
      break;
    case 'update':
      db_query("DELETE FROM {node_field_matrix_data} WHERE vid = %d and field_name= '%s'", $node->vid, $field['field_name']);
    case 'insert':
      $cols_elements = unserialize(str_replace("\r", "", $field['cols_elements']));
      switch ($field['widget']['type']) {
        case 'table':

          // Have to get data from $_POST because order of items was not respected
          if ($node->form_token == $_POST['form_token'] && $node->form_build_id == $_POST['form_build_id']) {

            // TODO: Check XSS injection
            $items =& $_POST[$field['field_name']];
          }
          if (is_array($items) && count($items)) {
            $row = 0;
            foreach ($items as $values) {
              $sql = array();
              $empty = TRUE;
              unset($values['_weight']);
              foreach ($values as $col => $val) {

                // Buffer queries
                $sql[] = array(
                  "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'],
                  $row,
                  $col,
                  $val,
                );

                // Check for empty rows
                if (strlen(trim($val))) {
                  $empty = FALSE;
                }
              }
              if (!$empty) {

                // Save row
                foreach ($sql as $q) {
                  call_user_func_array('db_query', $q);
                }
              }
              ++$row;
            }
          }
          break;
        case 'matrix':
          $rows_elements = unserialize(str_replace("\r", "", $field['rows_elements']));
          foreach ($rows_elements as $i => $row) {
            foreach ($cols_elements as $j => $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, $items[0][$i][$j]);
            }
          }
          break;
      }
      break;
  }
}