From e016b4a7f688944d7d8ae724cfdc43330904d335 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tadej=20Ba=C5=A1a?= <tadej.basa@gmail.com>
Date: Fri, 24 Aug 2012 17:30:24 +0200
Subject: [PATCH] 767894 - Add a confirm form for feed delete

---
 core/modules/aggregator/aggregator.admin.inc       |   62 ++++++++++++++------
 core/modules/aggregator/aggregator.module          |    8 +++
 .../Drupal/aggregator/Tests/AggregatorTestBase.php |    1 +
 3 files changed, 52 insertions(+), 19 deletions(-)

diff --git a/core/modules/aggregator/aggregator.admin.inc b/core/modules/aggregator/aggregator.admin.inc
index 718e79c..b1d22c6 100644
--- a/core/modules/aggregator/aggregator.admin.inc
+++ b/core/modules/aggregator/aggregator.admin.inc
@@ -68,6 +68,7 @@ function aggregator_view() {
  * @see aggregator_menu()
  * @see aggregator_form_feed_validate()
  * @see aggregator_form_feed_submit()
+ * @see aggregator_form_feed_delete_submit()
  */
 function aggregator_form_feed($form, &$form_state, stdClass $feed = NULL) {
   $period = drupal_map_assoc(array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval');
@@ -129,6 +130,7 @@ function aggregator_form_feed($form, &$form_state, stdClass $feed = NULL) {
     $form['actions']['delete'] = array(
       '#type' => 'submit',
       '#value' => t('Delete'),
+      '#submit' => array('aggregator_form_feed_delete_submit'),
     );
     $form['fid'] = array(
       '#type' => 'hidden',
@@ -168,14 +170,8 @@ function aggregator_form_feed_validate($form, &$form_state) {
  * Form submission handler for aggregator_form_feed().
  *
  * @see aggregator_form_feed_validate()
- * @todo Add delete confirmation dialog.
  */
 function aggregator_form_feed_submit($form, &$form_state) {
-  if ($form_state['values']['op'] == t('Delete')) {
-    $title = $form_state['values']['title'];
-    // Unset the title.
-    unset($form_state['values']['title']);
-  }
   aggregator_save_feed($form_state['values']);
   if (isset($form_state['values']['fid'])) {
     if (isset($form_state['values']['title'])) {
@@ -189,26 +185,54 @@ function aggregator_form_feed_submit($form, &$form_state) {
         return;
       }
     }
-    else {
-      watchdog('aggregator', 'Feed %feed deleted.', array('%feed' => $title));
-      drupal_set_message(t('The feed %feed has been deleted.', array('%feed' => $title)));
-      if (arg(0) == 'admin') {
-        $form_state['redirect'] = 'admin/config/services/aggregator/';
-        return;
-      }
-      else {
-        $form_state['redirect'] = 'aggregator/sources/';
-        return;
-      }
-    }
   }
   else {
-    watchdog('aggregator', 'Feed %feed added.', array('%feed' => $form_state['values']['title']), WATCHDOG_NOTICE, l(t('view'), 'admin/config/services/aggregator'));
+    watchdog('aggregator', 'Feed %feed added.', array('%feed' => $form_state['values']['title']), WATCHDOG_NOTICE, l('view', 'admin/config/services/aggregator'));
     drupal_set_message(t('The feed %feed has been added.', array('%feed' => $form_state['values']['title'])));
   }
 }
 
 /**
+ * Form submit handler for the aggregator_form_feed() form.
+ */
+function aggregator_form_feed_delete_submit($form, &$form_state) {
+  $form_state['redirect'] = 'admin/config/services/aggregator/delete/feed/' . $form_state['values']['fid'];
+}
+
+/**
+ * Form to confirm feed delete operation.
+ */
+function aggregator_form_feed_delete_confirm($form, &$form_state, $feed) {
+  return confirm_form(
+    array(
+      'fid' => array(
+        '#type' => 'value',
+        '#value' => $feed->fid,
+      ),
+    ),
+    t('Are you sure you want to delete the feed %name ?', array('%name' => $feed->title)),
+    user_access('administer news feeds') ? 'admin/config/services/aggregator' : 'aggregator/sources',
+    t('This action cannot be undone.'),
+    t('Delete'),
+    t('Cancel')
+  );
+}
+
+/**
+ * Form submit handler for aggregator_form_feed_delete_confirm().
+ */
+function aggregator_form_feed_delete_confirm_submit($form, &$form_state) {
+  $feed = (array) aggregator_feed_load($form_state['values']['fid']);
+  $title = $feed['title'];
+  // Unset the title.
+  unset($feed['title']);
+  aggregator_save_feed($feed);
+  watchdog('aggregator', 'Feed %feed deleted.', array('%feed' => $title));
+  drupal_set_message(t('The feed %feed has been deleted.', array('%feed' => $title)));
+  $form_state['redirect'] = user_access('administer news feeds') ? 'admin/config/services/aggregator/' : 'aggregator/sources/';
+}
+
+/**
  * Page callback: Deletes a feed.
  *
  * @param $feed
diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index 047026a..42932b1 100644
--- a/core/modules/aggregator/aggregator.module
+++ b/core/modules/aggregator/aggregator.module
@@ -255,6 +255,14 @@ function aggregator_menu() {
     'access arguments' => array('administer news feeds'),
     'file' => 'aggregator.admin.inc',
   );
+  $items['admin/config/services/aggregator/delete/feed/%aggregator_feed'] = array(
+    'title' => 'Delete feed',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_form_feed_delete_confirm', 6),
+    'access arguments' => array('administer news feeds'),
+    'type' => MENU_CALLBACK,
+    'file' => 'aggregator.admin.inc',
+  );
   $items['admin/config/services/aggregator/edit/category/%aggregator_category'] = array(
     'title' => 'Edit category',
     'page callback' => 'drupal_get_form',
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php
index 74e0b44..43eef47 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php
@@ -61,6 +61,7 @@ abstract class AggregatorTestBase extends WebTestBase {
    */
   function deleteFeed($feed) {
     $this->drupalPost('admin/config/services/aggregator/edit/feed/' . $feed->fid, array(), t('Delete'));
+    $this->drupalPost(NULL, array(), t('Delete'));
     $this->assertRaw(t('The feed %title has been deleted.', array('%title' => $feed->title)), t('Feed deleted successfully.'));
   }
 
-- 
1.7.9.5

