tripal_bulk_loader.admin.inc 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  1. <?php
  2. /**
  3. * @file
  4. * Handles Create/Edit/Delete Template Admin Forms
  5. */
  6. /**
  7. * tripal_bulk_loader_admin_template
  8. */
  9. function tripal_bulk_loader_admin_template () {
  10. $add_url = url("admin/tripal/tripal_bulk_loader_template/add");
  11. $output = "<a href=\"$add_url\">Create a new bulk loader template</a><br>";
  12. $del_url = url("admin/tripal/tripal_bulk_loader_template/delete");
  13. $output .= "<a href=\"$del_url\">Delete a bulk loader template</a>";
  14. return $output;
  15. }
  16. //////////////////////////////////////////////////////////////////////////////////////
  17. // Create Template
  18. //////////////////////////////////////////////////////////////////////////////////////
  19. /**
  20. * tripal_bulk_loader_admin_template_form
  21. */
  22. function tripal_bulk_loader_create_template_base_form (&$form_state = NULL) {
  23. // Basic Details--------------------------------------------------------------
  24. $form['bulk_loader'] = array(
  25. '#type' => 'fieldset',
  26. '#title' => t('Step 1: Basic Template Details'),
  27. );
  28. $modules = module_invoke_all('tripal_bulk_loader_supported_modules');
  29. $modules[''] = 'Select A Module';
  30. if ($form_state['storage']['base_table']) {
  31. $base_table = $form_state['storage']['base_table'];
  32. } else {
  33. $base_table = '';
  34. }
  35. $form['bulk_loader']['chado_module'] = array(
  36. '#title' => t('Chado Module'),
  37. '#description' => t('Please select the module for which you would like to create an importer'),
  38. '#type' => 'select',
  39. '#options' => $modules,
  40. '#default_value' => $base_table,
  41. '#weight' => 0,
  42. '#required' => TRUE
  43. );
  44. $form['bulk_loader']['template_name'] = array(
  45. '#type' => 'textfield',
  46. '#title' => t('Template Name'),
  47. '#default_value' => $form_state['storage']['template_name'],
  48. );
  49. if ($base_table) {
  50. // Add Fields---------------------------------------------------------------------
  51. $form = array_merge($form, tripal_bulk_loader_add_template_field_form($form_state));
  52. // List Current Fields------------------------------------------------------------
  53. $form['current_fields'] = array(
  54. '#type' => 'fieldset',
  55. '#title' => t('Step 3: Confirm Fields')
  56. );
  57. if ($form_state['storage']['template']) {
  58. $form['current_fields']['items'] = array(
  59. '#type' => 'item',
  60. '#value' => theme('tripal_bulk_loader_template', $form_state['storage']['template_id']),
  61. );
  62. } else {
  63. $form['current_fields']['items'] = array(
  64. '#type' => 'item',
  65. '#value' => t('There are currently no fields added to this template.'),
  66. );
  67. }
  68. // Submit-------------------------------------------------------------------------
  69. $form['submit-save'] = array(
  70. '#type' => 'submit',
  71. '#value' => 'Save Template'
  72. );
  73. } else {
  74. $form['submit-next_step'] = array(
  75. '#type' => 'submit',
  76. '#value' => 'Next Step'
  77. );
  78. } //end of if base details are set
  79. return $form;
  80. }
  81. /**
  82. * tripal_bulk_loader_admin_template_form_validate
  83. */
  84. function tripal_bulk_loader_create_template_base_form_validate($form, &$form_state){
  85. if(!$form_state['ahah_submission']) {
  86. if ($form_state['values']['op'] == 'Add Field') {
  87. if ($form_state['values']['type'] == 'column') {
  88. if (!$form_state['values']['column']) {
  89. form_set_error('column', 'Column is Required!');
  90. }
  91. if (!$form_state['values']['sheet']) {
  92. form_set_error('sheet', 'Worksheet Name is Required!');
  93. }
  94. } elseif ($form_state['values']['type'] == 'constant') {
  95. if (!$form_state['values']['constant_value']) {
  96. form_set_error('constant_value', 'Value of Constant is Required!');
  97. }
  98. }
  99. } elseif ($form_state['values']['op'] == 'Save Template') {
  100. if (!$form_state['storage']['template']) {
  101. form_set_error('', 'Tempalte must contain at least one field');
  102. }
  103. }
  104. }
  105. }
  106. /**
  107. * tripal_bulk_loader_admin_template_form_submit
  108. */
  109. function tripal_bulk_loader_create_template_base_form_submit($form, &$form_state){
  110. //dpm($form_state, 'form_state: submit');
  111. // AHAH Storage ----------------------------------------------------------
  112. $form_state['rebuild'] = TRUE;
  113. $form_state['storage']['base_table'] = $form_state['values']['chado_module'];
  114. $form_state['storage']['template_name'] = $form_state['values']['template_name'];
  115. if (!$form_state['ahah_submission']) {
  116. // When template is first defined
  117. if ($form_state['values']['op'] == 'Next Step') {
  118. $record = array(
  119. 'name' => $form_state['values']['template_name'],
  120. 'template_array' => ' '
  121. );
  122. drupal_write_record('tripal_bulk_loader_template', $record);
  123. $form_state['storage']['template_id'] = $record['template_id'];
  124. // Add Field to Template----------------------------------------------
  125. } elseif ($form_state['values']['op'] == 'Add Field') {
  126. $form_state = tripal_bulk_loader_add_template_field_form_submit($form_state);
  127. // Save Template ----------------------------------------------------
  128. }
  129. $record = array(
  130. 'name' => $form_state['values']['template_name'],
  131. 'template_array' => serialize($form_state['storage']['template'])
  132. );
  133. //Check if template exists
  134. $sql = "SELECT count(*) as count FROM tripal_bulk_loader_template WHERE name='%s'";
  135. if (db_result(db_query($sql, $form_state['values']['template_name']))) {
  136. // Update Previous
  137. drupal_write_record('tripal_bulk_loader_template', $record, array('name'));
  138. } else {
  139. // Insert New
  140. drupal_write_record('tripal_bulk_loader_template', $record);
  141. }
  142. } //end of if not ahah submission
  143. else {
  144. $form_state = tripal_bulk_loader_add_template_field_form_submit($form_state);
  145. }
  146. }
  147. //////////////////////////////////////////////////////////////////////////////////////
  148. // Edit Template
  149. //////////////////////////////////////////////////////////////////////////////////////
  150. /**
  151. *
  152. */
  153. function tripal_bulk_loader_edit_template_base_form($form_state = NULL){
  154. $form = array();
  155. $sql = "SELECT * FROM {tripal_bulk_loader_template}";
  156. $resource = db_query($sql);
  157. $templates = array();
  158. $templates[''] = 'Select a Template';
  159. while ($r = db_fetch_object($resource)) {
  160. $templates[$r->template_id] = $r->name;
  161. }
  162. $form['template_name'] = array(
  163. '#title' => t('Template'),
  164. '#description' => t('Please select the template you would like to edit.'),
  165. '#type' => 'select',
  166. '#options' => $templates,
  167. '#default_value' => $form_state['storage']['template_id'],
  168. '#weight' => 0,
  169. '#required' => TRUE,
  170. );
  171. $form['fields'] = array(
  172. '#type' => ($form_state['storage']['template_id'])? 'fieldset' : 'hidden',
  173. '#title' => t('Fields'),
  174. );
  175. if ($form_state['storage']['template']) {
  176. // List Current Fields -------------------------------------------------------------
  177. $i=1;
  178. foreach ($form_state['storage']['template'] as $table => $table_groups) {
  179. if (!is_array($table_groups)) { continue; }
  180. foreach ($table_groups as $group => $table_array) {
  181. foreach ($table_array['field'] as $field_index => $field) {
  182. $form['fields']["field_group-$i"] = array(
  183. '#type' => 'item',
  184. '#value' => $group
  185. );
  186. $form['fields']["field_group_hidden-$i"] = array(
  187. '#type' => 'hidden',
  188. '#value' => $group
  189. );
  190. $form['fields']["field_name-$i"] = array(
  191. '#type' => 'item',
  192. '#value' => $field['title'],
  193. );
  194. $form['fields']["chado_table_name-$i"] = array(
  195. '#type' => 'item',
  196. '#value' => $table,
  197. );
  198. $form['fields']["chado_table_hidden-$i"] = array(
  199. '#type' => 'hidden',
  200. '#value' => $table,
  201. );
  202. $form['fields']["chado_field_name-$i"] = array(
  203. '#type' => 'item',
  204. '#value' => $field['field'],
  205. );
  206. $form['fields']["sheet_name-$i"] = array(
  207. '#type' => 'item',
  208. '#value' => $field['spreadsheet sheet'],
  209. );
  210. $form['fields']["column_num-$i"] = array(
  211. '#type' => 'item',
  212. '#value' => $field['spreadsheet column'],
  213. );
  214. $form['fields']["constant_value-$i"] = array(
  215. '#type' => 'item',
  216. '#value' => $field['constant value'],
  217. );
  218. $form['fields']["field_index-$i"] = array(
  219. '#type' => 'hidden',
  220. '#value' => $field_index
  221. );
  222. $form['fields']["edit-$i"] = array(
  223. '#type' => 'submit',
  224. '#value' => "Edit Field #$i",
  225. '#ahah' => array(
  226. 'path' => 'admin/tripal/tripal_bulk_loader_template/edit/edit_fields_ahah',
  227. 'wrapper' => 'tripal_bulk_loader-edit_field',
  228. 'effect' => 'fade'
  229. )
  230. );
  231. $form['fields']["delete-$i"] = array(
  232. '#type' => 'submit',
  233. '#value' => "Delete Field #$i",
  234. );
  235. $i++;
  236. }
  237. }
  238. }
  239. $form['fields']['total_fields'] = array(
  240. '#type' => 'item',
  241. '#value' => $i,
  242. );
  243. // Edit Field Form --------------------------------------------------------------------
  244. $form = array_merge($form, tripal_bulk_loader_edit_template_field_form($form_state));
  245. // Add Field Form ----------------------------------------------------------------------
  246. $form = array_merge($form, tripal_bulk_loader_add_template_field_form($form_state));
  247. $form['add_fields']['#title'] = 'Add Fields';
  248. }
  249. $value = ($form_state['storage']['template_id'])? 'Save Template' : 'Edit Template';
  250. $form['submit'] = array(
  251. '#type' => 'submit',
  252. '#value' => $value
  253. );
  254. return $form;
  255. }
  256. /**
  257. *
  258. */
  259. function tripal_bulk_loader_edit_template_base_form_submit($form, &$form_state){
  260. $form_state['rebuild'] = TRUE;
  261. $form_state['storage']['template_id'] = $form_state['values']['template_name'];
  262. $sql = "SELECT * FROM {tripal_bulk_loader_template} WHERE template_id=%d";
  263. $result = db_fetch_object(db_query($sql, $form_state['storage']['template_id']));
  264. $form_state['storage']['template'] = unserialize($result->template_array);
  265. $form_state['storage']['base_table'] = $form_state['storage']['template']['module'];
  266. if (!$form_state['ahah_submission']) {
  267. // Add Field to Template----------------------------------------------
  268. if (preg_match('/Add Field/', $form_state['values']['op'])) {
  269. $form_state = tripal_bulk_loader_add_template_field_form_submit($form_state);
  270. } elseif (preg_match('/Edit Field$/', $form_state['values']['op'])) {
  271. $form_state = tripal_bulk_loader_edit_template_field_form_submit($form_state);
  272. } elseif (preg_match('/Delete Field #(\d+)/', $form_state['values']['op'], $matches)) {
  273. $table = $form_state['values']["chado_table_hidden-".$matches[1]];
  274. $group = $form_state['values']["field_group_hidden-".$matches[1]];
  275. $field_key = $form_state['values']["field_index-".$matches[1]];
  276. unset($form_state['storage']['template'][$table][$group]['field'][$field_key]);
  277. if (!$form_state['storage']['template'][$table][$group]['field']) {
  278. unset($form_state['storage']['template'][$table][$group]);
  279. if (!$form_state['storage']['template'][$table]) {
  280. unset($form_state['storage']['template'][$table]);
  281. }
  282. }
  283. }
  284. // Save Template ----------------------------------------------------
  285. $record = array(
  286. 'template_id' => $form_state['values']['template_name'],
  287. 'template_array' => serialize($form_state['storage']['template'])
  288. );
  289. drupal_write_record('tripal_bulk_loader_template', $record, array('template_id'));
  290. } //end of if not ahah submission
  291. else {
  292. //Add AHAH associated with Add Form
  293. $form_state = tripal_bulk_loader_add_template_field_form_submit($form_state);
  294. $form_state = tripal_bulk_loader_edit_template_field_form_submit($form_state);
  295. }
  296. }
  297. //////////////////////////////////////////////////////////////////////////////////////
  298. // Delete Template
  299. //////////////////////////////////////////////////////////////////////////////////////
  300. function tripal_bulk_loader_delete_template_base_form () {
  301. $form = array();
  302. $sql = "SELECT * FROM {tripal_bulk_loader_template}";
  303. $resource = db_query($sql);
  304. $templates = array();
  305. $templates[''] = 'Select a Template';
  306. while ($r = db_fetch_object($resource)) {
  307. $templates[$r->template_id] = $r->name;
  308. }
  309. $form['template_name'] = array(
  310. '#title' => t('Template'),
  311. '#description' => t('Please select the template you would like to edit.'),
  312. '#type' => 'select',
  313. '#options' => $templates,
  314. '#weight' => 0,
  315. '#required' => TRUE,
  316. );
  317. $form['submit'] = array(
  318. '#type' => 'submit',
  319. '#value' => 'Delete Template',
  320. );
  321. return $form;
  322. }
  323. function tripal_bulk_loader_delete_template_base_form_submit ($form, &$form_state) {
  324. $sql = "DELETE FROM {tripal_bulk_loader_template} WHERE template_id=%d";
  325. db_query($sql, $form_state['values']['template_name']);
  326. }
  327. //////////////////////////////////////////////////////////////////////////////////////
  328. // Add/Edit Field Forms (meant to be returned as part of a larger form)
  329. //////////////////////////////////////////////////////////////////////////////////////
  330. /**
  331. * Add Field Form
  332. *
  333. * This form meant to be part of a larger form. Currently it is part of the following:
  334. * - tripal_bulk_loader_add_template_base_form
  335. * - tripal_bulk_loader_edit_template_base_form
  336. *
  337. * @param $form_state
  338. * The $form_state from the parent form
  339. * @return
  340. * The parent form with the edit field fieldset added
  341. *
  342. * Usage:
  343. * @code
  344. $form = array_merge($form, tripal_bulk_loader_add_template_field_form($form_state));
  345. * @endcode
  346. */
  347. function tripal_bulk_loader_add_template_field_form ($form_state) {
  348. $form = array();
  349. $base_table = $form_state['storage']['base_table'];
  350. $table = ($form_state['storage']['add']['chado_table'])? $form_state['storage']['add']['chado_table'] : $base_table;
  351. $form['add_fields'] = array(
  352. '#type' => 'fieldset',
  353. '#title' => t('Step 2: Add Fields'),
  354. '#prefix' => '<div id="tripal_bulk_loader-add_field">',
  355. '#suffix' => '</div>',
  356. );
  357. $field_type = ($form_state['storage']['add']['field_type'])? $form_state['storage']['add']['field_type'] : 'table field';
  358. $form['add_fields']['add-type'] = array(
  359. '#type' => 'radios',
  360. '#title' => t('Type of Field'),
  361. '#options' => array(
  362. 'table field' => t('Fields which maps to a Spreadsheet Column'),
  363. 'constant' => t('Field which remains Constant throughout the Spreadsheet'),
  364. ),
  365. '#default_value' => $field_type,
  366. '#ahah' => array(
  367. 'path' => 'admin/tripal/tripal_bulk_loader_template/add/field_type_ahah',
  368. 'wrapper' => 'tripal_bulk_loader-add_field',
  369. 'effect' => 'fade'
  370. ),
  371. );
  372. // check template array for groups already used for this table then add one more
  373. if ($form_state['storage']['template'][$table]) {
  374. $groups = array_keys($form_state['storage']['template'][$table]);
  375. }
  376. $groups[] = 'New Group';
  377. $form['add_fields']['add-field_group'] = array(
  378. '#type' => 'select',
  379. '#title' => 'Group',
  380. '#description' => 'This is used to group a set of fields together allowing '
  381. .'multiple records to be inserted into the same table per line of the spreadsheet',
  382. '#options' => $groups,
  383. '#default_value' => 0
  384. );
  385. $form['add_fields']['add-field_title'] = array(
  386. '#type' => 'textfield',
  387. '#title' => t('Human-readable Title for Field')
  388. );
  389. // Spreadsheet column
  390. $form['add_fields']['columns'] = array(
  391. '#type' => ($field_type == 'table field')? 'fieldset' : 'hidden',
  392. '#title' => t('Spreadsheet Column'),
  393. );
  394. $form['add_fields']['columns']['add-sheet'] = array(
  395. '#type' => 'textfield',
  396. '#title' => t('Worksheet'),
  397. '#description' => t('Specify the name of the worksheet.'),
  398. '#size' => 5,
  399. '#default_value' => ($form_state['storage']['add']['sheet_name'])? $form_state['storage']['add']['sheet_name'] : 'Sheet1',
  400. );
  401. $form['add_fields']['columns']['add-column'] = array(
  402. '#type' => 'textfield',
  403. '#title' => t('Column'),
  404. '#description' => t('Specify the column in the spreadsheet that this field maps to where the first column is 1.'),
  405. '#size' => 5,
  406. '#default_value' => $form_state['storage']['add']['column_number'],
  407. );
  408. // Global Value
  409. $form['add_fields']['constant'] = array(
  410. '#type' => ($field_type == 'constant')? 'fieldset' : 'hidden',
  411. '#title' => t('Constant'),
  412. );
  413. $form['add_fields']['constant']['add-constant_value'] = array(
  414. '#type' => 'textfield',
  415. '#title' => t('Constant Value'),
  416. '#description' => t('Specify the value you wish this field to have regardless of spreadsheet data.'),
  417. '#default_value' => $form_state['storage']['add']['constant_value']
  418. );
  419. // Chado Field
  420. $form['add_fields']['chado'] = array(
  421. '#type' => 'fieldset',
  422. '#title' => t('Chado Field/Column Details'),
  423. '#prefix' => '<div id="tripal_bulk_loader-add_chado_column">',
  424. '#suffix' => '</div>',
  425. '#description' => t('Specify the Table/Field in chado that this field maps to.'),
  426. );
  427. $related_tables = module_invoke_all('tripal_bulk_loader_'.$base_table.'_related_tables');
  428. $form['add_fields']['chado']['add-chado_table'] = array(
  429. '#type' => 'select',
  430. '#title' => t('Chado Table'),
  431. '#options' => $related_tables,
  432. '#default_value' => $table,
  433. '#ahah' => array(
  434. 'path' => 'admin/tripal/tripal_bulk_loader_template/add/chado_column_ahah',
  435. 'wrapper' => 'tripal_bulk_loader-add_chado_column',
  436. 'effect' => 'fade'
  437. ),
  438. );
  439. if ($related_tables['Indirect Relations'][$table]) {
  440. //Display fields for current table plus related tables
  441. $table_description = module_invoke_all('chado_'.$table.'_schema');
  442. $tables2list = array_keys($table_description['foreign keys']);
  443. unset($tables2list[array_search($base_table, $tables2list)]);
  444. $tables2list[] = $table;
  445. $form['field_is_indirect'] = array(
  446. '#type' => 'hidden',
  447. '#value' => implode('#',$tables2list),
  448. );
  449. } else {
  450. $tables2list = array($table);
  451. }
  452. $chado_fields = array();
  453. foreach ($tables2list as $table) {
  454. $table_description = module_invoke_all('chado_'.$table.'_schema');
  455. foreach($table_description['fields'] as $field_name => $field_array) {
  456. $chado_fields[$field_name] = $field_name;
  457. }
  458. }
  459. $form['add_fields']['chado']['add-chado_field'] = array(
  460. '#type' => 'select',
  461. '#title' => t('Chado Field/Column'),
  462. '#options' => $chado_fields
  463. );
  464. $form['add_fields']['submit-add_field'] = array(
  465. '#type' => 'submit',
  466. '#value' => 'Add Field'
  467. );
  468. return $form;
  469. }
  470. /**
  471. * Add Field Submit
  472. *
  473. * This submit meant to be part of a larger form submit. Currently it is part of the following:
  474. * - tripal_bulk_loader_add_template_base_form_submit
  475. * - tripal_bulk_loader_edit_template_base_form_submit
  476. *
  477. * @param $form_state
  478. * The $form_state from the parent submit
  479. * @return
  480. * The parent form_state with any changes made
  481. *
  482. * Usage:
  483. * @code
  484. $form_state = tripal_bulk_loader_add_template_field_form_submit($form_state);
  485. * @endcode
  486. */
  487. function tripal_bulk_loader_add_template_field_form_submit ($form_state) {
  488. //dpm($form_state, 'form state in add submit');
  489. $form_state['storage']['add']['field_group'] = $form_state['values']['add-field_group'];
  490. $form_state['storage']['add']['field_title'] = $form_state['values']['add-field_title'];
  491. $form_state['storage']['add']['field_type'] = $form_state['values']['add-type'];
  492. $form_state['storage']['add']['sheet_name'] = $form_state['values']['add-sheet'];
  493. $form_state['storage']['add']['column_number'] = $form_state['values']['add-column'];
  494. $form_state['storage']['add']['constant_value'] = $form_state['values']['add-constant_value'];
  495. $form_state['storage']['add']['chado_table'] = $form_state['values']['add-chado_table'];
  496. $form_state['storage']['add']['chado_field'] = $form_state['values']['add-chado_field'];
  497. if (!$form_state['ahah_submission']) {
  498. if ($form_state['values']['op'] == 'Add Field') {
  499. $template = $form_state['storage']['template'];
  500. $template['module'] = $form_state['storage']['base_table'];
  501. //if table relationship to base is indirect, fields from 2+ tables are listed in the fields select
  502. if ($form_state['values']['field_is_indirect']) {
  503. $listed_tables = preg_split('/#/', $form_state['values']['field_is_indirect']);
  504. $field = $form_state['storage']['add']['chado_field'];
  505. foreach ($listed_tables as $table) {
  506. $table_desc = module_invoke_all('chado_'.$table.'_schema');
  507. if ($table_desc['fields'][$field]) {
  508. if (preg_match('/'.$table.'/', $form_state['storage']['add']['chado_table'])) {
  509. //ensure linking table is added
  510. if (!$template[$form_state['storage']['add']['chado_table']]) {
  511. $template[$form_state['storage']['add']['chado_table']]['field'] = array();
  512. }
  513. }
  514. $form_state['storage']['add']['chado_table'] = $table;
  515. break;
  516. }
  517. }
  518. }
  519. $group = $form_state['storage']['add']['field_group'];
  520. $table = $form_state['storage']['add']['chado_table'];
  521. if ($form_state['storage']['add']['field_type'] == 'table field') {
  522. $template[$table][$group]['field'][] = array(
  523. 'type' => 'table field',
  524. 'title' => $form_state['storage']['add']['field_title'],
  525. 'field' => $form_state['storage']['add']['chado_field'],
  526. //'required' => <true|false>,
  527. //'allowed values' => empty by default,
  528. 'spreadsheet sheet' => $form_state['storage']['add']['sheet_name'],
  529. 'spreadsheet column' => $form_state['storage']['add']['column_number'],
  530. //'exposed' => 'true|false' If exposed, will give a select box first from allowed values if set, second from database if values not set.
  531. //'mapping' => array(
  532. // 'from' => 'to'
  533. // '/from re/' => 'to'
  534. //),
  535. );
  536. } elseif ($form_state['storage']['add']['field_type'] == 'constant') {
  537. $template[$table][$group]['field'][] = array(
  538. 'type' => 'constant',
  539. 'title' => $form_state['storage']['add']['field_title'],
  540. 'field' => $form_state['storage']['add']['chado_field'],
  541. //'required' => <true|false>,
  542. //'allowed values' => empty by default,
  543. 'constant value' => $form_state['storage']['add']['constant_value'],
  544. //'exposed' => 'true|false' If exposed, will give a select box first from allowed values if set, second from database if values not set.
  545. );
  546. }
  547. drupal_set_message('Successfully Added Field to Template');
  548. $form_state['storage']['template'] = $template;
  549. }
  550. }
  551. //dpm($form_state['storage']['template'], 'template array from add submit');
  552. return $form_state;
  553. }
  554. /**
  555. * Edit Field Form
  556. *
  557. * This form meant to be part of a larger form. Currently it is part of the following:
  558. * - tripal_bulk_loader_edit_template_base_form
  559. *
  560. * @param $form_state
  561. * The $form_state from the parent form
  562. * @return
  563. * The parent form with the edit field fieldset added
  564. *
  565. * Usage:
  566. * @code
  567. $form = array_merge($form, tripal_bulk_loader_edit_template_field_form($form_state));
  568. * @endcode
  569. */
  570. function tripal_bulk_loader_edit_template_field_form($form_state) {
  571. $form = array();
  572. $base_table = $form_state['storage']['base_table'];
  573. $table = ($form_state['storage']['edit']['chado_table'])? $form_state['storage']['edit']['chado_table'] : $base_table;
  574. $form['edit_fields'] = array(
  575. '#type' => ($form_state['storage']['edit_field']) ? 'fieldset' : 'hidden',
  576. '#title' => t('Edit Fields'),
  577. '#prefix' => '<div id="tripal_bulk_loader-edit_field">',
  578. '#suffix' => '</div>',
  579. );
  580. $field_type = ($form_state['storage']['edit']['field_type'])? $form_state['storage']['edit']['field_type'] : 'table field';
  581. $form['edit_fields']['edit-type'] = array(
  582. '#type' => 'radios',
  583. '#title' => t('Type of Field'),
  584. '#options' => array(
  585. 'table field' => t('Fields which maps to a Spreadsheet Column'),
  586. 'constant' => t('Field which remains Constant throughout the Spreadsheet'),
  587. ),
  588. '#default_value' => $field_type,
  589. '#ahah' => array(
  590. 'path' => 'admin/tripal/tripal_bulk_loader_template/edit/field_type_ahah',
  591. 'wrapper' => 'tripal_bulk_loader-edit_field',
  592. 'effect' => 'fade'
  593. ),
  594. );
  595. // check template array for groups already used for this table then add one more
  596. if ($form_state['storage']['template'][$table]) {
  597. $groups = array_keys($form_state['storage']['template'][$table]);
  598. }
  599. $groups[] = 'New Group';
  600. $form['edit_fields']['edit-field_group'] = array(
  601. '#type' => 'select',
  602. '#title' => 'Group',
  603. '#description' => 'This is used to group a set of fields together allowing '
  604. .'multiple records to be inserted into the same table per line of the spreadsheet',
  605. '#options' => $groups,
  606. '#default_value' => ($form_state['storage']['edit']['field_group']) ? $form_state['storage']['edit']['field_group'] : 0
  607. );
  608. $form['edit_fields']['edit-old_field_group'] = array(
  609. '#type' => 'hidden',
  610. '#value' => $form_state['storage']['edit_field']['group'],
  611. );
  612. $form['edit_fields']['edit-field_title'] = array(
  613. '#type' => 'textfield',
  614. '#title' => t('Human-readable Title for Field'),
  615. '#default_value' => $form_state['storage']['edit']['field_title'],
  616. );
  617. // Spreadsheet column
  618. $form['edit_fields']['columns'] = array(
  619. '#type' => ($field_type == 'table field')? 'fieldset' : 'hidden',
  620. '#title' => t('Spreadsheet Column'),
  621. );
  622. $form['edit_fields']['columns']['edit-sheet'] = array(
  623. '#type' => 'textfield',
  624. '#title' => t('Worksheet'),
  625. '#description' => t('Specify the name of the worksheet.'),
  626. '#size' => 5,
  627. '#default_value' => ($form_state['storage']['edit']['sheet_name'])? $form_state['storage']['edit']['sheet_name'] : 'Sheet1',
  628. );
  629. $form['edit_fields']['columns']['edit-column'] = array(
  630. '#type' => 'textfield',
  631. '#title' => t('Column'),
  632. '#description' => t('Specify the column in the spreadsheet that this field maps to where the first column is 1.'),
  633. '#size' => 5,
  634. '#default_value' => $form_state['storage']['edit']['column_number'],
  635. );
  636. // Global Value
  637. $form['edit_fields']['constant'] = array(
  638. '#type' => ($field_type == 'constant')? 'fieldset' : 'hidden',
  639. '#title' => t('Constant'),
  640. );
  641. $form['edit_fields']['constant']['edit-constant_value'] = array(
  642. '#type' => 'textfield',
  643. '#title' => t('Constant Value'),
  644. '#description' => t('Specify the value you wish this field to have regardless of spreadsheet data.'),
  645. '#default_value' => $form_state['storage']['edit']['constant_value']
  646. );
  647. // Chado Field
  648. $form['edit_fields']['chado'] = array(
  649. '#type' => 'fieldset',
  650. '#title' => t('Chado Field/Column Details'),
  651. '#prefix' => '<div id="tripal_bulk_loader-edit_chado_column">',
  652. '#suffix' => '</div>',
  653. '#description' => t('Specify the Table/Field in chado that this field maps to.'),
  654. );
  655. $related_tables = module_invoke_all('tripal_bulk_loader_'.$base_table.'_related_tables');
  656. $form['edit_fields']['chado']['edit-chado_table'] = array(
  657. '#type' => 'select',
  658. '#title' => t('Chado Table'),
  659. '#options' => $related_tables,
  660. '#default_value' => $table,
  661. '#ahah' => array(
  662. 'path' => 'admin/tripal/tripal_bulk_loader_template/edit/chado_column_ahah',
  663. 'wrapper' => 'tripal_bulk_loader-edit_chado_column',
  664. 'effect' => 'fade'
  665. ),
  666. );
  667. $table_description = module_invoke_all('chado_'.$table.'_schema');
  668. $chado_fields = array();
  669. foreach($table_description['fields'] as $field_name => $field_array) {
  670. $chado_fields[$field_name] = $field_name;
  671. }
  672. $form['edit_fields']['chado']['edit-chado_field'] = array(
  673. '#type' => 'select',
  674. '#title' => t('Chado Field/Column'),
  675. '#options' => $chado_fields,
  676. '#default_value' => $form_state['storage']['edit']['chado_field'],
  677. );
  678. $form['edit_fields']['submit-Edit_field'] = array(
  679. '#type' => 'submit',
  680. '#value' => 'Edit Field'
  681. );
  682. return $form;
  683. }
  684. /**
  685. * Edit Field Submit
  686. *
  687. * This submit meant to be part of a larger form submit. Currently it is part of the following:
  688. * - tripal_bulk_loader_edit_template_base_form_submit
  689. *
  690. * @param $form_state
  691. * The $form_state from the parent submit
  692. * @return
  693. * The parent form_state with any changes made
  694. *
  695. * Usage:
  696. * @code
  697. $form_state = tripal_bulk_loader_edit_template_field_form_submit($form_state);
  698. * @endcode
  699. */
  700. function tripal_bulk_loader_edit_template_field_form_submit ($form_state) {
  701. if (preg_match('/Edit Field #(\d+)/', $form_state['values']['op'], $matches)) {
  702. $table = $form_state['values']["chado_table_hidden-".$matches[1]];
  703. $field_key = $form_state['values']["field_index-".$matches[1]];
  704. $old_group = $form_state['values']["field_group_hidden-".$matches[1]];
  705. $form_state['storage']['edit_field'] = $form_state['storage']['template'][$table][$old_group]['field'][$field_key];
  706. $form_state['storage']['edit_field']['table'] = $table;
  707. $form_state['storage']['edit_field']['group'] = $old_group;
  708. $form_state['storage']['edit_field']['field_index'] = $field_key;
  709. $set_default = TRUE;
  710. $field_template = $form_state['storage']['edit_field'];
  711. } else {
  712. $set_default = FALSE;
  713. }
  714. if ($set_default) {
  715. $form_state['storage']['edit']['field_group'] = $old_group;
  716. $form_state['storage']['edit']['field_title'] = $field_template['title'];
  717. $form_state['storage']['edit']['field_type'] = $field_template['type'];
  718. $form_state['storage']['edit']['sheet_name'] = $field_template['spreadsheet sheet'];
  719. $form_state['storage']['edit']['column_number'] = $field_template['spreadsheet column'];
  720. $form_state['storage']['edit']['constant_value'] = $field_template['constant value'];
  721. $form_state['storage']['edit']['chado_table'] = $field_template['table'];
  722. $form_state['storage']['edit']['chado_field'] = $field_template['field'];
  723. } else {
  724. $form_state['storage']['edit']['field_group'] = $form_state['values']['edit-field_group'];
  725. $form_state['storage']['edit']['field_title'] = $form_state['values']['edit-field_title'];
  726. $form_state['storage']['edit']['field_type'] = $form_state['values']['edit-type'];
  727. $form_state['storage']['edit']['sheet_name'] = $form_state['values']['edit-sheet'];
  728. $form_state['storage']['edit']['column_number'] = $form_state['values']['edit-column'];
  729. $form_state['storage']['edit']['constant_value'] = $form_state['values']['edit-constant_value'];
  730. $form_state['storage']['edit']['chado_table'] = $form_state['values']['edit-chado_table'];
  731. $form_state['storage']['edit']['chado_field'] = $form_state['values']['edit-chado_field'];
  732. }
  733. if (!$form_state['ahah_submission']) {
  734. if ($form_state['values']['op'] == 'Edit Field') {
  735. if ($form_state['storage']['edit']['field_type'] == 'table field') {
  736. $field = array(
  737. 'type' => 'table field',
  738. 'title' => $form_state['storage']['edit']['field_title'],
  739. 'field' => $form_state['storage']['edit']['chado_field'],
  740. //'required' => <true|false>,
  741. //'allowed values' => empty by default,
  742. 'spreadsheet sheet' => $form_state['storage']['edit']['sheet_name'],
  743. 'spreadsheet column' => $form_state['storage']['edit']['column_number'],
  744. //'exposed' => 'true|false' If exposed, will give a select box first from allowed values if set, second from database if values not set.
  745. //'mapping' => array(
  746. // 'from' => 'to'
  747. // '/from re/' => 'to'
  748. //),
  749. );
  750. } elseif ($form_state['storage']['edit']['field_type'] == 'constant') {
  751. $field = array(
  752. 'type' => 'constant',
  753. 'title' => $form_state['storage']['edit']['field_title'],
  754. 'field' => $form_state['storage']['edit']['chado_field'],
  755. //'required' => <true|false>,
  756. //'allowed values' => empty by default,
  757. 'constant value' => $form_state['storage']['edit']['constant_value'],
  758. //'exposed' => 'true|false' If exposed, will give a select box first from allowed values if set, second from database if values not set.
  759. );
  760. }
  761. $table = $form_state['storage']['edit_field']['table'];
  762. $group = $form_state['values']['edit-field_group'];
  763. $old_group = $form_state['values']['edit-old_field_group'];
  764. $field_index = $form_state['storage']['edit_field']['field_index'];
  765. $form_state['storage']['template'][$table][$group]['field'][$field_index] = $field;
  766. if ($group != $old_group) {
  767. unset($form_state['storage']['template'][$table][$old_group]['field'][$field_index]);
  768. }
  769. drupal_set_message('Successfully Updated Field');
  770. //reset form
  771. unset($form_state['storage']['edit_field']);
  772. unset($form_state['storage']['edit']);
  773. }
  774. }
  775. //dpm($form_state, 'form state from end of edit submit');
  776. return $form_state;
  777. }
  778. //////////////////////////////////////////////////////////////////////////////////////
  779. // AHAH Callbacks
  780. //////////////////////////////////////////////////////////////////////////////////////
  781. /**
  782. * AHAH Function: Replace $form['add_fields']['chado'] in tripal_bulk_loader_add_template_field_form
  783. *
  784. * @return
  785. * JSON Data printed to the screen
  786. */
  787. function tripal_bulk_loader_add_chado_column_ahah () {
  788. $form_state = array('storage' => NULL, 'submitted' => FALSE);
  789. $form_build_id = $_POST['form_build_id'];
  790. $form = form_get_cache($form_build_id, $form_state);
  791. $args = $form['#parameters'];
  792. $form_id = array_shift($args);
  793. $form_state['post'] = $form['#post'] = $_POST;
  794. // Enable the submit/validate handlers to determine whether AHAH-submittted.
  795. $form_state['ahah_submission'] = TRUE;
  796. $form['#programmed'] = $form['#redirect'] = FALSE;
  797. drupal_process_form($form_id, $form, $form_state);
  798. $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
  799. $form_element = $form['add_fields']['chado'];
  800. // Remove the wrapper so we don't double it up.
  801. unset($form_element['#prefix'], $form_element['#suffix']);
  802. $output = theme('status_messages');
  803. $output .= drupal_render($form_element);
  804. // Final rendering callback.
  805. print drupal_json(array('status' => TRUE, 'data' => $output));
  806. exit();
  807. }
  808. /**
  809. * AHAH Function: Replace $form['add_fields'] in tripal_bulk_loader_add_template_base_form
  810. *
  811. * @return
  812. * JSON Data printed to the screen
  813. */
  814. function tripal_bulk_loader_add_field_type_ahah () {
  815. $form_state = array('storage' => NULL, 'submitted' => FALSE);
  816. $form_build_id = $_POST['form_build_id'];
  817. $form = form_get_cache($form_build_id, $form_state);
  818. $args = $form['#parameters'];
  819. $form_id = array_shift($args);
  820. $form_state['post'] = $form['#post'] = $_POST;
  821. // Enable the submit/validate handlers to determine whether AHAH-submittted.
  822. $form_state['ahah_submission'] = TRUE;
  823. $form['#programmed'] = $form['#redirect'] = FALSE;
  824. drupal_process_form($form_id, $form, $form_state);
  825. $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
  826. $form_element = $form['add_fields'];
  827. // Remove the wrapper so we don't double it up.
  828. unset($form_element['#prefix'], $form_element['#suffix']);
  829. $output = theme('status_messages');
  830. $output .= drupal_render($form_element);
  831. // Final rendering callback.
  832. print drupal_json(array('status' => TRUE, 'data' => $output));
  833. exit();
  834. }
  835. /**
  836. * AHAH Function: Replace $form['edit_fields'] in tripal_bulk_loader_edit_template_base_form
  837. *
  838. * @return
  839. * JSON Data printed to the screen
  840. */
  841. function tripal_bulk_loader_edit_fields_ahah () {
  842. $form_state = array('storage' => NULL, 'submitted' => FALSE);
  843. $form_build_id = $_POST['form_build_id'];
  844. $form = form_get_cache($form_build_id, $form_state);
  845. $args = $form['#parameters'];
  846. $form_id = array_shift($args);
  847. $form_state['post'] = $form['#post'] = $_POST;
  848. // Enable the submit/validate handlers to determine whether AHAH-submittted.
  849. $form_state['ahah_submission'] = TRUE;
  850. $form['#programmed'] = $form['#redirect'] = FALSE;
  851. drupal_process_form($form_id, $form, $form_state);
  852. $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
  853. $form_element = $form['edit_fields'];
  854. // Remove the wrapper so we don't double it up.
  855. unset($form_element['#prefix'], $form_element['#suffix']);
  856. $output = theme('status_messages');
  857. $output .= drupal_render($form_element);
  858. // Final rendering callback.
  859. print drupal_json(array('status' => TRUE, 'data' => $output));
  860. exit();
  861. }
  862. /**
  863. * AHAH Function: Replace $form['edit_fields'] in tripal_bulk_loader_edit_template_field_form
  864. *
  865. * @return
  866. * JSON Data printed to the screen
  867. */
  868. function tripal_bulk_loader_edit_field_type_ahah () {
  869. $form_state = array('storage' => NULL, 'submitted' => FALSE);
  870. $form_build_id = $_POST['form_build_id'];
  871. $form = form_get_cache($form_build_id, $form_state);
  872. $args = $form['#parameters'];
  873. $form_id = array_shift($args);
  874. $form_state['post'] = $form['#post'] = $_POST;
  875. // Enable the submit/validate handlers to determine whether AHAH-submittted.
  876. $form_state['ahah_submission'] = TRUE;
  877. $form['#programmed'] = $form['#redirect'] = FALSE;
  878. drupal_process_form($form_id, $form, $form_state);
  879. $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
  880. $form_element = $form['edit_fields'];
  881. // Remove the wrapper so we don't double it up.
  882. unset($form_element['#prefix'], $form_element['#suffix']);
  883. $output = theme('status_messages');
  884. $output .= drupal_render($form_element);
  885. // Final rendering callback.
  886. print drupal_json(array('status' => TRUE, 'data' => $output));
  887. exit();
  888. }
  889. /**
  890. * AHAH Function: Replace $form['edit_fields']['chado'] in tripal_bulk_loader_edit_template_field_form
  891. *
  892. * @return
  893. * JSON Data printed to the screen
  894. */
  895. function tripal_bulk_loader_edit_chado_column_ahah () {
  896. $form_state = array('storage' => NULL, 'submitted' => FALSE);
  897. $form_build_id = $_POST['form_build_id'];
  898. $form = form_get_cache($form_build_id, $form_state);
  899. $args = $form['#parameters'];
  900. $form_id = array_shift($args);
  901. $form_state['post'] = $form['#post'] = $_POST;
  902. // Enable the submit/validate handlers to determine whether AHAH-submittted.
  903. $form_state['ahah_submission'] = TRUE;
  904. $form['#programmed'] = $form['#redirect'] = FALSE;
  905. drupal_process_form($form_id, $form, $form_state);
  906. $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
  907. $form_element = $form['edit_fields']['chado'];
  908. // Remove the wrapper so we don't double it up.
  909. unset($form_element['#prefix'], $form_element['#suffix']);
  910. $output = theme('status_messages');
  911. $output .= drupal_render($form_element);
  912. // Final rendering callback.
  913. print drupal_json(array('status' => TRUE, 'data' => $output));
  914. exit();
  915. }