You are here

casetracker_case.inc in Case Tracker 7.2

This file concentrates all general functionality related to Cases in Case Tracker, leaving to the other files in /admin the stuff related to CRUD and structural configuration

File

casetracker_case.inc
View source
<?php

/**
 *
 * @file This file concentrates all general functionality related to Cases in
 * Case Tracker, leaving to the other files in /admin the stuff related to CRUD
 * and structural configuration
 */

/**
 * Determines whether the given user has access to a casetracker_case.
 *
 * @param $op
 *   The operation being performed. One of 'view', 'update', 'create', 'delete'
 *   or just 'edit' (being the same as 'create' or 'update').
 * @param $case
 *   Optionally a casetracker_case or a casetracker_case type to check
 *   access for. If nothing is given, access for all casetracker_cases
 *   is determined.
 * @param $account
 *   The user to check for. Leave it to NULL to check for the global user.
 * @return boolean
 *   Whether access is allowed or not.
 */
function casetracker_case_access($op, $case = NULL, $account = NULL) {
  if (user_access('administer casetracker_cases', $account)) {
    return TRUE;
  }
  if (isset($case) && is_object($case) && ($type_name = $case->type)) {
    $op = $op == 'view' ? 'view' : 'edit';
    if (user_access("{$op} any {$type_name} casetracker_case", $account)) {
      return TRUE;
    }
  }
  return FALSE;
}

/**
 * Fetch a casetracker_case object. Make sure that the wildcard you choose
 * in the casetracker_case entity definition fits the function name here.
 *
 * @param $cid
 *   Integer specifying the casetracker_case id.
 * @param $reset
 *   A boolean indicating that the internal cache should be reset.
 * @return
 *   A fully-loaded $case object or FALSE if it cannot be loaded.
 *
 * @see casetracker_case_load_multiple()
 */
function casetracker_case_load($cid, $reset = FALSE) {
  $cases = casetracker_case_load_multiple(array(
    $cid,
  ), array(), $reset);
  return reset($cases);
}

/**
 * Load multiple casetracker_cases based on certain conditions.
 *
 * @param $cids
 *   An array of case IDs.
 * @param $conditions
 *   An array of conditions to match against the {casetracker_case} table.
 * @param $reset
 *   A boolean indicating that the internal cache should be reset.
 * @return
 *   An array of casetracker_case objects, indexed by pid.
 *
 * @see entity_load()
 * @see casetracker_case_load()
 */
function casetracker_case_load_multiple($cids = array(), $conditions = array(), $reset = FALSE) {
  return entity_load('casetracker_case', $cids, $conditions, $reset);
}

/**
 * Deletes a casetracker_case.
 */
function casetracker_case_delete(CaseTrackerCase $case) {
  $case
    ->delete();
}

/**
 * Delete multiple casetracker_cases.
 *
 * @param $cids
 *   An array of casetracker_case IDs.
 */
function casetracker_case_delete_multiple(array $cids) {
  entity_get_controller('casetracker_case')
    ->delete($cids);
}

/**
 * Create a casetracker_case object.
 */
function casetracker_case_create($values = array()) {
  return entity_get_controller('casetracker_case')
    ->create($values);
}

/**
 * Saves a casetracker_case to the database.
 *
 * @param $casetracker_case
 *   The casetracker_case object.
 */
function casetracker_case_save(CaseTrackerCase $case) {
  return $case
    ->save();
}

/**
 * URI callback for casetracker_cases
 */
function casetracker_case_uri(CaseTrackerCase $case) {
  return $case
    ->defaultUri();
}

/**
 * Menu title callback for showing individual entities
 */
function casetracker_case_page_title(CaseTrackerCase $case) {
  return $case->title;
}

/**
 * Sets up content to show an individual casetracker_case
 * @todo - get rid of drupal_set_title();
 */
function casetracker_case_page_view(CaseTrackerCase $case, $view_mode = 'full') {
  drupal_set_title($case->title . ' (#ID ' . $case->cid . ')');
  $project_wrapper = casetracker_project_load($case->field_casetracker_project_ref[LANGUAGE_NONE][0]['target_id']);
  casetracker_case_set_breadcrumb(array(
    $project_wrapper->title,
  ));
  return entity_view('casetracker_case', array(
    $case->cid => $case,
  ), $view_mode, NULL, TRUE);
}

/**
 * Form callback wrapper: create or edit a casetracker_case.
 *
 * @param $casetracker_case
 *   The casetracker_case object being edited by this form.
 *
 * @see casetracker_case_edit_form()
 */
function casetracker_case_form_wrapper($case) {
  return drupal_get_form('casetracker_case_edit_form', $case);
}

/**
 * Form callback wrapper: delete a casetracker_case.
 *
 * @param $case
 *   The casetracker_case object being edited by this form.
 *
 * @see casetracker_case_edit_form()
 */
