You are here

public static function LogFilter::viewerFormSubmit in Log Filter 7

Called when log viewer form submits.

Parameters

array $form:

array &$form_state:

Return value

void

1 call to LogFilter::viewerFormSubmit()
_log_filter_form_submit in ./log_filter.module
Called when log viewer form submits.

File

./LogFilter.inc, line 895
Drupal Log Filter module

Class

LogFilter
@file Drupal Log Filter module

Code

public static function viewerFormSubmit($form, &$form_state) {
  try {
    $values =& $form_state['values'];
    $prefix = 'log_filter_';
    $messages = array();
    $settings = array(
      'only_own' => !array_key_exists($prefix . 'only_own', $values) ? FALSE : $values[$prefix . 'only_own'],
      'delete_logs_max' => !array_key_exists($prefix . 'delete_logs_max', $values) ? '' : $values[$prefix . 'delete_logs_max'],
      'translate' => $values[$prefix . 'translate'],
      'only_own' => !array_key_exists($prefix . 'only_own', $values) ? FALSE : $values[$prefix . 'only_own'],
      'pager_range' => ($v = (int) $values[$prefix . 'pager_range']) > -1 ? $v > self::PAGE_RANGE_MAX ? self::PAGE_RANGE_MAX : $v : variable_get('log_filter_pgrng', self::PAGE_RANGE_DEFAULT),
    );
    $submitted = array(
      'mode' => $values[$prefix . 'mode'],
      'filter' => array(
        'name' => '',
        'origin' => '',
        'name_suggest' => '',
        'description' => '',
        'require_admin' => !array_key_exists($prefix . 'require_admin', $values) ? FALSE : $values[$prefix . 'require_admin'],
      ),
    );
    $use_form_values = $save = FALSE;
    switch ($mode = $submitted['mode']) {
      case 'default':

        //  Use default values.
        break;
      case 'adhoc':

        //  Get specs from form.
        $use_form_values = TRUE;
        $submitted['filter']['origin'] = $values[$prefix . 'origin'];

        // ~ Hidden field.
        break;
      case 'stored':

        // Saved filter.
        //  Just get filter name; in stored mode we do absolutely nothing at submission but establishing the filter's name.
        //  Whether the filter require_admin and user has that permission will be checked at form build - no reason to check twice.
        if (!($submitted['filter']['name'] = $filter_name = $values[$prefix . 'name'])) {
          throw new Exception('Mode[' . $mode . '], empty name[' . $filter_name . '].', self::$_errorCodes['filter_name_composition']);
        }
        break;
      case 'create':

        // Always AJAX-handled.
        throw new Exception('Mode[' . $mode . '] not allowed at form submission.', self::$_errorCodes['algo']);
        break;
      case 'edit':
      case 'delete_filter':

        //  Get name.
        if (!($submitted['filter']['name'] = $filter_name = $values[$prefix . 'name'])) {
          throw new Exception('Mode[' . $mode . '], empty name[' . $filter_name . '].', self::$_errorCodes['filter_name_composition']);
        }
        $success = TRUE;

        //  Check CRUD permission.
        if (!user_access('log_filter edit filters')) {
          $success = FALSE;

          //  Horrible; have to make almost exactly same message, because of shortcomings of the localization regime.
          switch ($mode) {
            case 'edit':
              watchdog('log_filter', 'Won\'t edit the filter \'!name\' because user !user doesn\'t have \'log_filter edit filters\' permission.', array(
                '!name' => $filter_name,
                '!user' => $GLOBALS['user']->name,
              ), WATCHDOG_WARNING);
              drupal_set_message(t('Cannot edit the filter \'!name\', because you don\'t have permission to edit log filters.', array(
                '!name' => $filter_name,
              )), 'warning');
              break;
            default:

              // delete
              watchdog('log_filter', 'Won\'t delete the filter \'!name\' because user !user doesn\'t have \'log_filter edit filters\' permission.', array(
                '!name' => $filter_name,
                '!user' => $GLOBALS['user']->name,
              ), WATCHDOG_WARNING);
              drupal_set_message(t('Cannot delete the filter \'!name\', because you don\'t have permission to edit log filters.', array(
                '!name' => $filter_name,
              )), 'warning');
          }
        }
        elseif (!($require_admin = db_select('log_filter')
          ->fields('log_filter', array(
          'require_admin',
        ))
          ->condition('name', $filter_name, '=')
          ->execute()
          ->fetchField())) {
          if ($require_admin === FALSE) {

            // Doesn't exist.
            $success = FALSE;

            /* drupal_set_message(
                   t('The filter \'!name\' doesn\'t exist.', array('!name' => $filter_name)),
                   'warning'
               ); */
            $messages[] = array(
              t('The filter \'!name\' doesn\'t exist.', array(
                '!name' => $filter_name,
              )),
              'warning',
            );
          }

          //  else... the filter doesnt require admin permission.
        }
        elseif (!user_access('log_filter administer')) {
          $success = FALSE;
        }
        if ($success) {
          switch ($mode) {
            case 'edit':

              //  Get specs from form, and save to database.
              $use_form_values = TRUE;
              $save = TRUE;
              $submitted['filter']['description'] = $values[$prefix . 'description'];

              //  Change mode.
              $submitted['mode'] = $mode = 'stored';
              break;
            default:

              // delete
              global $user;
              db_delete('log_filter')
                ->condition('name', $filter_name, '=')
                ->execute();
              watchdog('log_filter', 'User (%uid) %name deleted the log filter \'!filter\'.', array(
                '%uid' => $user->uid,
                '%name' => $user->name,
                '!filter' => $filter_name,
              ), WATCHDOG_INFO);
              $messages[] = array(
                t('Deleted the filter \'!name\'.', array(
                  '!name' => $filter_name,
                )),
              );

              //  Change mode.
              $submitted['mode'] = $mode = 'default';
          }
        }
        else {
          $use_form_values = $save = FALSE;

          //  Change mode.
          $submitted['mode'] = $mode = 'default';
        }
        break;
      default:
        throw new Exception('Unsupported mode[' . $mode . '].', self::$_errorCodes['algo']);
    }

    //  Load values from form.
    if ($use_form_values) {
      $fields_conditions =& self::$_fields['conditions'];
      $conditions = array();
      foreach ($fields_conditions as $name) {
        switch ($name) {
          case 'time_range':
            $conditions[$name] = ($v = trim($values[$prefix . $name])) ? $v : '';
            break;
          case 'role':
            $conditions[$name] = ($v = trim($values[$prefix . $name])) > 0 ? $v : -1;
            break;
          case 'uid':

            // Accepts zero.
            $conditions[$name] = ($v = trim($values[$prefix . $name])) > 0 || $v === '0' || $v === 0 ? $v : -1;
            break;
          case 'time_from':
            $conditions[$name] = $conditions['time_range'] ? '' : (($v = trim($values[$prefix . $name])) ? $v : '');
            break;
          case 'time_from_proxy':
            if (!$save) {

              // Because save doesnt use the proxy field.
              $conditions[$name] = !$conditions['time_from'] ? '' : $values[$prefix . $name];
            }
            break;
          case 'time_to':
            $conditions[$name] = $conditions['time_range'] ? '' : (($v = trim($values[$prefix . $name])) ? $v : '');
            break;
          case 'time_to_proxy':
            if (!$save) {

              // Because save doesnt use the proxy field.y
              $conditions[$name] = !$conditions['time_to'] ? '' : $values[$prefix . $name];
            }
            break;
          case 'severity':
            $arr = $values[$prefix . $name];
            $vals = array();
            foreach ($arr as $k => $v) {
              if ($v) {
                if ('' . $k == '-1') {
                  $vals = array();
                  break;
                }
                else {
                  $vals[] = $k;
                }
              }
            }
            $conditions[$name] = $vals;
            break;
          case 'type_wildcard':
            $conditions[$name] = $values[$prefix . $name] ? TRUE : FALSE;
            break;
          case 'type':

            //  Dont remember type list (may be very long), if wildcard on.
            $conditions[$name] = $conditions['type_wildcard'] ? array() : array_combine($a = explode("\n", str_replace("\r", '', $values[$prefix . $name])), $a);
            if ($save) {
              unset($conditions['type_wildcard']);
            }
            break;
          default:
            $conditions[$name] = trim($values[$prefix . $name]);
        }
      }
      unset($fields_conditions);
      $submitted['conditions'] =& $conditions;
      $fields_order_by =& self::$_fields['order_by'];
      $order_by = array();
      for ($i = 1; $i < 10; $i++) {
        if (array_key_exists($key = $prefix . $fields_order_by[0] . $i, $values)) {
          if ($key = $values[$key]) {
            if (!$save) {
              $order_by[] = array(
                $key,
                $values[$prefix . $fields_order_by[1] . $i],
              );
            }
            else {
              $order_by[] = array(
                $key,
                $values[$prefix . $fields_order_by[1] . $i] ? 'DESC' : 'ASC',
              );
            }
          }
        }
        else {
          break;
        }
      }
      $submitted['order_by'] =& $order_by;
      unset($order_by, $fields_order_by);
    }
    if ($save) {

      // edit mode.
      $success = TRUE;
      try {
        self::_saveFilter($filter_name, $submitted);
      } catch (Exception $xc) {
        self::_errorHandler($xc);
        $success = FALSE;
        $messages[] = array(
          t('Failed to update filter \'!name\'.', array(
            '!name' => $filter_name,
          )),
          'warning',
        );
      }

      //  Change mode.
      if ($success) {
        $submitted['mode'] = $mode = 'stored';
      }
      else {
        $submitted['mode'] = $mode = 'default';
      }
    }

    //  Clear conditions and order_by from vars to be passed to session, unless adhoc filter.
    if ($mode != 'adhoc') {
      unset($submitted['conditions'], $submitted['order_by']);
    }

    //  Pass to session.
    $session = array(
      'settings' => $settings,
      'submitted' => $submitted,
    );
    if ($messages) {
      $session['messages'] = $messages;
    }
    if (module_exists('state')) {
      State::sessionSet('module', 'log_filter', $session);
    }
    else {
      drupal_session_start();
      if (!isset($_SESSION['module'])) {
        $_SESSION['module'] = array(
          'log_filter' => $session,
        );
      }
      else {
        $_SESSION['module']['log_filter'] = $session;
      }
    }
  } catch (Exception $xc) {
    self::_errorHandler($xc);
    drupal_set_message($xc
      ->getMessage(), 'error');
  }
}