--- riddler.module Fri Mar 28 13:41:48 2008 +++ riddler.module.new Thu Aug 14 14:01:52 2008 @@ -23,101 +23,162 @@ function riddler_help($section = 'admin/ /* Implementation of hook_perm */ -function riddler_perm () { - return array( - 'administer riddler', - ); +function riddler_perm() { + return array( + 'administer riddler', + ); } /* Implementation of hook_menu */ function riddler_menu($may_cache) { - $items = array(); - if ($may_cache) { - $access = user_access('administer riddler'); - $items[] = array( - 'path' => 'admin/user/captcha/riddler', - 'title' => t('Riddler'), - 'description' => t('Allows you to force a question to a number of forms to counter f.e. spammers.'), - 'callback' => 'drupal_get_form', - 'callback arguments' => array('riddler_settings'), - 'access' => $access, - 'type' => MENU_LOCAL_TASK - ); - } - return $items; + $items = array(); + if ($may_cache) { + $access = user_access('administer riddler'); + $items[] = array( + 'path' => 'admin/user/captcha/riddler', + 'title' => t('Riddler'), + 'description' => t('Allows you to force a question to a number of forms to counter f.e. spammers.'), + 'callback' => 'drupal_get_form', + 'callback arguments' => array('riddler_settings'), + 'access' => $access, + 'type' => MENU_LOCAL_TASK + ); + } + return $items; } /* Riddler settings form, called by drupal_get_form in menu */ function riddler_settings() { - $form['riddler_question'] = array( - '#type' => 'textfield', - '#title' => t('Question'), - '#description' => t('A question that you require anonymous users to answer'), - '#default_value' => variable_get("riddler_question", "Do you hate spam? (yes or no)"), - '#required' => TRUE, - ); - $form['riddler_answer'] = array( - '#type' => 'textfield', - '#title' => t('Answer'), - '#default_value' => variable_get("riddler_answer", "yes"), - '#description' => t('Answer to the above question. Answers are not case sensitive'), - '#required' => TRUE, - ); - $form['riddler_weight'] = array( - '#type' => 'select', - '#title' => t('Weight'), - '#default_value' => variable_get("riddler_weight", 0), - '#options' => drupal_map_assoc(range(-10,10)), - '#description' => t('Weight of the Riddler form element'), - '#required' => TRUE, - ); - - return system_settings_form($form); + $form['riddler_weight'] = array( + '#type' => 'select', + '#title' => t('Weight'), + '#default_value' => variable_get('riddler_weight', 0), + '#options' => drupal_map_assoc(range(-10, 10)), + '#description' => t('Weight of the Riddler form element'), + '#required' => TRUE, + ); + $form['riddler_groups'] = array( + '#type' => 'fieldset', + '#title' => t('Riddles'), + '#description' => t('If you need more riddles, just submit the form, 3 empty riddles will appear.'), + ); + $form['riddler_groups']['riddler_group_0'] = array( + '#type' => 'fieldset', + '#title' => t('Riddle !i', array('!i' => 1)), + '#description' => t('Empty question and answer to erase this group.'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ); + $form['riddler_groups']['riddler_group_0']['riddler_question_0'] = array( + '#type' => 'textfield', + '#title' => t('Question'), + '#description' => t('A question that you require anonymous users to answer'), + '#default_value' => variable_get('riddler_question_0', 'Do you hate spam? (yes or no)'), + '#required' => FALSE, + ); + $form['riddler_groups']['riddler_group_0']['riddler_answer_0'] = array( + '#type' => 'textfield', + '#title' => t('Answer'), + '#default_value' => variable_get('riddler_answer_0', 'yes'), + '#description' => t('Answer to the above question. Answers are not case sensitive'), + '#required' => FALSE, + ); + $number = variable_get('riddler_number', 1); + for ( $i=1; $i<$number + 3; $i++) { + $form['riddler_groups']['riddler_group_'. $i] = array( + '#type' => 'fieldset', + '#title' => t('Riddle !i', array('!i' => $i+1)), + '#description' => t('Empty question and answer to erase this group.'), + '#collapsible' => TRUE, + '#collapsed' => $i < $number, + ); + $form['riddler_groups']['riddler_group_'. $i]['riddler_question_'. $i] = array( + '#type' => 'textfield', + '#title' => t('Question'), + '#description' => t('A question that you require anonymous users to answer'), + '#default_value' => variable_get('riddler_question_'. $i, ''), + '#required' => FALSE, + ); + $form['riddler_groups']['riddler_group_'. $i]['riddler_answer_'. $i] = array( + '#type' => 'textfield', + '#title' => t('Answer'), + '#default_value' => variable_get('riddler_answer_'. $i, ''), + '#description' => t('Answer to the above question. Answers are not case sensitive'), + '#required' => FALSE, + ); + } + $form['#validate']['riddler_settings_validate'] = array(); + $form['#submit']['riddler_settings_submit'] = array(); + + return system_settings_form($form); +} + +/* Validating the settings form */ +function riddler_settings_validate($form_id, $form_values) { + $i = 0; + while (array_key_exists('riddler_question_'. $i, $form_values)) { + if ($form_values['riddler_question_'. $i] != '' && $form_values['riddler_answer_'. $i] == '') { + form_set_error('riddler_answer_'. $i, t('Group !i is incomplete (answer is missing).', array('!i' => $i+1))); + } + if ($form_values['riddler_question_'. $i] == '' && $form_values['riddler_answer_'. $i] != '') { + form_set_error('riddler_question_'. $i, t('Group !i is incomplete (question is missing).', array('!i' => $i+1))); + } + $i++; + } } /* Processing the settings form */ -/* -function riddler_settings_submit ($form_id, $form_values) { - variable_set("riddler_question", $form_values['question']); - variable_set("riddler_answer", $form_values['answer']); +function riddler_settings_submit($form_id, $form_values) { + variable_set('riddler_weight', $form_values['riddler_weight']); + $i = 0; + $number = 0; + while (array_key_exists('riddler_question_'. $i, $form_values)) { + if ($form_values['riddler_question_'. $i] != '') { + variable_set('riddler_question_'. $number, $form_values['riddler_question_'. $i]); + variable_set('riddler_answer_'. $number, $form_values['riddler_answer_'. $i]); + $number++; + } + $i++; + } + variable_set('riddler_number', $number); } -*/ + /* Captcha implementation of Riddler */ function riddler_captcha($op, $captcha_type='', $answer='') { - switch ($op) { - case 'list' : - return array("Riddler"); - break; - case 'generate' : - $result = array(); - if ($captcha_type == "Riddler") { - $result = riddler_form(); - } - return $result; - break; - // Answers changed to lowercase for case insensitivity - case 'preprocess' : - $answer_lo = strtolower($answer); - return $answer_lo; - break; - - } -} - -function riddler_form () { - $form['preprocess'] = TRUE; - $form['solution'] = (string)(strtolower(variable_get("riddler_answer", "yes"))); - $form['form']['captcha_response'] = array( - '#type' => 'textfield', - '#title' => variable_get("riddler_question", "Do you hate spam? (yes or no)"), - '#required' => TRUE, - '#description' => t('Security question, designed to stop automated spam bots'), - '#weight' => variable_get('riddler_weight', 0), - - ); - return $form; + switch ($op) { + case 'list' : + return array('Riddler'); + break; + case 'generate' : + $result = array(); + if ($captcha_type == 'Riddler') { + $result = riddler_form(); + } + return $result; + break; + // Answers changed to lowercase for case insensitivity + case 'preprocess' : + $answer_lo = strtolower($answer); + return $answer_lo; + break; + default: + break; + } +} + +function riddler_form() { + $i = rand(1, variable_get('riddler_number', 1)) - 1; + $form['preprocess'] = TRUE; + $form['solution'] = (string)(strtolower(variable_get('riddler_answer_'. $i, 'yes'))); + $form['form']['captcha_response'] = array( + '#type' => 'textfield', + '#title' => variable_get('riddler_question_'. $i, 'Do you hate spam? (yes or no)'), + '#required' => TRUE, + '#weight' => variable_get('riddler_weight', 0), + ); + return $form; }