From 3efada75785ac9b4317f95d59f67b57314ddefc7 Mon Sep 17 00:00:00 2001
From: Wong Hoi Sing Edison <hswong3i@gmail.com>
Date: Sat, 10 Aug 2013 22:43:45 +0800
Subject: [PATCH] Issue #2062235 by hswong3i: Split webform_node_types as
 content type specific.

---
 includes/webform.admin.inc                       |   19 +-----
 tests/webform.test                               |    3 +-
 views/webform_handler_field_submission_count.inc |    2 +-
 webform.install                                  |   16 ++++-
 webform.module                                   |   78 ++++++++++++----------
 5 files changed, 63 insertions(+), 55 deletions(-)

diff --git a/includes/webform.admin.inc b/includes/webform.admin.inc
index 7028d9d..5af87f5 100644
--- a/includes/webform.admin.inc
+++ b/includes/webform.admin.inc
@@ -11,15 +11,6 @@
 function webform_admin_settings() {
   module_load_include('inc', 'webform', 'includes/webform.export');
 
-  $node_types = node_type_get_names();
-  $form['node_types'] = array(
-    '#type' => 'checkboxes',
-    '#title' => t('Webform-enabled content types'),
-    '#description' => t('Webform allows you to enable the webform components for any content type.  Choose the types on which you would like to associate webform components.'),
-    '#options' => $node_types,
-    '#default_value' => webform_variable_get('webform_node_types'),
-  );
-
   $form['components'] = array(
     '#type' => 'fieldset',
     '#title' => t('Available components'),
@@ -198,7 +189,7 @@ function webform_admin_settings() {
     '#default_value' => variable_get('webform_submission_access_control', 1),
     '#description' => t('By default, the configuration form for each webform allows the administrator to choose which roles may submit the form. You may want to allow users to always submit the form if you are using a separate node access module to control access to webform nodes themselves.'),
   );
- 
+
   $form['advanced']['webform_email_select_max'] = array(
     '#type' => 'textfield',
     '#title' => t("Select email mapping limit"),
@@ -227,10 +218,6 @@ function webform_admin_settings_submit($form, &$form_state) {
   $form_state['values']['webform_disabled_components'] = $disabled_components;
   unset($form_state['values']['components']);
 
-  // Change the name of the node type variable and clean it up.
-  $form_state['values']['webform_node_types'] = array_keys(array_filter($form_state['values']['node_types']));
-  unset($form_state['values']['node_types']);
-
   // Trim out empty options in the progress bar options.
   $form_state['values']['webform_progressbar_style'] = array_keys(array_filter($form_state['values']['webform_progressbar_style']));
 }
@@ -278,7 +265,7 @@ function webform_admin_content() {
  * Create a comma-separate list of content types that are webform enabled.
  */
 function webform_admin_type_list() {
-  $webform_types = webform_variable_get('webform_node_types');
+  $webform_types = webform_node_types();
   $webform_type_list = '';
   $webform_type_count = count($webform_types);
   foreach ($webform_types as $n => $type) {
@@ -320,7 +307,7 @@ function theme_webform_admin_content($variables) {
   }
 
   if (empty($rows)) {
-    $webform_types = webform_variable_get('webform_node_types');
+    $webform_types = webform_node_types();
     if (empty($webform_types)) {
       $message = t('Webform is currently not enabled on any content types.') . ' ' . t('Visit the <a href="!url">Webform settings</a> page and enable Webform on at least one content type.', array('!url' => url('admin/config/content/webform')));
     }
diff --git a/tests/webform.test b/tests/webform.test
index ddc5a7e..15df33b 100644
--- a/tests/webform.test
+++ b/tests/webform.test
@@ -1029,7 +1029,8 @@ class WebformGeneralTestCase extends WebformTestCase {
    */
   function testWebformCreateNewType() {
     // Enable webforms on the page content type.
-    variable_set('webform_node_types', array('webform', 'page'));
+    variable_set('webform_node_webform', TRUE);
+    variable_set('webform_node_page', TRUE);
 
     $settings = array(
       'title' => 'Test webform-enabled page',
diff --git a/views/webform_handler_field_submission_count.inc b/views/webform_handler_field_submission_count.inc
index ea988f5..bd6b8d4 100644
--- a/views/webform_handler_field_submission_count.inc
+++ b/views/webform_handler_field_submission_count.inc
@@ -37,7 +37,7 @@ class webform_handler_field_submission_count extends views_handler_field {
     global $user;
 
     $output = NULL;
-    if ($this->count_type == 'node' && in_array($values->{$this->aliases['type']}, webform_variable_get('webform_node_types'))) {
+    if ($this->count_type == 'node' && variable_get('webform_node_' . $values->{$this->aliases['type']}, FALSE)) {
       module_load_include('inc', 'webform', 'includes/webform.submissions');
       $node = node_load($values->{$this->aliases['nid']});
       if (webform_results_access($node, $user)) {
diff --git a/webform.install b/webform.install
index 2ab5b2e..52babc2 100644
--- a/webform.install
+++ b/webform.install
@@ -612,7 +612,6 @@ function webform_install() {
  */
 function webform_uninstall() {
   // Unset webform variables.
-  variable_del('webform_node_types');
   variable_del('webform_node_types_primary');
   variable_del('webform_disabled_components');
   variable_del('webform_tracking_mode');
@@ -636,6 +635,10 @@ function webform_uninstall() {
   variable_del('webform_progressbar_label_confirmation');
   variable_del('webform_excel_legacy_exporter');
 
+  foreach (node_type_get_names() as $type => $name) {
+    variable_del('webform_node_' . $type);
+  }
+
   $component_list = array();
   $path = drupal_get_path('module', 'webform') . '/components';
   $files = file_scan_directory($path, '/^.*\.inc$/');
@@ -1596,3 +1599,14 @@ function webform_update_7411(&$sandbox) {
     $sandbox['#finished'] = $sandbox['progress'] / $sandbox['max'];
   }
 }
+
+/**
+ * Split webform_node_types as content type specific.
+ */
+function webform_update_7412() {
+  $types = array_keys(array_filter(variable_get('webform_node_types', array('webform'))));
+  foreach ($types as $type) {
+    variable_set('webform_node_' . $type, TRUE);
+  }
+  variable_del('webform_node_types');
+}
diff --git a/webform.module b/webform.module
index 9a2f2fd..aa82ea4 100644
--- a/webform.module
+++ b/webform.module
@@ -427,7 +427,7 @@ function webform_menu_load($nid) {
     return FALSE;
   }
   $node = node_load($nid);
-  if (!isset($node->type) || !in_array($node->type, webform_variable_get('webform_node_types'))) {
+  if (!isset($node->type) || variable_get('webform_node_' . $node->type)) {
     return FALSE;
   }
   return $node;
@@ -1255,44 +1255,33 @@ function webform_file_download($uri) {
 }
 
 /**
- * Implements hook_node_type().
+ * Return all content type enabled with webform.
  *
- * Not a real hook in Drupal 7. Re-used for consistency with the D6 version.
+ * @return array
+ *   An array of node type names, keyed by the type.
  */
-function webform_node_type($op, $info) {
-  $webform_types = webform_variable_get('webform_node_types');
-  $affected_type = isset($info->old_type) ? $info->old_type : $info->type;
-  $key = array_search($affected_type, $webform_types);
-  if ($key !== FALSE) {
-    if ($op == 'update') {
-      $webform_types[$key] = $info->type;
-    }
-    if ($op == 'delete') {
-      unset($webform_types[$key]);
+function webform_node_types() {
+  $types = array();
+  foreach (node_type_get_names() as $type => $name) {
+    if (variable_get('linkchecker_scan_node_' . $type, FALSE)) {
+      $types[$type] = $type;
     }
-    variable_set('webform_node_types', $webform_types);
   }
-}
-
-/**
- * Implements hook_node_type_update().
- */
-function webform_node_type_update($info) {
-  webform_node_type('update', $info);
+  return $types;
 }
 
 /**
  * Implements hook_node_type_delete().
  */
 function webform_node_type_delete($info) {
-  webform_node_type('delete', $info);
+  variable_del('webform_node_' . $info->type);
 }
 
 /**
  * Implements hook_node_insert().
  */
 function webform_node_insert($node) {
-  if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
+  if (!variable_get('webform_node_' . $node->type)) {
     return;
   }
 
@@ -1354,7 +1343,7 @@ function webform_node_insert($node) {
  * Implements hook_node_update().
  */
 function webform_node_update($node) {
-  if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
+  if (!variable_get('webform_node_' . $node->type, FALSE)) {
     return;
   }
 
@@ -1461,7 +1450,7 @@ function webform_node_update($node) {
  * Implements hook_delete().
  */
 function webform_node_delete($node) {
-  if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
+  if (!variable_get('webform_node_' . $node->type)) {
     return;
   }
 
@@ -1523,8 +1512,7 @@ function webform_node_defaults() {
  * Implements hook_node_prepare().
  */
 function webform_node_prepare($node) {
-  $webform_types = webform_variable_get('webform_node_types');
-  if (in_array($node->type, $webform_types) && !isset($node->webform)) {
+  if (variable_get('webform_node_' . $node->type) && !isset($node->webform)) {
     $node->webform = webform_node_defaults();
   }
 }
@@ -1535,7 +1523,7 @@ function webform_node_prepare($node) {
  */
 function webform_node_load($nodes, $types) {
   // Quick check to see if we need to do anything at all for these nodes.
-  $webform_types = webform_variable_get('webform_node_types');
+  $webform_types = webform_node_types();
   if (count(array_intersect($types, $webform_types)) == 0) {
     return;
   }
@@ -1639,7 +1627,7 @@ function webform_node_load($nodes, $types) {
  */
 function webform_form_alter(&$form, $form_state, $form_id) {
   $matches = array();
-  if (isset($form['#node']->type) && $form_id == $form['#node']->type . '_node_form' && in_array($form['#node']->type, webform_variable_get('webform_node_types'))) {
+  if (isset($form['#node']->type) && $form_id == $form['#node']->type . '_node_form' && variable_get('webform_node_' . $form['#node']->type)) {
     $node = $form['#node'];
     // Preserve all Webform options currently set on the node.
     $form['webform'] = array(
@@ -1655,6 +1643,27 @@ function webform_form_alter(&$form, $form_state, $form_id) {
 }
 
 /**
+ * Implements hook_form_BASE_FORM_ID_alter().
+ */
+function webform_form_node_type_form_alter(&$form, $form_state) {
+  if (isset($form['type'])) {
+    $form['webform'] = array(
+      '#title' => t('Webform'),
+      '#type' => 'fieldset',
+      '#group' => 'additional_settings',
+      '#tree' => FALSE,
+    );
+    $form['webform']['webform_node'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Enable webform'),
+      '#description' => t('Webform allows you to enable the webform components for any content type. Check this box if you would like to associate webform components for this content type.'),
+      '#weight' => 10,
+      '#default_value' => variable_get('webform_node_' . $form['#node_type']->type, FALSE),
+    );
+  }
+}
+
+/**
  * Submit handler for the webform node form.
  *
  * Redirect the user to the components form on new node inserts. Note that this
@@ -1671,7 +1680,7 @@ function webform_form_submit($form, &$form_state) {
 function webform_node_view($node, $view_mode) {
   global $user;
 
-  if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
+  if (!variable_get('webform_node_' . $node->type, FALSE)) {
     return;
   }
 
@@ -1927,7 +1936,7 @@ function webform_mail($key, &$message, $params) {
  */
 function webform_block_info() {
   $blocks = array();
-  $webform_node_types = webform_variable_get('webform_node_types');
+  $webform_node_types = webform_node_types();
   if (!empty($webform_node_types)) {
     $query = db_select('webform', 'w')->fields('w')->fields('n', array('title'));
     $query->leftJoin('node', 'n', 'w.nid = n.nid');
@@ -3555,9 +3564,6 @@ function webform_variable_get($variable) {
     case 'webform_default_subject':
       $result = variable_get('webform_default_subject', t('Form submission from: [node:title]'));
       break;
-    case 'webform_node_types':
-      $result = variable_get('webform_node_types', array('webform'));
-      break;
     case 'webform_node_types_primary':
       $result = variable_get('webform_node_types_primary', array('webform'));
       break;
@@ -4184,7 +4190,7 @@ function webform_views_api() {
  */
 function webform_field_extra_fields() {
   $extra = array();
-  foreach (webform_variable_get('webform_node_types') as $type) {
+  foreach (webform_node_types() as $type) {
     $extra['node'][$type]['display']['webform'] = array(
       'label' => t('Webform'),
       'description' => t('Webform client form.'),
@@ -4199,7 +4205,7 @@ function webform_field_extra_fields() {
  */
 function webform_mollom_form_list() {
   $forms = array();
-  $webform_types = webform_variable_get('webform_node_types');
+  $webform_types = webform_node_types();
   if (empty($webform_types)) {
     return $forms;
   }
-- 
1.7.9.5