function casetracker_case_delete_form_wrapper($case) {

  // Add the breadcrumb for the form's location.

  //casetracker_case_set_breadcrumb();
  return drupal_get_form('casetracker_case_delete_form', $case);
}

/**
 * Form callback: create or edit a casetracker_case.
 *
 * @param $case
 *   The casetracker_case object to edit or for a create form an empty
 *   casetracker_case object with only a casetracker_case type defined.
 */
function casetracker_case_edit_form($form, &$form_state, $case) {
  $amount_of_projects = _casetracker_project_get_amount();
  if ($amount_of_projects == 0) {
    drupal_set_message(t('You need to have at least 1 project to relate your cases to. If you wish, you can go to the <a href="@link">projects creation page</a> now to create one.', array(
      '@link' => base_path() . 'admin/content/casetracker/projects/add',
    )), 'error');
  }
  casetracker_case_set_breadcrumb();
  if (!empty($case->cid)) {
    drupal_set_title(t('@case (editing case info)', array(
      '@case' => $case->title,
    )), PASS_THROUGH);
  }

  // Add the default field elements.
  $form['title'] = array(
    '#type' => 'textfield',
    '#title' => t('Title'),
    '#default_value' => isset($case->title) ? $case->title : '',
    '#maxlength' => 255,
    '#required' => TRUE,
    '#weight' => -25,
  );

  // Add the field related form elements.
  $form_state['casetracker_case'] = $case;
  field_attach_form('casetracker_case', $case, $form, $form_state);

  // If the entity is being created, try to prepopulate the project reference
  // from the URL argument
  if (isset($case->is_new) && $case->is_new) {

    // If the project was informed via URL argument, prepopulate the field
    $pid = arg(1);
    if (!empty($pid)) {
      $project = casetracker_project_load($pid);
      if ($project) {
        $case_wrapper = entity_metadata_wrapper('casetracker_case', $case);
        $casetracker_case_entity_info = $case_wrapper
          ->entityInfo();
        $selected_project = $project->title . ' (' . $pid . ')';
        $form['field_casetracker_project_ref']['und'][0]['target_id']['#default_value'] = $selected_project;
        drupal_set_title(t('Add @bundle to project "@title"', array(
          '@title' => $project->title,
          '@bundle' => $casetracker_case_entity_info['bundles'][$case->type]['label'],
        )));
      }
    }
  }
  $form['uid'] = array(
    '#type' => 'value',
    '#value' => $case->uid,
  );
  $form['actions'] = array(
    '#type' => 'container',
    '#attributes' => array(
      'class' => array(
        'form-actions',
      ),
    ),
    '#weight' => 400,
  );

  // We add the form's #submit array to this button along with the actual submit
  // handler to preserve any submit handlers added by a form callback_wrapper.
  $submit = array();
  if (!empty($form['#submit'])) {
    $submit += $form['#submit'];
  }
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save case'),
    '#submit' => $submit + array(
      'casetracker_case_edit_form_submit',
    ),
  );

  // We append the validate handler to #validate in case a form callback_wrapper
  // is used to add validate handlers earlier.
  $form['#validate'][] = 'casetracker_case_edit_form_validate';
  return $form;
}

/**
 * Form API validate callback for the casetracker_case form
 */
function casetracker_case_edit_form_validate(&$form, &$form_state) {
  $case = $form_state['casetracker_case'];

  // Notify field widgets to validate their data.
  field_attach_form_validate('casetracker_case', $case, $form, $form_state);
}

/**
 * Form API submit callback for the casetracker_case form.
 *
 * @todo remove hard-coded link
 */
function casetracker_case_edit_form_submit(&$form, &$form_state) {
  $case = entity_ui_controller('casetracker_case')
    ->entityFormSubmitBuildEntity($form, $form_state);
  if ($case->is_new = isset($case->is_new) ? $case->is_new : 0) {
    $case->created = time();
    global $user;
    $case->uid = $user->uid;
  }
  $case->changed = time();
  $case
    ->save();

  // Save the casetracker_case and go back to the list of casetracker_cases
  // Add in created and changed times.
  if ($case->is_new = isset($case->is_new) ? $case->is_new : 0) {
    drupal_set_message(t('The case "!title" was created successfully.', array(
      '!title' => l($case->title, 'casetracker/case/' . $case->cid),
    )));
  }
  else {
    drupal_set_message(t('The case "!title" was updated successfully.', array(
      '!title' => l($case->title, 'casetracker/case/' . $case->cid),
    )));
  }
}

/**
 * Form API submit callback for the delete button.
 *
 * @todo Remove hard-coded path
 */
function casetracker_case_form_submit_delete(&$form, &$form_state) {
  $form_state['redirect'] = 'casetracker/case/' . $form_state['casetracker_case']->pid . '/delete';
}

