Thursday 2 April 2015

Drupal 7 - Adding a Delete Button to open in Modal PopUp

The task here was to add to existing code ; where we where adding a delete button like those being called in an already existing module.

The task check list. 
1. Find a delete Quiz result function in the Quiz module.   If there isn’t one this will need to be created. 

2. Create menu callback for modal form. 

3. Set in hook_menu

4. Write an access rule for this . 

5. Call up in View. 




1.  There was no Delete form so lets create one in modules/custom/rcni_saqs/includes/form.inc 

[code]

/**
 * @file
 * Custom forms.
 */

/**
 * Form builder.
 *
 * @param array $form
 *   An associative array containing the structure of the form.
 * @param array $form_state
 *   An array which stores information about the form.
 *
 * @return array
 *   Completed form array.
*/
function rcni_custom_delete_form($form, &$form_state, $quiz, $quiz_result_id) {
  $quiz_result = quiz_result_load($quiz_result_id);

  if (!$quiz_result) {
    return array('error' => array('#markup' => 'Could not find quiz result.'));
  }

  $form['quiz_result'] = array(
    '#type' => 'value',
    '#value' => $quiz_result,
  );

  try {
    $w_quiz = entity_metadata_wrapper('node', $quiz);
    $quiz_title = $w_quiz->label();
  }
  catch (EntityMetadataWrapperException $e) {
    watchdog_exception(‘my_custom', $e);
    $quiz_title = '';
  }

  $message = t("Are you sure that you want to delete your answers for %quiz_title?",
    array("%quiz_title" => $quiz_title));

  try {
    $w_quiz_result = entity_metadata_wrapper('quiz_result', $quiz_result);
    $redirect = "portfolio/portfolio/{$w_quiz_result->field_custom_field->raw()}";
  }
  catch (EntityMetadataWrapperException $e) {
    watchdog_exception(‘my_custom', $e);
    $redirect = 'eportfolio';
  }

  $form['submit_redirect'] = array(
    '#type' => 'value',
    '#value' => $redirect,
  );

  $caption = t("This action cannot be undone.");

  return confirm_form($form, $message, $redirect, $caption, t('Delete'));
}

/**
 * Form submit handler.
 *
 * @param array $form
 *   An associative array containing the structure of the form.
 * @param array $form_state
 *   An array which stores information about the form.
 */
function my_custom_delete_form_submit($form, &$form_state) {
  quiz_delete_results(array($form_state['values']['quiz_result']->result_id));
  $form_state['redirect'] = $form_state['values']['submit_redirect'];
}

[/code]


2.  Lets add that callback now to /cutom/rcni_modal/includes/saqs.inc

/**
 * @file
 * Modal form wrappers for SAQs.
 */

/**
 * CTools modal form wrapper function.
 *
 * @param object $quiz
 *   The quiz node the results belong to.
 * @param int $quiz_result_id
 *   The rid of the quiz result we're deleting.
 * @param bool $js
 *   Whether javascript is enabled.
 * @param bool $refresh
 *   Whether to refresh the base page on form submission.
 */
function my_modal_custom_delete_form_modal_callback($quiz, $quiz_result_id, $js = FALSE, $refresh = TRUE) {
  if (!$js) {
    if ($quiz_result = quiz_result_load($quiz_result_id)) {
      $portfolio_id = rcni_modal_get_parent_portfolio_id($quiz_result);
      $options = $portfolio_id ? array('query' => array('destination' => "portfolio/portfolio/{$portfolio_id}")) : array();
      drupal_goto("node/{$quiz->nid}/quiz-results/{$quiz_result_id}/delete", $options);
    }
    else {
      drupal_goto("eportfolio");
    }
  }
  else {
    $form_state = array(
      'ajax' => TRUE,
      'build_info' => array(
        'args' => array(
          $quiz->nid,
          $quiz_result_id,
        ),
      ),
      'rcni_modal' => TRUE,
    );

    $form_id = ‘my_custom_delete_form';
    form_load_include($form_state, 'inc', ‘my_custom', 'includes/form');
    my_modal_custom_form_modal_callback($form_id, $form_state, $refresh);
  }
}

3.  Build the menu item that it gets sent to. 


/**
 * Implements hook_menu().
 */
function my_modal_menu() {
  $items = array();

  $items['node/%quiz_menu/quiz-results/%quiz_rid/delete'] = array(
    'title' => 'Delete answers',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('rcni_saqs_delete_form', 1, 3),
    'access callback' => 'rcni_saqs_quiz_result_delete_access',
    'access arguments' => array(3),
    'file' => 'includes/form.inc',
  );

  return $items;
}


4.  The Access rule. 

/**
 * Access callback for deleting a quiz.
 *
 * @return bool
 *   True if user can delete quiz result.
 */
function rcni_saqs_quiz_result_delete_access($result_id) {
  if (user_access('delete any quiz results')) {
    return TRUE;
  }

  global $user;
  $quiz_result = quiz_result_load($result_id);

  if (!$quiz_result) {
    return FALSE;
  }

  return user_access('delete results for own quiz') && $user->uid == $quiz_result->uid;
}

5. 

[code]
.


[/code]

No comments: