You are here

casetracker_project.inc in Case Tracker 7.2

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

File

casetracker_project.inc
View source
<?php

/**
 *
 * @file This file concentrates all general functionality related to Projects 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_project.
 *
 * @param $op
 *   The operation being performed. One of 'view', 'update', 'create', 'delete'
 *   or just 'edit' (being the same as 'create' or 'update').
 * @param $project
 *   Optionally a casetracker_project or a casetracker_project type to check
 *   access for. If nothing is given, access for all casetracker_projects
 *   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_project_access($op, $project = NULL, $account = NULL) {
  if (user_access('administer casetracker_projects', $account)) {
    return TRUE;
  }
  if (isset($project) && is_object($project) && ($type_name = $project->type)) {
    $op = $op == 'view' ? 'view' : 'edit';
    if (user_access("{$op} any {$type_name} casetracker_project", $account)) {
      return TRUE;
    }
  }
  return FALSE;
}

/**
 * Gets an array of all casetracker_project types, keyed by the type name.
 *
 * @param $type_name
 *   If set, the type with the given name is returned.
 * @return CaseTrackerProjectType[]
 *   Depending whether $type isset, an array of casetracker_project types or
 *   a single one.
 */
function casetracker_project_get_types($type_name = NULL) {

  // entity_load will get the Entity controller for our casetracker_project entity
  // and call the load function of that object - we are loading entities by name here.
  $types = entity_load_multiple_by_name('casetracker_project_type', isset($type_name) ? array(
    $type_name,
  ) : FALSE);
  return isset($type_name) ? reset($types) : $types;
}

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

/**
 * Load multiple casetracker_projects based on certain conditions.
 *
 * @param $pids
 *   An array of project IDs.
 * @param $conditions
 *   An array of conditions to match against the {casetracker_project} table.
 * @param $reset
 *   A boolean indicating that the internal cache should be reset.
 * @return
 *   An array of casetracker_project objects, indexed by pid.
 *
 * @see entity_load()
 * @see casetracker_project_load()
 */
function casetracker_project_load_multiple($pids = array(), $conditions = array(), $reset = FALSE) {
  return entity_load('casetracker_project', $pids, $conditions, $reset);
}

/**
 * Deletes a casetracker_project.
 */
function casetracker_project_delete(CaseTrackerProject $project) {
  $project
    ->delete();
}

/**
 * Delete multiple casetracker_projects.
 *
 * @param $pids
 *   An array of casetracker_project IDs.
 */
function casetracker_project_delete_multiple(array $pids) {
  entity_get_controller('casetracker_project')
    ->delete($pids);
}

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

/**
 * Saves a casetracker_project to the database.
 *
 * @param $casetracker_project
 *   The casetracker_project object.
 */
function casetracker_project_save(CaseTrackerProject $project) {
  return $project
    ->save();
}

/**
 * URI callback for casetracker_projects
 */
function casetracker_project_uri(CaseTrackerProject $project) {
  return $project
    ->defaultUri();
}

/**
 * Menu title callback for showing individual entities
 */
function casetracker_project_page_title(CaseTrackerProject $project) {
  return $project->title;
}
function _casetracker_project_get_amount() {
  return db_select('casetracker_project', 'p')
    ->fields('p')
    ->execute()
    ->rowCount();
}

/**
 * Sets up content to show an individual casetracker_project
 * @todo - get rid of drupal_set_title();
 */
function casetracker_project_page_view(CaseTrackerProject $project, $view_mode = 'full') {
  drupal_set_title($project->title);
  casetracker_project_set_breadcrumb();
  return entity_view('casetracker_project', array(
    $project->pid => $project,
  ), $view_mode, NULL, TRUE);
}

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

/**
 * Form callback wrapper: delete a casetracker_project.
 *
 * @param $project
 *   The casetracker_project object being edited by this form.
 *
 * @see casetracker_project_edit_form()
 */
function casetracker_project_delete_form_wrapper($project) {
  return drupal_get_form('casetracker_project_delete_form', $project);
}

/**
 * Form callback: create or edit a casetracker_project.
 *
 * @param $project
 *   The casetracker_project object to edit or for a create form an empty
 *   casetracker_project object with only a casetracker_project type defined.
 */
function casetracker_project_edit_form($form, &$form_state, $project) {
  casetracker_project_set_breadcrumb();
  if (!empty($project->pid)) {
    drupal_set_title(t('@project (editing project info)', array(
      '@project' => $project->title,
    )));
  }

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

  // Add the field related form elements.
  $form_state['casetracker_project'] = $project;
  field_attach_form('casetracker_project', $project, $form, $form_state);
  $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 project'),
    '#submit' => $submit + array(
      'casetracker_project_edit_form_submit',
    ),
  );

  /**
   * There is some bug that in this module code that makes the submit callback
   * being ignored
   */

  // Show Delete button if the project.is being edited
  //  if (!empty($project->pid) && casetracker_project_access('edit', $project)) {
  //    $form['actions']['delete'] = array(
  //      '#type' => 'submit',
  //      '#value' => t('Delete'),
  //      '#submit' => array('casetracker_project_form_submit_delete'),
  //    );
  //  }
  // We append the validate handler to #validate in case a form callback_wrapper
  // is used to add validate handlers earlier.
  $form['#validate'][] = 'casetracker_project_edit_form_validate';
  return $form;
}

