mollom_test.module 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <?php
  2. /**
  3. * @file
  4. * Testing functionality for Mollom module.
  5. */
  6. /**
  7. * Implements hook_entity_info().
  8. */
  9. function mollom_test_entity_info() {
  10. $info['mollom_test'] = array(
  11. 'label' => 'Mollom test record',
  12. 'base table' => 'mollom_test',
  13. 'uri callback' => 'mollom_test_uri',
  14. 'entity keys' => array(
  15. 'id' => 'mid',
  16. 'label' => 'title',
  17. ),
  18. );
  19. return $info;
  20. }
  21. /**
  22. * Entity URI callback.
  23. */
  24. function mollom_test_uri($record) {
  25. return array(
  26. 'path' => 'mollom-test/form/' . $record->mid,
  27. );
  28. }
  29. /**
  30. * Implements hook_menu().
  31. */
  32. function mollom_test_menu() {
  33. $items['mollom-test/form'] = array(
  34. 'title' => 'Mollom test form',
  35. 'page callback' => 'drupal_get_form',
  36. 'page arguments' => array('mollom_test_form'),
  37. 'access callback' => TRUE,
  38. );
  39. $items['mollom-test/form/%mollom_test/delete'] = array(
  40. 'title' => 'Delete Mollom test item',
  41. 'page callback' => 'drupal_get_form',
  42. 'page arguments' => array('mollom_test_delete_form', 2),
  43. 'access callback' => TRUE,
  44. );
  45. $items['mollom-test/form/views/reset'] = array(
  46. 'page callback' => 'mollom_test_views_reset',
  47. 'access callback' => TRUE,
  48. 'type' => MENU_CALLBACK,
  49. );
  50. return $items;
  51. }
  52. /**
  53. * Implements hook_forms().
  54. */
  55. function mollom_forms() {
  56. $forms['mollom_basic_test_form'] = array(
  57. 'callback' => 'mollom_test_form',
  58. );
  59. return $forms;
  60. }
  61. /**
  62. * Implements hook_mollom_form_list().
  63. */
  64. function mollom_test_mollom_form_list() {
  65. $forms['mollom_test_form'] = array(
  66. 'title' => 'Mollom test form',
  67. 'entity' => 'mollom_test',
  68. 'moderation callback' => 'mollom_test_mollom_form_moderation',
  69. 'delete form' => 'mollom_test_delete_form',
  70. );
  71. // The basic test form is identical to the mollom_test_form, but only
  72. // registers minimal information (e.g., no entity or moderation callback) to
  73. // integrate with Mollom.
  74. $forms['mollom_basic_test_form'] = array(
  75. 'title' => 'Mollom basic test form',
  76. );
  77. // Same as above, but supports elements for text analysis.
  78. $forms['mollom_basic_elements_test_form'] = array(
  79. 'title' => 'Mollom basic elements test form',
  80. );
  81. // Same as mollom_test_form, but supports an entity delete callback.
  82. $forms['mollom_entity_test_form'] = array(
  83. 'title' => 'Mollom entity test form',
  84. 'entity' => 'mollom_test',
  85. 'entity delete callback' => 'mollom_test_delete',
  86. );
  87. return $forms;
  88. }
  89. /**
  90. * Implements hook_mollom_form_info().
  91. */
  92. function mollom_test_mollom_form_info($form_id) {
  93. if ($form_id == 'mollom_basic_test_form') {
  94. return array();
  95. }
  96. $form_info = array(
  97. 'bypass access' => array('administer mollom'),
  98. 'elements' => array(
  99. 'title' => 'Title',
  100. 'body' => 'Body',
  101. 'exclude' => 'Some other field',
  102. 'parent][child' => 'Nested element',
  103. 'field' => 'Multiple value field',
  104. ),
  105. 'mapping' => array(
  106. 'post_id' => 'mid',
  107. 'post_title' => 'title',
  108. 'author_name' => 'name',
  109. ),
  110. );
  111. return $form_info;
  112. }
  113. /**
  114. * Page callback; Resets the mollom_test_form() [page] view counter.
  115. */
  116. function mollom_test_views_reset() {
  117. variable_del('mollom_test.form.views');
  118. cache_clear_all();
  119. drupal_goto();
  120. }
  121. /**
  122. * Form builder for Mollom test form.
  123. */
  124. function mollom_test_form($form, &$form_state, $mid = NULL) {
  125. // Due to #limit_validation_errors, submitting the form with the "Add" button
  126. // will only expose validated values in the submit handler, so our storage may
  127. // be incomplete. Therefore, the default values always have to be overloaded.
  128. $form_state += array('storage' => array());
  129. if (isset($mid) && ($record = mollom_test_load($mid))) {
  130. $form_state['storage'] = (array) $record;
  131. }
  132. $form_state['storage'] += array(
  133. 'mid' => $mid,
  134. 'title' => '',
  135. 'body' => '',
  136. 'exclude' => '',
  137. 'parent' => array('child' => ''),
  138. 'field' => array(),
  139. 'status' => 1,
  140. );
  141. // Always add an empty field the user can submit.
  142. $form_state['storage']['field']['new'] = '';
  143. // Output a page view counter for page/form cache testing purposes.
  144. $count = variable_get('mollom_test.form.views', 1);
  145. $reset_link = l('Reset', 'mollom-test/form/views/reset', array('query' => drupal_get_destination()));
  146. $form['views'] = array(
  147. '#markup' => '<p>' . 'Views: ' . $count++ . ' ' . $reset_link . '</p>',
  148. );
  149. variable_set('mollom_test.form.views', $count);
  150. // Conditionally enable form caching.
  151. if (variable_get('mollom_test.form.cache', FALSE)) {
  152. $form_state['cache'] = TRUE;
  153. }
  154. $form['#tree'] = TRUE;
  155. $form['mid'] = array(
  156. '#type' => 'hidden',
  157. '#value' => $form_state['storage']['mid'],
  158. );
  159. $form['title'] = array(
  160. '#type' => 'textfield',
  161. '#title' => 'Title',
  162. '#default_value' => $form_state['storage']['title'],
  163. '#required' => TRUE,
  164. );
  165. $form['body'] = array(
  166. '#type' => 'textfield',
  167. '#title' => 'Body',
  168. '#default_value' => $form_state['storage']['body'],
  169. );
  170. $form['exclude'] = array(
  171. '#type' => 'textfield',
  172. '#title' => 'Some other field',
  173. '#default_value' => $form_state['storage']['exclude'],
  174. );
  175. $form['parent']['child'] = array(
  176. '#type' => 'textfield',
  177. '#title' => 'Nested element',
  178. '#default_value' => $form_state['storage']['parent']['child'],
  179. );
  180. $form['field'] = array(
  181. '#type' => 'fieldset',
  182. '#title' => 'Field',
  183. );
  184. $weight = 0;
  185. foreach ($form_state['storage']['field'] as $delta => $value) {
  186. $form['field'][$delta] = array(
  187. '#type' => 'textfield',
  188. '#title' => 'Field ' . $delta,
  189. '#default_value' => $value,
  190. '#weight' => $weight++,
  191. );
  192. }
  193. $form['field']['new']['#weight'] = 999;
  194. $form['field']['submit'] = array(
  195. '#type' => 'submit',
  196. '#value' => 'Add',
  197. '#limit_validation_errors' => array(array('field')),
  198. '#submit' => array('mollom_test_form_field_submit'),
  199. '#weight' => 1000,
  200. );
  201. $form['status'] = array(
  202. '#type' => 'checkbox',
  203. '#title' => 'Published',
  204. '#default_value' => $form_state['storage']['status'],
  205. // For simplicity, re-use Mollom module's administration permission.
  206. '#access' => user_access('administer mollom'),
  207. );
  208. $form['actions'] = array('#type' => 'actions');
  209. $form['actions']['submit'] = array('#type' => 'submit', '#value' => 'Submit');
  210. return $form;
  211. }
  212. /**
  213. * Form element submit handler for mollom_test_form().
  214. */
  215. function mollom_test_form_field_submit($form, &$form_state) {
  216. // Remove internal Form API values.
  217. form_state_values_clean($form_state);
  218. // Remove all empty values of the multiple value field.
  219. $form_state['values']['field'] = array_filter($form_state['values']['field']);
  220. // Update the storage with submitted values.
  221. $form_state['storage'] = $form_state['values'];
  222. // Store the new value and clear out the 'new' field.
  223. if (isset($form_state['values']['field']['new'])) {
  224. $form_state['storage']['field'][] = $form_state['values']['field']['new'];
  225. }
  226. unset($form_state['input']['field']['new']);
  227. $form_state['rebuild'] = TRUE;
  228. }
  229. /**
  230. * Form submit handler for mollom_test_form().
  231. */
  232. function mollom_test_form_submit($form, &$form_state) {
  233. $form_state['values']['field'][] = $form_state['values']['field']['new'];
  234. unset($form_state['values']['field']['new']);
  235. // Store submission.
  236. form_state_values_clean($form_state);
  237. $record = (object) $form_state['values'];
  238. mollom_test_save($record);
  239. $form_state['values']['mid'] = $record->mid;
  240. // Redirect to stored entry.
  241. $form_state['redirect'] = 'mollom-test/form/' . $record->mid;
  242. drupal_set_message('Successful form submission.');
  243. drupal_set_message('<pre>' . var_export($record, TRUE) . '</pre>');
  244. }
  245. /**
  246. * Implements hook_form_alter().
  247. */
  248. function mollom_test_form_alter(&$form, &$form_state, $form_id) {
  249. if (variable_get('mollom_test.disable_mollom', FALSE)) {
  250. $form_state['mollom']['require_analysis'] = FALSE;
  251. $form_state['mollom']['require_captcha'] = FALSE;
  252. }
  253. }
  254. /**
  255. * Mollom form moderation callback for a mollom_test record.
  256. */
  257. function mollom_test_mollom_form_moderation(&$form, &$form_state) {
  258. $form_state['values']['status'] = 0;
  259. }
  260. /**
  261. * Loads a {mollom_test} data record by id.
  262. */
  263. function mollom_test_load($mid) {
  264. return db_query('SELECT * FROM {mollom_test} WHERE mid = :mid', array(':mid' => $mid))->fetch();
  265. }
  266. /**
  267. * Saves a {mollom_test} data record.
  268. */
  269. function mollom_test_save($record) {
  270. // Load the stored entity, if any.
  271. if (!empty($record->mid) && !isset($record->original)) {
  272. $record->original = entity_load_unchanged('mollom_test', $record->mid);
  273. }
  274. $update = !empty($record->mid) ? array('mid') : array();
  275. $status = drupal_write_record('mollom_test', $record, $update);
  276. if ($status === SAVED_NEW) {
  277. module_invoke_all('mollom_test_insert', $record);
  278. module_invoke_all('entity_insert', $record, 'mollom_test');
  279. }
  280. else {
  281. $status = SAVED_UPDATED;
  282. module_invoke_all('mollom_test_update', $record);
  283. module_invoke_all('entity_update', $record, 'mollom_test');
  284. }
  285. return $status;
  286. }
  287. /**
  288. * Deletes a {mollom_test} data record.
  289. *
  290. * @param int $mid
  291. * The mid to delete.
  292. */
  293. function mollom_test_delete($mid) {
  294. $record = mollom_test_load($mid);
  295. if ($record) {
  296. module_invoke_all('entity_delete', $record, 'mollom_test');
  297. }
  298. db_delete('mollom_test')
  299. ->condition('mid', $mid)
  300. ->execute();
  301. }
  302. /**
  303. * Form constructor for deleting a Mollom test item.
  304. */
  305. function mollom_test_delete_form($form, &$form_state, $record) {
  306. $form['mid'] = array('#type' => 'value', '#value' => $record->mid);
  307. return confirm_form($form,
  308. t('Are you sure you want to delete the %title?', array('%title' => $record->title)),
  309. 'mollom-test/form/' . $record->mid,
  310. NULL,
  311. t('Delete')
  312. );
  313. }
  314. /**
  315. * Form submission handler for mollom_test_delete_form().
  316. */
  317. function mollom_test_delete_form_submit($form, &$form_state) {
  318. mollom_test_delete($form_state['values']['mid']);
  319. drupal_set_message('The record has been deleted.');
  320. $form_state['redirect'] = 'mollom-test/form';
  321. }