You are here

function matrix_matrix_process in Matrix field 6.2

Process the matrix type element before displaying the field.

Build the form element. When creating a form using FAPI #process, note that $element['#value'] is already set.

For CCK, $fields array is in $form['#field_info'][$element['#field_name']].

1 string reference to 'matrix_matrix_process'
matrix_elements in ./matrix.module
Implementation of hook_elements().

File

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

Code

function matrix_matrix_process($element, $edit, &$form_state, $form) {
  if (!is_array($element['#rows_elements'])) {
    $element['#rows_elements'] = array();
  }

  //as this element can be used by non-cck modules, data needs to be optionally retrieved directly from the form element
  $field = $form['#field_info'][$element['#field_name']];
  if ($field) {
    $rows = (array) unserialize(str_replace("\r", "", $field['rows_elements']));
    $cols = (array) unserialize(str_replace("\r", "", $field['cols_elements']));
    $mode = $field['mode'];
  }
  else {
    $rows = (array) $element['#rows_elements'];
    $cols = (array) $element['#cols_elements'];
    $mode = $element['#mode'];
  }

  //add in extra rows and columns
  if ($form_state['post']['op'] == t('Add more rows')) {
    $cols[] = array(
      '#title' => '',
    );
  }
  if ($form_state['post']['op'] == t('Add more columns')) {
    $cols[] = array(
      '#title' => '',
    );
  }

  //generate column headers
  $header[] = '';

  //first must be blank
  foreach ($cols as $col) {
    if ($col['#required'] == TRUE) {
      $header[] = $col['#title'] . '<span class="form-required" title="This field is required.">*</span>';
    }
    else {
      $header[] = $col['#title'];
    }
  }

  //generate first column
  foreach ($rows as $row) {
    if ($row['#required'] == TRUE) {
      $first_col[] = $row['#title'] . '<span class="form-required" title="This field is required.">*</span>';
    }
    else {
      $first_col[] = $row['#title'];
    }
  }
  $processed_element = array(
    '#tree' => TRUE,
    /*
        '#theme' => 'matrix_table_form',
    */
    '#parents' => $element['#parents'],
    '#title' => $element['#title'],
    '#description' => $element['#description'],
    '#field_name' => $element['#field_name'],
    '#type_name' => $element['#type_name'],
    '#delta' => $element['#delta'],
    '#mode' => $element['#mode'],
    '#element_validate' => $element['#element_validate'],
    '#rows_elements' => $rows,
    '#cols_elements' => $cols,
    '#header' => $header,
    '#first_col' => $first_col,
    '#prefix' => '<div id="matrix-wrapper">' . $element['#prefix'],
    '#suffix' => $element['#suffix'] . '</div>',
  );
  $f = $form['#node']->{$element}['#field_name'];

  //build out the appropriate form element
  foreach ($rows as $row_id => $row) {
    foreach ($cols as $col_id => $col) {

      //get default value
      if (isset($element['#value'][$row_id][$col_id])) {

        //cck value
        $default = $element['#value'][$row_id][$col_id];
      }
      elseif (isset($f[0][$row_id][$col_id])) {

        //node preview
        $default = $f[0][$row_id][$col_id];
      }
      elseif (isset($form['#field_info'][$element['#field_name']]['widget']['default_value'][0][$row_id][$col_id])) {

        //cck default value
        $default = $form['#field_info'][$element['#field_name']]['widget']['default_value'][0][$row_id][$col_id];
      }
      else {
        $default = $element['#rows_elements'][$row_id]['#default_value'];

        //form element value
      }
      if ($mode == 'rows') {
        $processed_element[$row_id][$col_id] = _matrix_process($row, $default);
      }
      else {
        $processed_element[$row_id][$col_id] = _matrix_process($col, $default);
      }
    }
  }
  if ($element['#ahah_enabled']) {
    $mode = $element['#mode'] == 'rows' ? t('columns') : t('rows');
    $processed_element['matrix_more'] = array(
      '#type' => 'button',
      '#parents' => $element['#parents'],
      '#value' => t('Add more @type', array(
        '@type' => $mode,
      )),
      '#ahah' => array(
        'path' => 'matrix/ahah',
        'wrapper' => 'matrix-wrapper',
        'method' => 'replace',
        'effect' => 'fade',
      ),
    );
  }
  return $processed_element;
}