/**
 * Form callback: confirmation form for deleting a casetracker_case.
 *
 * @param $case
 *   The casetracker_case to delete
 *
 * @see confirm_form()
 */
function casetracker_case_delete_form($form, &$form_state, $case) {
  casetracker_case_set_breadcrumb();
  $form_state['casetracker_case'] = $case;
  $form['#submit'][] = 'casetracker_case_delete_form_submit';
  $form = confirm_form($form, t('Are you sure you want to delete case "@title"?', array(
    '@title' => $case->title,
  )), 'admin/content/casetracker/cases', '<p>' . t('This action cannot be undone.') . '</p>', t('Delete'), t('Cancel'), 'confirm');
  return $form;
}

/**
 * Submit callback for casetracker_case_delete_form
 */
function casetracker_case_delete_form_submit($form, &$form_state) {
  $case = $form_state['casetracker_case'];
  casetracker_case_delete($case);
  drupal_set_message(t('The case "%title" has been deleted.', array(
    '%title' => $case->title,
  )));
  watchdog('casetracker_case', 'Deleted case "%title".', array(
    '%title' => $case->title,
  ));
}

/**
 * Page to add CaseTrackerCase Entities.
 *
 * @todo Pass this through a proper theme function
 */
function casetracker_case_add_page() {
  $controller = entity_ui_controller('casetracker_case');
  return $controller
    ->addPage();
}

/**
 * Displays the list of available casetracker_case types for casetracker_case creation.
 *
 * @ingroup themeable
 */
function theme_casetracker_case_add_list($variables) {
  $content = $variables['content'];
  $output = '';
  if ($content) {
    $output = '<dl class="casetracker-case-type-list">';
    foreach ($content as $item) {
      $output .= '<dt>' . l($item['title'], $item['href']) . '</dt>';
      $output .= '<dd>' . filter_xss_admin($item['description']) . '</dd>';
    }
    $output .= '</dl>';
  }
  else {
    if (user_access('administer casetracker_case types')) {
      $output = '<p>' . t('CaseTrackerCase Entities cannot be added because you have not created any casetracker_case types yet. Go to the <a href="@create-casetracker-case-type">casetracker_case type creation page</a> to add a new casetracker_case type.', array(
        '@create-casetracker-case-type' => url('admin/structure/casetracker_case_types/add'),
      )) . '</p>';
    }
    else {
      $output = '<p>' . t('No casetracker_case types have been created yet for you to use.') . '</p>';
    }
  }
  return $output;
}

/**
 * Sets the breadcrumb for administrative casetracker_case pages.
 */
function casetracker_case_set_breadcrumb($items = array()) {
  $project = casetracker_project_load(arg(1));
  $breadcrumb = array();
  $breadcrumb[] = l(t('Home'), NULL);
  $breadcrumb[] = l(t('Projects'), 'projects');
  $breadcrumb[] = l($project->title, 'project/' . $project->pid);
  $breadcrumb[] = l(t('Cases'), 'project/' . $project->pid . '/cases');
  drupal_set_breadcrumb($breadcrumb);
}

Functions

Namesort descending Description
casetracker_case_access Determines whether the given user has access to a casetracker_case.
casetracker_case_add_page Page to add CaseTrackerCase Entities.
casetracker_case_create Create a casetracker_case object.
casetracker_case_delete Deletes a casetracker_case.
casetracker_case_delete_form Form callback: confirmation form for deleting a casetracker_case.
casetracker_case_delete_form_submit Submit callback for casetracker_case_delete_form
casetracker_case_delete_form_wrapper Form callback wrapper: delete a casetracker_case.
casetracker_case_delete_multiple Delete multiple casetracker_cases.
casetracker_case_edit_form Form callback: create or edit a casetracker_case.
casetracker_case_edit_form_submit Form API submit callback for the casetracker_case form.
casetracker_case_edit_form_validate Form API validate callback for the casetracker_case form
casetracker_case_form_submit_delete Form API submit callback for the delete button.
casetracker_case_form_wrapper Form callback wrapper: create or edit a casetracker_case.
casetracker_case_load Fetch a casetracker_case object. Make sure that the wildcard you choose in the casetracker_case entity definition fits the function name here.
casetracker_case_load_multiple Load multiple casetracker_cases based on certain conditions.
casetracker_case_page_title Menu title callback for showing individual entities
casetracker_case_page_view Sets up content to show an individual casetracker_case @todo - get rid of drupal_set_title();
casetracker_case_save Saves a casetracker_case to the database.
casetracker_case_set_breadcrumb Sets the breadcrumb for administrative casetracker_case pages.
casetracker_case_uri URI callback for casetracker_cases
theme_casetracker_case_add_list Displays the list of available casetracker_case types for casetracker_case creation.