/**
 * Form API validate callback for the casetracker_project form
 */
function casetracker_project_edit_form_validate(&$form, &$form_state) {
  $project = $form_state['casetracker_project'];

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

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

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

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

/**
 * Form callback: confirmation form for deleting a casetracker_project.
 *
 * @param $project
 *   The casetracker_project to delete
 *
 * @see confirm_form()
 */
function casetracker_project_delete_form($form, &$form_state, $project) {
  casetracker_project_set_breadcrumb();
  $form_state['casetracker_project'] = $project;
  $form['#submit'][] = 'casetracker_project_delete_form_submit';
  $form = confirm_form($form, t('Are you sure you want to delete project "@title"?', array(
    '@title' => $project->title,
  )), 'projects', '<p>' . t('This action cannot be undone.') . '</p>', t('Delete'), t('Cancel'), 'confirm');
  return $form;
}

/**
 * Submit callback for casetracker_project_delete_form
 */
function casetracker_project_delete_form_submit($form, &$form_state) {
  $project = $form_state['casetracker_project'];
  casetracker_project_delete($project);
  drupal_set_message(t('The project "%title" has been deleted.', array(
    '%title' => $project->title,
  )));
  watchdog('casetracker_project', 'Deleted project %title.', array(
    '%title' => $project->title,
  ));
}

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

/**
 * Displays the list of available casetracker_project types for casetracker_project creation.
 *
 * @ingroup themeable
 */
function theme_casetracker_project_add_list($variables) {
  $content = $variables['content'];
  $output = '';
  if ($content) {
    $output = '<dl class="casetracker-project-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_project types')) {
      $output = '<p>' . t('CaseTrackerProject Entities cannot be added because you have not created any casetracker_project types yet. Go to the <a href="@create-casetracker-project-type">casetracker_project type creation page</a> to add a new casetracker_project type.', array(
        '@create-casetracker-project-type' => url('admin/structure/casetracker/project-types/add'),
      )) . '</p>';
    }
    else {
      $output = '<p>' . t('No casetracker_project types have been created yet for you to use.') . '</p>';
    }
  }
  return $output;
}

/**
 * Sets the breadcrumb for administrative casetracker_project pages.
 */
function casetracker_project_set_breadcrumb($items = array()) {
  $breadcrumb = array();
  $breadcrumb[] = l(t('Home'), NULL);
  $breadcrumb[] = l(t('Projects'), 'projects');
  if (!empty($items)) {
    $breadcrumb += $items;
  }
  drupal_set_breadcrumb($breadcrumb);
}

Functions

Namesort descending Description
casetracker_project_access Determines whether the given user has access to a casetracker_project.
casetracker_project_add_page Page to add CaseTrackerProject Entities.
casetracker_project_create Create a casetracker_project object.
casetracker_project_delete Deletes a casetracker_project.
casetracker_project_delete_form Form callback: confirmation form for deleting a casetracker_project.
casetracker_project_delete_form_submit Submit callback for casetracker_project_delete_form
casetracker_project_delete_form_wrapper Form callback wrapper: delete a casetracker_project.
casetracker_project_delete_multiple Delete multiple casetracker_projects.
casetracker_project_edit_form Form callback: create or edit a casetracker_project.
casetracker_project_edit_form_submit Form API submit callback for the casetracker_project form.
casetracker_project_edit_form_validate Form API validate callback for the casetracker_project form
casetracker_project_form_submit_delete Form API submit callback for the delete button.
casetracker_project_form_wrapper Form callback wrapper: create or edit a casetracker_project.
casetracker_project_get_types Gets an array of all casetracker_project types, keyed by the type name.
casetracker_project_load Fetch a casetracker_project object. Make sure that the wildcard you choose in the casetracker_project entity definition fits the function name here.
casetracker_project_load_multiple Load multiple casetracker_projects based on certain conditions.
casetracker_project_page_title Menu title callback for showing individual entities
casetracker_project_page_view Sets up content to show an individual casetracker_project @todo - get rid of drupal_set_title();
casetracker_project_save Saves a casetracker_project to the database.
casetracker_project_set_breadcrumb Sets the breadcrumb for administrative casetracker_project pages.
casetracker_project_uri URI callback for casetracker_projects
theme_casetracker_project_add_list Displays the list of available casetracker_project types for casetracker_project creation.
_casetracker_project_get_amount