webform.views.inc 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  1. <?php
  2. /**
  3. * @file
  4. * Views hooks implemented for the Webform module.
  5. */
  6. /**
  7. * Implements hook_views_data().
  8. */
  9. function webform_views_data() {
  10. // Webform table definitions.
  11. $data['webform']['table']['group'] = t('Webform');
  12. $data['webform']['table']['base'] = array(
  13. 'field' => 'nid',
  14. 'title' => t('Webform nodes'),
  15. 'help' => t('Nodes which have webforms.'),
  16. );
  17. $data['webform']['table']['join'] = array(
  18. 'node' => array(
  19. 'left_field' => 'nid',
  20. 'field' => 'nid',
  21. 'type' => 'INNER',
  22. ),
  23. );
  24. // NID.
  25. $data['webform']['nid'] = array(
  26. 'title' => t('Node'),
  27. 'help' => t('The node this webform is part of.'),
  28. 'relationship' => array(
  29. 'base' => 'node',
  30. 'field' => 'nid',
  31. 'handler' => 'views_handler_relationship',
  32. 'label' => t('Node for webform'),
  33. ),
  34. 'filter' => array(
  35. 'handler' => 'views_handler_filter_numeric',
  36. ),
  37. 'sort' => array(
  38. 'handler' => 'views_handler_sort',
  39. ),
  40. 'argument' => array(
  41. 'handler' => 'views_handler_argument_node_nid',
  42. // The field to display in the summary.
  43. 'name field' => 'title',
  44. 'numeric' => TRUE,
  45. 'validate type' => 'nid',
  46. ),
  47. );
  48. // Status.
  49. $data['webform']['status'] = array(
  50. 'title' => t('Status'),
  51. 'help' => t('The open or closed status of a webform.'),
  52. 'field' => array(
  53. 'handler' => 'webform_handler_field_webform_status',
  54. 'click sortable' => TRUE,
  55. ),
  56. 'filter' => array(
  57. 'label' => t('Status'),
  58. 'handler' => 'webform_handler_filter_webform_status',
  59. 'type' => 'open-closed',
  60. ),
  61. 'sort' => array(
  62. 'handler' => 'views_handler_sort',
  63. ),
  64. );
  65. // Submissions table definitions.
  66. $data['webform_submissions']['table']['group'] = t('Webform submissions');
  67. $data['webform_submissions']['table']['base'] = array(
  68. 'field' => 'sid',
  69. 'title' => t('Webform submissions'),
  70. 'help' => t('Submissions generated from Webform forms.'),
  71. );
  72. // Serial number.
  73. $data['webform_submissions']['serial'] = array(
  74. 'title' => t('Serial number'),
  75. 'help' => t('The serial number of the submission.'),
  76. 'field' => array(
  77. 'handler' => 'views_handler_field_numeric',
  78. 'click sortable' => TRUE,
  79. ),
  80. 'filter' => array(
  81. 'title' => t('Serial number'),
  82. 'handler' => 'views_handler_filter_numeric',
  83. ),
  84. 'sort' => array(
  85. 'handler' => 'views_handler_sort',
  86. ),
  87. 'argument' => array(
  88. 'handler' => 'views_handler_argument_numeric',
  89. ),
  90. );
  91. // SID.
  92. $data['webform_submissions']['sid'] = array(
  93. 'title' => t('Sid'),
  94. 'help' => t('The submission ID of the submission.'),
  95. 'field' => array(
  96. 'handler' => 'views_handler_field_numeric',
  97. 'click sortable' => TRUE,
  98. ),
  99. 'filter' => array(
  100. 'title' => t('Sid'),
  101. 'handler' => 'views_handler_filter_numeric',
  102. ),
  103. 'sort' => array(
  104. 'handler' => 'views_handler_sort',
  105. ),
  106. 'argument' => array(
  107. 'handler' => 'views_handler_argument_numeric',
  108. ),
  109. );
  110. // Submission data as a field loads the entire submission.
  111. $data['webform_submissions']['value'] = array(
  112. 'title' => t('Value'),
  113. 'help' => t('The value of a component as submitted by a user.'),
  114. 'real field' => 'sid',
  115. 'group' => t('Webform submission data'),
  116. 'field' => array(
  117. 'handler' => 'webform_handler_field_submission_data',
  118. 'webform_expand' => FALSE,
  119. 'click sortable' => TRUE,
  120. ),
  121. );
  122. // Expanded to generate a field for every viewable component.
  123. $data['webform_submissions']['webform_all_fields'] = array(
  124. 'title' => t('All values'),
  125. 'help' => t('Displays all values as submitted by a user.'),
  126. 'real field' => 'sid',
  127. 'group' => t('Webform submission data'),
  128. 'field' => array(
  129. 'handler' => 'webform_handler_field_submission_data',
  130. 'webform_expand' => TRUE,
  131. 'click sortable' => TRUE,
  132. ),
  133. );
  134. // NID.
  135. $data['webform_submissions']['nid'] = array(
  136. 'title' => t('Node'),
  137. 'help' => t('The webform node this submission was generated from.'),
  138. 'relationship' => array(
  139. 'base' => 'node',
  140. 'field' => 'nid',
  141. 'handler' => 'views_handler_relationship',
  142. 'label' => t('Webform Node'),
  143. ),
  144. 'filter' => array(
  145. 'handler' => 'views_handler_filter_numeric',
  146. ),
  147. 'sort' => array(
  148. 'handler' => 'views_handler_sort',
  149. ),
  150. 'argument' => array(
  151. 'handler' => 'views_handler_argument_node_nid',
  152. // The field to display in the summary.
  153. 'name field' => 'title',
  154. 'numeric' => TRUE,
  155. 'validate type' => 'nid',
  156. ),
  157. );
  158. // UID.
  159. $data['webform_submissions']['uid'] = array(
  160. 'title' => t('User'),
  161. 'help' => t('The user who sent the webform submission.'),
  162. 'relationship' => array(
  163. 'base' => 'users',
  164. 'field' => 'uid',
  165. 'handler' => 'views_handler_relationship',
  166. 'label' => t('Webform Submission User'),
  167. ),
  168. 'filter' => array(
  169. 'handler' => 'views_handler_filter_user_name',
  170. ),
  171. 'sort' => array(
  172. 'handler' => 'views_handler_sort',
  173. ),
  174. 'argument' => array(
  175. 'handler' => 'views_handler_argument_numeric',
  176. ),
  177. 'field' => array(
  178. 'handler' => 'views_handler_field_user',
  179. ),
  180. );
  181. // Is draft.
  182. $data['webform_submissions']['is_draft'] = array(
  183. 'title' => t('Draft'),
  184. 'help' => t('Whether or not the submission is a draft.'),
  185. 'field' => array(
  186. 'handler' => 'webform_handler_field_is_draft',
  187. 'click sortable' => TRUE,
  188. ),
  189. 'filter' => array(
  190. 'handler' => 'webform_handler_filter_is_draft',
  191. ),
  192. 'sort' => array(
  193. 'handler' => 'views_handler_sort',
  194. ),
  195. );
  196. // Submitted timestamp.
  197. $data['webform_submissions']['submitted'] = array(
  198. 'title' => t('Submitted'),
  199. 'help' => t('Timestamp when the form was first saved as draft or submitted.'),
  200. 'field' => array(
  201. 'handler' => 'views_handler_field_date',
  202. 'click sortable' => TRUE,
  203. ),
  204. 'filter' => array(
  205. 'title' => t('Submitted'),
  206. 'handler' => 'views_handler_filter_date',
  207. ),
  208. 'sort' => array(
  209. 'handler' => 'views_handler_sort_date',
  210. ),
  211. 'argument' => array(
  212. 'handler' => 'views_handler_argument_date',
  213. ),
  214. );
  215. // Completed timestamp.
  216. $data['webform_submissions']['completed'] = array(
  217. 'title' => t('Completed'),
  218. 'help' => t('Timestamp when the form was submitted as complete (not draft).'),
  219. 'field' => array(
  220. 'handler' => 'views_handler_field_date',
  221. 'click sortable' => TRUE,
  222. ),
  223. 'filter' => array(
  224. 'title' => t('Completed'),
  225. 'handler' => 'views_handler_filter_date',
  226. ),
  227. 'sort' => array(
  228. 'handler' => 'views_handler_sort_date',
  229. ),
  230. 'argument' => array(
  231. 'handler' => 'views_handler_argument_date',
  232. ),
  233. );
  234. // Modified timestamp.
  235. $data['webform_submissions']['modified'] = array(
  236. 'title' => t('Modified'),
  237. 'help' => t('Timestamp when the form was last saved (complete or draft).'),
  238. 'field' => array(
  239. 'handler' => 'views_handler_field_date',
  240. 'click sortable' => TRUE,
  241. ),
  242. 'filter' => array(
  243. 'title' => t('Modified'),
  244. 'handler' => 'views_handler_filter_date',
  245. ),
  246. 'sort' => array(
  247. 'handler' => 'views_handler_sort_date',
  248. ),
  249. 'argument' => array(
  250. 'handler' => 'views_handler_argument_date',
  251. ),
  252. );
  253. // IP Address (remote_addr).
  254. $data['webform_submissions']['remote_addr'] = array(
  255. 'title' => t('Remote address'),
  256. 'help' => t('The remote IP address of the user that submitted this submission.'),
  257. 'field' => array(
  258. 'handler' => 'views_handler_field',
  259. 'click sortable' => TRUE,
  260. ),
  261. 'filter' => array(
  262. 'title' => t('Remote address'),
  263. 'handler' => 'views_handler_filter_string',
  264. ),
  265. 'sort' => array(
  266. 'handler' => 'views_handler_sort',
  267. ),
  268. );
  269. // View submission link.
  270. $data['webform_submissions']['view_submission'] = array(
  271. 'title' => t('View link'),
  272. 'help' => t('Provide a simple link to view the submission.'),
  273. 'real field' => 'serial',
  274. 'field' => array(
  275. 'handler' => 'webform_handler_field_submission_link',
  276. 'click sortable' => TRUE,
  277. 'real field' => 'serial',
  278. 'link_type' => 'view',
  279. ),
  280. 'sort' => array(
  281. 'handler' => 'views_handler_sort',
  282. ),
  283. );
  284. // Edit submission link.
  285. $data['webform_submissions']['edit_submission'] = array(
  286. 'title' => t('Edit link'),
  287. 'help' => t('Provide a simple link to edit the submission.'),
  288. 'real field' => 'serial',
  289. 'field' => array(
  290. 'handler' => 'webform_handler_field_submission_link',
  291. 'click sortable' => TRUE,
  292. 'link_type' => 'edit',
  293. ),
  294. 'sort' => array(
  295. 'handler' => 'views_handler_sort',
  296. ),
  297. );
  298. // Delete submission link.
  299. $data['webform_submissions']['delete_submission'] = array(
  300. 'title' => t('Delete link'),
  301. 'help' => t('Provide a simple link to delete the submission.'),
  302. 'real field' => 'serial',
  303. 'field' => array(
  304. 'handler' => 'webform_handler_field_submission_link',
  305. 'click sortable' => TRUE,
  306. 'link_type' => 'delete',
  307. ),
  308. 'sort' => array(
  309. 'handler' => 'views_handler_sort',
  310. ),
  311. );
  312. // Relation to webform_submitted_data table.
  313. $data['webform_submissions']['data'] = array(
  314. 'title' => t('Data'),
  315. 'help' => t('Relates to a webform submission data'),
  316. 'real field' => 'sid',
  317. 'relationship' => array(
  318. 'handler' => 'webform_handler_relationship_submission_data',
  319. 'base' => 'webform_submitted_data',
  320. 'base field' => 'sid',
  321. 'label' => t('Submission Data'),
  322. ),
  323. );
  324. // Submission data table definitions.
  325. $data['webform_submitted_data']['table']['group'] = t('Webform submission data');
  326. // Raw access to the submitted values. This usually will only be used for
  327. // sorts and filters, since the 'value' field for the submission will often
  328. // be faster and easier to configure than the raw values.
  329. $data['webform_submitted_data']['data'] = array(
  330. 'table' => 'webform_submitted_data',
  331. 'title' => t('Data field'),
  332. 'help' => t('The value of a component as submitted by a user.'),
  333. 'real field' => 'data',
  334. 'field' => array(
  335. // Distinguish from the normal value handler.
  336. 'title' => t('Value (raw)'),
  337. 'help' => t('The raw value from the database as submitted by a user. Use only when needing to sort on a field value.'),
  338. 'handler' => 'views_handler_field',
  339. 'click sortable' => TRUE,
  340. ),
  341. 'argument' => array(
  342. 'handler' => 'views_handler_argument_string',
  343. ),
  344. 'filter' => array(
  345. 'handler' => 'webform_handler_filter_submission_data',
  346. ),
  347. 'sort' => array(
  348. 'handler' => 'views_handler_sort',
  349. ),
  350. );
  351. // Same as 'data', but handled as numeric data.
  352. $data['webform_submitted_data']['data_numeric'] = array(
  353. 'table' => 'webform_submitted_data',
  354. 'title' => t('Data field (numeric)'),
  355. 'help' => t('The numeric value of a component as submitted by a user.'),
  356. 'real field' => 'data',
  357. 'field' => array(
  358. // Distinguish from the normal value handler.
  359. 'title' => t('Numeric value (raw)'),
  360. 'help' => t('The raw value from the database, cast to a number, as submitted by a user. Use only when needing to sort on a field value.'),
  361. 'handler' => 'webform_handler_field_numeric_data',
  362. 'click sortable' => TRUE,
  363. 'float' => TRUE,
  364. ),
  365. 'argument' => array(
  366. 'handler' => 'views_handler_argument_numeric',
  367. ),
  368. 'filter' => array(
  369. 'handler' => 'webform_handler_filter_numeric_data',
  370. ),
  371. 'sort' => array(
  372. 'handler' => 'webform_handler_sort_numeric_data',
  373. ),
  374. );
  375. // Number field for multi-value fields.
  376. $data['webform_submitted_data']['no'] = array(
  377. 'title' => t('Value delta'),
  378. 'help' => t('The delta value of the submitted data in a multi value component (such as checkboxes).'),
  379. 'real field' => 'no',
  380. 'argument' => array(
  381. 'handler' => 'views_handler_argument_numeric',
  382. ),
  383. 'field' => array(
  384. 'handler' => 'views_handler_field_numeric',
  385. ),
  386. 'filter' => array(
  387. 'handler' => 'views_handler_filter_numeric',
  388. ),
  389. 'sort' => array(
  390. 'handler' => 'views_handler_sort',
  391. ),
  392. );
  393. return $data;
  394. }
  395. /**
  396. * Implements hook_views_data_alter().
  397. */
  398. function webform_views_data_alter(&$data) {
  399. // Webform submission from node.
  400. $data['node']['webform_submission'] = array(
  401. 'title' => t('Webform submission'),
  402. 'help' => t('Webform submissions of the given Webform node.'),
  403. 'real field' => 'nid',
  404. 'relationship' => array(
  405. 'base' => 'webform_submissions',
  406. 'base field' => 'nid',
  407. 'handler' => 'views_handler_relationship',
  408. 'label' => t('Webform Submission'),
  409. ),
  410. );
  411. $data['node']['table']['join']['webform_submissions'] = array(
  412. 'field' => 'nid',
  413. 'left_field' => 'nid',
  414. 'left_table' => 'webform_submissions',
  415. );
  416. // Submission count (node).
  417. $data['node']['webform_submission_count_node'] = array(
  418. 'group' => t('Webform'),
  419. 'field' => array(
  420. 'title' => t('Webform submission count'),
  421. 'help' => t('The number of webform submissions on this node.'),
  422. 'handler' => 'webform_handler_field_submission_count',
  423. 'count_type' => 'node',
  424. ),
  425. );
  426. // Webform submission of user.
  427. $data['users']['webform_submission'] = array(
  428. 'title' => t('Webform submission'),
  429. 'help' => t('Webform submissions of the given user.'),
  430. 'real field' => 'uid',
  431. 'relationship' => array(
  432. 'base' => 'webform_submissions',
  433. 'base field' => 'uid',
  434. 'handler' => 'views_handler_relationship',
  435. 'label' => t('Webform Submission'),
  436. ),
  437. );
  438. // Submission count (user).
  439. $data['users']['webform_submission_count_user'] = array(
  440. 'field' => array(
  441. 'title' => t('Webform submission count'),
  442. 'help' => t('The number of webform submissions for this user.'),
  443. 'handler' => 'webform_handler_field_submission_count',
  444. 'count_type' => 'users',
  445. ),
  446. );
  447. // Link for editing the webform.
  448. $data['node']['webform_edit'] = array(
  449. 'group' => t('Webform'),
  450. 'field' => array(
  451. 'title' => t('Webform edit link'),
  452. 'help' => t('Provide a simple link to edit the webform components and configuration.'),
  453. 'handler' => 'webform_handler_field_node_link_edit',
  454. ),
  455. );
  456. // Link for viewing webform results.
  457. $data['node']['webform_results'] = array(
  458. 'group' => t('Webform'),
  459. 'field' => array(
  460. 'title' => t('Webform results link'),
  461. 'help' => t('Provide a simple link to view the results of a webform.'),
  462. 'handler' => 'webform_handler_field_node_link_results',
  463. ),
  464. );
  465. // Webform form content.
  466. $data['node']['webform_form_body'] = array(
  467. 'group' => t('Webform'),
  468. 'field' => array(
  469. 'title' => t('Webform form body'),
  470. 'help' => t('The Webform form body display for this node.'),
  471. 'handler' => 'webform_handler_field_form_body',
  472. ),
  473. );
  474. $data['views']['webform_result'] = array(
  475. 'title' => t('Result summary with an additional token to change the items/page'),
  476. 'help' => t('Shows result summary, for example the items per page, plus links to change the items per page.'),
  477. 'area' => array(
  478. 'handler' => 'webform_handler_area_result_pager',
  479. ),
  480. );
  481. }
  482. /**
  483. * Implements hook_views_plugins().
  484. */
  485. function webform_views_plugins() {
  486. return array(
  487. 'row' => array(
  488. 'webform_submission' => array(
  489. 'title' => t('Rendered submissions'),
  490. 'help' => t('Display the rendered submission'),
  491. 'handler' => 'webform_views_plugin_row_submission_view',
  492. 'uses options' => TRUE,
  493. 'type' => 'normal',
  494. ),
  495. ),
  496. );
  497. }
  498. /**
  499. * Implements hook_view_pre_view().
  500. */
  501. function webform_views_pre_view($view, $display_id, $args) {
  502. $display = $view->display[$display_id];
  503. $all_fields_id = _webform_view_find_id($view, $display_id, 'field', array('field' => 'webform_all_fields'));
  504. if ($all_fields_id !== NULL &&
  505. !empty($args[0]) && is_numeric($args[0]) && $args[0] > 0 &&
  506. _webform_view_find_id($view, $display_id, 'argument', array('field' => 'nid', 'table' => 'webform_submissions')) !== NULL &&
  507. ($node = node_load($args[0])) && isset($node->webform['components'])) {
  508. // This is a view/display that needs its fields expanded. It contains the
  509. // webform_all_fields field, has a nid argument to the webform_submission
  510. // table that is a valid node. Retrieve the display's fields and remove any
  511. // fields after the 'webform_all_fields' field.
  512. $fields = $view->get_items('field', $display_id);
  513. $prototype = $fields[$all_fields_id];
  514. $field_index = array_flip(array_keys($fields));
  515. $trailing_fields = array_slice($fields, $field_index[$all_fields_id] + 1, NULL, TRUE);
  516. $fields = array_slice($fields, 0, $field_index[$all_fields_id], TRUE);
  517. // Remove any fields after the webform_add_fields field.
  518. $new_columns = array();
  519. foreach ($node->webform['components'] as $component) {
  520. if (webform_component_invoke($component['type'], 'table', $component, array('')) !== NULL) {
  521. $new_id = 'webform_component_' . $component['cid'];
  522. $new_fields = array(
  523. array(
  524. 'id' => $new_id,
  525. 'field' => 'value',
  526. 'table' => 'webform_submissions',
  527. 'label' => $component['name'],
  528. 'webform_nid' => $node->nid,
  529. 'webform_cid' => $component['cid'],
  530. 'exclude' => 0,
  531. ) + $prototype,
  532. );
  533. if (webform_component_implements($component['type'], 'view_field')) {
  534. $new_fields = webform_component_invoke($component['type'], 'view_field', $component, $new_fields);
  535. }
  536. foreach ($new_fields as $sub_id => $new_field) {
  537. $field_id = $new_id . ($sub_id ? '_' . $sub_id : '');
  538. $fields[$field_id] = $new_field;
  539. $new_columns[$field_id] = $field_id;
  540. }
  541. }
  542. }
  543. // Add any trailing fields back in.
  544. $fields += $trailing_fields;
  545. // Store. Alas, there is no view::set_items() method.
  546. $display->handler->set_option('fields', $fields);
  547. // If this display's style is a table, add columns for click-sorting.
  548. // Note: Test for count($new_columns) is necessary because prior to PHP 5.6,
  549. // array_fill requires a positive number of elements to insert.
  550. if ($display->handler->get_option('style_plugin') == 'table' && count($new_columns)) {
  551. $style_options = $display->handler->get_option('style_options');
  552. $style_options['columns'] += $new_columns;
  553. $style_prototype = isset($style_options['info'][$all_fields_id])
  554. ? $style_options['info'][$all_fields_id]
  555. : array();
  556. $style_prototype += array(
  557. 'sortable' => 1,
  558. 'default_sort_order' => 'asc',
  559. 'align' => '',
  560. 'separator' => '',
  561. 'empty_column' => 0,
  562. );
  563. $style_options['info'] += array_combine($new_columns, array_fill(1, count($new_columns), $style_prototype));
  564. $display->handler->set_option('style_options', $style_options);
  565. }
  566. // Reset field handlers cache and rebuild field handlers.
  567. unset($display->handler->handlers['field']);
  568. $display->handler->get_handlers('field');
  569. // Allow other modules to alter these modifications to the view.
  570. drupal_alter('webform_view', $view, $display_id, $args);
  571. }
  572. }
  573. /**
  574. * Helper; Finds an item by option.
  575. */
  576. function _webform_view_find_id($view, $display_id, $type, $options) {
  577. foreach ($view->get_items($type, $display_id) as $id => $item) {
  578. foreach ($options as $option_key => $option_value) {
  579. if ($item[$option_key] != $option_value) {
  580. continue 2;
  581. }
  582. }
  583. return $id;
  584. }
  585. return NULL;
  586. }
  587. /**
  588. * Menu callback; Provide a list of Webform nodes for use in autocomplete.
  589. */
  590. function webform_views_autocomplete($string = '') {
  591. if ($string) {
  592. $or = db_or();
  593. // Strings with nid: in them can be used as direct matches.
  594. $matches = array();
  595. if (preg_match('/nid:([0-9]+)/', $string, $matches)) {
  596. $or->condition('n.nid', (int) $matches[1]);
  597. }
  598. // Otherwise match on title and optionally indirect NIDs.
  599. else {
  600. $or->condition('n.title', '%' . db_like($string) . '%', 'LIKE');
  601. if (is_numeric($string)) {
  602. $or->condition('n.nid', (int) $string);
  603. }
  604. }
  605. $options = array();
  606. $query = db_select('node', 'n')
  607. ->fields('n', array('nid', 'title'))
  608. ->condition($or);
  609. $query->innerJoin('webform', 'w', 'w.nid = n.nid');
  610. $result = $query
  611. ->range(0, 10)
  612. ->execute();
  613. foreach ($result as $node) {
  614. $options[$node->title . ' [nid:' . $node->nid . ']'] = check_plain($node->title) . ' [nid:' . $node->nid . ']';
  615. }
  616. }
  617. drupal_json_output($options);
  618. }
  619. /**
  620. * Shared form for the Webform submission data field and relationship handler.
  621. */
  622. function _webform_views_options_form(&$form, &$form_state, $nid, $cid) {
  623. form_load_include($form_state, 'inc', 'webform', 'includes/webform.components');
  624. $node = $nid ? node_load($nid) : NULL;
  625. $form['webform_nid'] = array(
  626. '#type' => 'textfield',
  627. '#title' => t('Webform node'),
  628. '#default_value' => isset($node) ? $node->title . ' [nid:' . $node->nid . ']' : '',
  629. '#ajax' => array(
  630. 'path' => views_ui_build_form_url($form_state),
  631. 'event' => 'blur',
  632. ),
  633. '#autocomplete_path' => 'webform/autocomplete',
  634. '#description' => t('Enter the title or NID of the Webform whose values should be made available.'),
  635. '#submit' => array('views_ui_config_item_form_submit_temporary'),
  636. '#executes_submit_callback' => TRUE,
  637. );
  638. $components = array();
  639. if (isset($node->webform['components'])) {
  640. $components = $node->webform['components'];
  641. }
  642. $type_options = array();
  643. foreach (webform_components() as $key => $component) {
  644. $type_options[$key] = check_plain($component['label']);
  645. }
  646. $options = webform_component_list($node, NULL, 'path', TRUE);
  647. $form['webform_cid'] = array(
  648. '#title' => t('Component data'),
  649. '#type' => 'select',
  650. '#options' => $options,
  651. '#default_value' => $cid,
  652. '#access' => count($components),
  653. '#description' => t('Select the component whose values should be made available.'),
  654. );
  655. }
  656. /**
  657. * Validate handler for webform_views_options_form().
  658. */
  659. function _webform_views_options_validate(&$form, &$form_state) {
  660. // Just store the checked components of the selected type.
  661. if (empty($form_state['values']['options']['webform_nid'])) {
  662. form_error($form['webform_nid'], t('Webform NID is required.'));
  663. }
  664. else {
  665. $nid = preg_replace('/^.*?nid:([0-9]+).*?$/', '$1', $form_state['values']['options']['webform_nid']);
  666. if (!($nid && ($node = node_load($nid)) && !empty($node->webform['components']))) {
  667. form_error($form['webform_nid'], t('The specified node is not valid.'));
  668. }
  669. }
  670. }
  671. /**
  672. * Submit handler for webform_views_options_form().
  673. */
  674. function _webform_views_options_submit(&$form, &$form_state) {
  675. // Save the NID as just the number instead of the title.
  676. $nid = preg_replace('/^.*?nid:([0-9]+).*?$/', '$1', $form_state['values']['options']['webform_nid']);
  677. $form_state['values']['options']['webform_nid'] = $nid;
  678. }