tripal_views_integration.inc 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. <?php
  2. /**
  3. * Purpose: Provide Guidance to new Tripal Admin
  4. *
  5. * @return
  6. * HTML Formatted text
  7. *
  8. * @ingroup tripal_views_integration
  9. */
  10. function tripal_core_views_description_page() {
  11. $text .= '<h3>Tripal Views Quick Links:</h3>';
  12. $text .= "<ul>
  13. <li><a href=\"".url("admin/tripal/views/mviews") . "\">List of Materialized Views (MViews)</a></li>
  14. <li><a href=\"".url("admin/tripal/views/mviews/new") . "\">Create a new MViews</a></li>
  15. <li><a href=\"".url("admin/tripal/views/integration/mviews") . "\">List of integrated MViews</a></li>
  16. <li><a href=\"".url("admin/tripal/views/integration/mviews/new"). "\">Integrate a MView</a></li>
  17. <li><a href=\"".url("admin/tripal/views/integration/chado"). "\">List of integrated Chado tables</a></li>
  18. <li><a href=\"".url("admin/tripal/views/integration/chado/new"). "\">Integrate a Chado tables</a></li>
  19. </ul>";
  20. $text .= '<h3>Views Integartion Description:</h3>';
  21. $text .= '<p>Tripal Views provides an interface for integrating <a href="http://drupal.org/project/views">Drupal Views</a>
  22. with Tripal materialized views. This will allow site administrators to create custom queries for the materialized views
  23. and in turn provide custom content pages, custom blocks and custom search forms. The forms allow a site administrator
  24. to select a materialized view and associate other Chado tables on which the view can join. Usage of this module requires
  25. a good understanding of foreign-key relationships in Chado.
  26. </p>';
  27. $text .= '<h3>Setup Instructions:</h3>';
  28. $text .= '<p>After installation of the Tripal core module. The following tasks should be performed
  29. <ol>
  30. <li><b>Set Permissions</b>: To allow access to site administrators for this module, simply
  31. <a href="'.url('admin/user/permissions').'">assign permissions</a> to the appropriate user roles for the
  32. permission type "manage tripal_views_integration". </li>
  33. </ol>
  34. </p>';
  35. $text .= '<h3>Usage Instructions:</h3>';
  36. $text .= "<p>To use Tripal Views integration follow these steps:
  37. <ol>
  38. <li><b>Identify or create a materialized view:</b> Using the <a href=\"".url("admin/tripal/views/mviews") . "\">
  39. Tripal materialized View</a> interface, identify the view you would like to integrate or create a new one.</li>
  40. <li><b>Setup the Views Integration</b>: Navigate to the <a href=\"".url("admin/tripal/views/integration/mviews/new") . "\">
  41. Tripal views integration setup page</a> to integrate the selected materialized view. Provide a user friendly name
  42. and description to help you remember the purpose for integrating the view. Next, select the view you want to integrate
  43. from the provided select box. If your materialized view has fields that can join with other Chado tables, you may
  44. provide those relationships in the provided form. Finally, if your fields require a special handler for display, you
  45. may select it from the drop down provided</li>
  46. <li><b>Create custom pages/block/search form</b>: After saving setup information from step 2 above, you will be redirected to the
  47. Drupal Views interface</a> where you can create a custom page, block or search form.</li>
  48. <li><b>Review your integrated views</b>: A page providing a
  49. <a href=\"".url("admin/tripal/views/integration/mviews/list") . "\">list of all integrated views</a> is provided. You may
  50. view this page to see all integrated views, but also to remove any unwanted integrations.</li>
  51. </ol>
  52. </p>";
  53. return $text;
  54. }
  55. /**
  56. *
  57. * @ingroup tripal_views_integration
  58. */
  59. function tripal_core_views_integration_setup_list(){
  60. $header = array('', 'Drupal Views Type Name', 'Table Name', 'Is Mview', 'Comment','');
  61. $rows = array();
  62. // get the list of materialized views
  63. $tviews = db_query('SELECT * FROM {tripal_views}');
  64. while($tview = db_fetch_object($tviews)){
  65. if($tview->mview_id){
  66. // get the materialized view
  67. $sql = "SELECT * FROM {tripal_mviews} WHERE mview_id = %d";
  68. $mview = db_fetch_object(db_query($sql,$tview->mview_id));
  69. $rows[] = array(
  70. l('Edit',"admin/tripal/views/integration/edit/".$tview->setup_id) ,
  71. $tview->name,
  72. $mview->mv_table,
  73. 'Yes',
  74. $tview->comment,
  75. l('Delete',"admin/tripal/views/integration/delete/".$tview->setup_id),
  76. );
  77. } else {
  78. // TODO: customize for Chado tables
  79. }
  80. }
  81. $rows[] = array(
  82. 'data' => array(
  83. array('data' => l('Add a new entry',"admin/tripal/views/integration/new") . " | " .
  84. l("Create View",'admin/build/views/add'),
  85. 'colspan' => 6),
  86. )
  87. );
  88. return theme('table', $header, $rows);
  89. }
  90. /**
  91. *
  92. * @ingroup tripal_views_integration
  93. */
  94. function tripal_core_views_integration_delete($setup_id){
  95. db_query("DELETE FROM {tripal_views} WHERE setup_id = %d",$setup_id);
  96. db_query("DELETE FROM {tripal_views_handlers} WHERE setup_id = %d",$setup_id);
  97. db_query("DELETE FROM {tripal_views_join} WHERE setup_id = %d",$setup_id);
  98. drupal_set_message("Record Deleted");
  99. drupal_goto('admin/tripal/views/integration');
  100. }
  101. /**
  102. *
  103. * @ingroup tripal_views_integration
  104. */
  105. function tripal_core_views_integration_form(&$form_state, $setup_id = NULL){
  106. $form = array();
  107. $data = array();
  108. $form['#cache'] = TRUE;
  109. // ahah_helper requires us to register the form with it's module
  110. ahah_helper_register($form, $form_state);
  111. // if a setup_id is provided then we want to get the form defaults
  112. $setup_obj = array();
  113. if(isset($setup_id)){
  114. // get the deafult setup values
  115. $sql = "SELECT * FROM {tripal_views} WHERE setup_id = %d";
  116. $setup_obj = db_fetch_object(db_query($sql,$setup_id));
  117. $mview_id = $setup_obj->mview_id;
  118. $table_name = $setup_obj->table_name;
  119. $form_state['storage']['mview_id'] = $mview_id;
  120. // get the default join settings and handlers
  121. $sql = "SELECT * FROM {tripal_views_join} WHERE setup_id = %d";
  122. $query = db_query($sql,$setup_id);
  123. $default_joins = array();
  124. while ($join = db_fetch_object($query)){
  125. $default_joins[$join->base_field]['left_table'] = $join->left_table;
  126. $default_joins[$join->base_field]['left_field'] = $join->left_field;
  127. }
  128. // get the default handlers
  129. $sql = "SELECT * FROM {tripal_views_handlers} WHERE setup_id = %d";
  130. $query = db_query($sql,$setup_id);
  131. $default_handlers = array();
  132. while ($handler = db_fetch_object($query)){
  133. $default_handlers[$handler->column_name][$handler->handler_type]['handler_name'] = $handler->handler_name;
  134. $default_handlers[$handler->column_name][$handler->handler_type]['arguments'] = $handler->arguments;
  135. }
  136. // add in the setup_id for the form so we know this is an update not an insert
  137. $form['setup_id'] = array(
  138. '#type' => 'hidden',
  139. '#value' => $setup_id,
  140. );
  141. }
  142. // add a fieldset for the MView & Chado table selectors
  143. $form['base_table_type'] = array(
  144. '#type' => 'fieldset',
  145. '#title' => 'Base Table',
  146. '#description' => 'Please select either a materialized view or a Chado table for integration with '.
  147. 'Drupal Views. In Drupal Views terminology, the selected table becomes the "base table". '.
  148. 'After you select a table from either list, the fields from that table will appear below '.
  149. 'and you can specify other tables to join with and handlers.',
  150. );
  151. // build the form element that lists the materialized views
  152. $query = db_query("SELECT mview_id,name FROM {tripal_mviews} ORDER BY name");
  153. $mview_tables = array();
  154. $mview_tables['0'] = 'Select';
  155. while ($mview = db_fetch_object($query)){
  156. $mview_tables[$mview->mview_id] = $mview->name;
  157. }
  158. $form['base_table_type']['mview_id'] = array(
  159. '#title' => t('Materialized View'),
  160. '#type' => 'select',
  161. '#options' => $mview_tables,
  162. '#description' => 'Which materialized view to use.',
  163. '#default_value' => $setup_obj->mview_id,
  164. '#ahah' => array(
  165. 'path' => ahah_helper_path(array('view_setup_table')),
  166. 'wrapper' => 'table-rows-div',
  167. 'effect' => 'fade',
  168. 'event' => 'change',
  169. 'method' => 'replace',
  170. ),
  171. );
  172. // build the form element for the Chado tables
  173. $chado_tables = tripal_core_get_chado_tables();
  174. $chado_tables = array_merge(array('Select',), $chado_tables);
  175. $form['base_table_type']['table_name'] = array(
  176. '#title' => t('Chado Table'),
  177. '#type' => 'select',
  178. '#options' => $chado_tables,
  179. '#description' => 'Which Chado table to use.',
  180. '#default_value' => $setup_obj->table_name,
  181. '#ahah' => array(
  182. 'path' => ahah_helper_path(array('view_setup_table')),
  183. 'wrapper' => 'table-rows-div',
  184. 'effect' => 'fade',
  185. 'event' => 'change',
  186. 'method' => 'replace',
  187. ),
  188. );
  189. $form['views_type'] = array(
  190. '#type' => 'fieldset',
  191. '#title' => 'View Type',
  192. '#description' => 'Here you can provide the "type" of View you want to create.',
  193. );
  194. // field for the name of the
  195. $form['views_type']['row_name'] = array(
  196. '#title' => t('View Type Name'),
  197. '#type' => 'textfield',
  198. '#default_value' => $setup_obj->name,
  199. '#size' => 60,
  200. '#maxlength' => 128,
  201. '#description' => 'Provide the view type name. This is the name that will appear in '.
  202. 'the Drupal Views interface when adding a new view. The view type name '.
  203. 'must be unique. You may use the a materialized view or Chado table '.
  204. 'multiple times as the base table for different type names. This allows '.
  205. 'for differetn handlers to be '.
  206. 'applied to the same table in different ways.',
  207. '#required' => TRUE,
  208. );
  209. if(isset($setup_id)){
  210. $form['row_name']['#attributes'] = array('readonly' => 'readonly');
  211. }
  212. $form['views_type']['row_description'] = array(
  213. '#title' => t('Comment'),
  214. '#type' => 'textarea',
  215. '#description' => '(Optional). Provide any details regarding this setup you would like.',
  216. '#required' => FALSE,
  217. );
  218. // we need a div block where the table fields will get put when the
  219. // AHAH callback is made
  220. $form['view_setup_table'] = array(
  221. '#type' => 'item',
  222. '#prefix' => '<div id="table-rows-div">',
  223. '#suffix' => '</div>',
  224. );
  225. // add the fieldset for the table fields, but only if the $mview_id or $table_name
  226. // is set. The only times these values are set is if we're editing an existing
  227. // record or if the AHAH callback is being made.
  228. if ($form_state['storage']['mview_id'] or $form_state['storage']['table_name']){
  229. $mview_id = $form_state['storage']['mview_id'];
  230. $table_name = $form_state['storage']['table_name'];
  231. $form['view_setup_table'] = array(
  232. '#type' => 'fieldset',
  233. '#title' => 'Join Selection',
  234. '#prefix' => '<div id="fieldset-table-rows-wrapper">',
  235. '#suffix' => '</div>',
  236. );
  237. // get the columns in this materialized view. They are separated by commas
  238. // where the first word is the column name and the rest is the type
  239. if($mview_id){
  240. $sql = "SELECT mv_specs FROM {tripal_mviews} WHERE mview_id = %d";
  241. $mview = db_fetch_object(db_query($sql,$mview_id));
  242. $columns = explode(",",$mview->mv_specs);
  243. } else {
  244. // TODO: get chado table columns and add them to the $columns array
  245. }
  246. $i=1;
  247. $form['view_setup_table']["instructions"] = array(
  248. '#type' => 'markup',
  249. '#value' => "Select an optional table to which the fields of the ".
  250. "materialized view can join. If a field does not need to ".
  251. "join you may leave the selection blank.",
  252. );
  253. $data['field_types'] = array();
  254. // get the list of chado tables to join on
  255. $chado_join_tables = tripal_core_get_chado_tables();
  256. $chado_join_tables = array_merge(array('Select a Join Table',), $chado_join_tables);
  257. // get list of all handlers
  258. $all_handlers = tripal_core_views_integration_discover_handlers();
  259. $handlers_fields = array();
  260. $handlers_filters = array();
  261. $handlers_sort = array();
  262. $handlers_arguments = array();
  263. $handlers_join = array();
  264. $handlers_rel = array();
  265. $handlers_fields[0] = "Select a field handler";
  266. $handlers_filters[0] = "Select a filter handler";
  267. $handlers_sort[0] = "Select a sort handler";
  268. $handlers_argument[0] = "Select an argument handler";
  269. $handlers_join[0] = "Select a join handler";
  270. $handlers_rel[0] = "Select a relationship handler";
  271. foreach($all_handlers as $handler){
  272. if(preg_match("/views_handler_field/",$handler)){
  273. $handlers_fields[$handler] = $handler;
  274. }
  275. if(preg_match("/views_handler_filter/",$handler)){
  276. $handlers_filters[$handler] = $handler;
  277. }
  278. if(preg_match("/views_handler_sort/",$handler)){
  279. $handlers_sort[$handler] = $handler;
  280. }
  281. if(preg_match("/views_handler_argument/",$handler)){
  282. $handlers_argument[$handler] = $handler;
  283. }
  284. if(preg_match("/views_handler_join/",$handler)){
  285. $handlers_join[$handler] = $handler;
  286. }
  287. if(preg_match("/views_handler_relationship/",$handler)){
  288. $handlers_rel[$handler] = $handler;
  289. }
  290. }
  291. // generate a unique $table_id for keeping track of the table
  292. if($mview_id){
  293. $table_id = $mview_id;
  294. } else {
  295. $table_id = $table_name;
  296. }
  297. // now iterate through the columns of the materialized view or
  298. // chado table and generate the join and handler fields
  299. foreach ($columns as $column){
  300. $column = trim($column); // trim trailing and leading spaces
  301. preg_match("/^(.*?)\ (.*?)$/",$column,$matches);
  302. $column_name = $matches[1];
  303. $column_type = $matches[2];
  304. $form['view_setup_table']["fields_start_$table_id-$i"] = array(
  305. '#type' => 'markup',
  306. '#value' => "<div class=\"fields-new-row\">",
  307. );
  308. $form['view_setup_table']["fields_name_$table_id-$i"] = array(
  309. '#type' => 'markup',
  310. '#attributes' => array('class' => 'fields-column-name'),
  311. '#value' => "<div class=\"column-id\">".
  312. "<span class=\"column-name\">$column_name</span>".
  313. "<br><span class=\"column-type\">$column_type</span>".
  314. "</div>".
  315. "<div class=\"column-form-fields\"><div class=\"column-one\">",
  316. );
  317. $data['field_types'][$column_name] = $column_type;
  318. // set the default values for the join table and columns
  319. $default_join_table = 0;
  320. $default_join_field = 0;
  321. if(isset($setup_id) && !isset($form_state['storage']["fields_join_$table_id-$i"])){
  322. $default_join_table = $default_joins[$column_name]['left_table'];
  323. $default_join_field = $default_joins[$column_name]['left_field'];
  324. $form_state['storage']["fields_join_$table_id-$i"] = $default_join_table;
  325. $form_state['storage']["fields_join_column_$table_id-$i"] = $default_join_field;
  326. }
  327. else{
  328. $default_join_table = $form_state['storage']["fields_join_$table_id-$i"];
  329. $default_join_field = $form_state['storage']["fields_join_column_$table_id-$i"];
  330. }
  331. $form['view_setup_table']["fields_join_$table_id-$i"] = array(
  332. '#type' => 'select',
  333. '#prefix' => "<div class=\"fields-column-join\">",
  334. '#suffix' => "</div>",
  335. '#options' => $chado_join_tables,
  336. '#required' => FALSE,
  337. '#default_value' => $default_join_table,
  338. '#ahah' => array(
  339. 'path' => ahah_helper_path(array("view_setup_table","fields_join_column_$table_id-$i")),
  340. 'wrapper' => "fields-column-join-column-$table_id-$i",
  341. 'effect' => 'fade',
  342. 'event' => 'change',
  343. 'method' => 'replace',
  344. ),
  345. );
  346. $columns = array();
  347. if($default_join_table){
  348. $table_desc = module_invoke_all('chado_'.$default_join_table.'_schema');
  349. foreach ($table_desc['fields'] as $column => $def){
  350. $columns[$column] = $column;
  351. }
  352. } else {
  353. $columns = array('Select Join Column');
  354. }
  355. $form['view_setup_table']["fields_join_column_$table_id-$i"] = array(
  356. '#type' => 'select',
  357. '#prefix' => " <div id=\"fields-column-join-column-$table_id-$i\" class=\"fields-column-join-column\">",
  358. '#suffix' => "</div></div>",
  359. '#options' => $columns,
  360. '#required' => FALSE,
  361. '#default_value' => $default_join_field
  362. );
  363. // create the handler fields
  364. $default_field_handler = 0;
  365. if(isset($setup_id) && !isset($form_state['storage']["fields_field_handler_$table_id-$i"])){
  366. $default_field_handler = $default_handlers[$column_name]['field']['handler_name'];
  367. $form_state['storage']["fields_field_handler_$table_id-$i"] = $default_field_handler;
  368. }
  369. else {
  370. $default_field_handler = $form_state['storage']["fields_field_handler_$table_id-$i"];
  371. }
  372. $form['view_setup_table']["fields_field_handler_$table_id-$i"] = array(
  373. '#type' => 'select',
  374. '#prefix' => "<div class=\"column-two\">".
  375. "<div class=\"fields-field-handler\">",
  376. '#suffix' => "</div>",
  377. '#options' => $handlers_fields,
  378. '#required' => FALSE,
  379. '#default_value' => $default_field_handler,
  380. );
  381. $default_filter_handler = 0;
  382. if(isset($setup_id) && !isset($form_state['storage']["fields_filter_handler_$table_id-$i"])){
  383. $default_filter_handler = $default_handlers[$column_name]['filter']['handler_name'];
  384. $form_state['storage']["fields_filter_handler_$table_id-$i"]= $default_filter_handler;
  385. }
  386. else {
  387. $default_filter_handler = $form_state['storage']["fields_filter_handler_$table_id-$i"];
  388. }
  389. $form['view_setup_table']["fields_filter_handler_$table_id-$i"] = array(
  390. '#type' => 'select',
  391. '#prefix' => "<div class=\"fields-filter-handler\">",
  392. '#suffix' => "</div>",
  393. '#options' => $handlers_filters,
  394. '#required' => FALSE,
  395. '#default_value' => $default_filter_handler,
  396. );
  397. $default_sort_handler = 0;
  398. if(isset($setup_id) && !isset($form_state['storage']["fields_sort_handler_$table_id-$i"])){
  399. $default_sort_handler = $default_handlers[$column_name]['sort']['handler_name'];
  400. $form_state['storage']["fields_sort_handler_$table_id-$i"] = $default_sort_handler;
  401. }
  402. else {
  403. $default_sort_handler = $form_state['storage']["fields_sort_handler_$table_id-$i"];
  404. }
  405. $form['view_setup_table']["fields_sort_handler_$table_id-$i"] = array(
  406. '#type' => 'select',
  407. '#prefix' => "<div class=\"fields-sort-handler\">",
  408. '#suffix' => "</div>",
  409. '#options' => $handlers_sort,
  410. '#required' => FALSE,
  411. '#default_value' => $default_sort_handler,
  412. );
  413. $default_argument_handler = 0;
  414. if(isset($setup_id) && !isset($form_state['storage']["fields_argument_handler_$table_id-$i"])){
  415. $default_argument_handler = $default_handlers[$column_name]['argument']['handler_name'];
  416. $form_state['storage']["fields_argument_handler_$table_id-$i"]=$default_argument_handler ;
  417. }
  418. else {
  419. $default_argument_handler = $form_state['storage']["fields_argument_handler_$table_id-$i"];
  420. }
  421. $form['view_setup_table']["fields_argument_handler_$table_id-$i"] = array(
  422. '#type' => 'select',
  423. '#prefix' => "<div class=\"fields-argument-handler\">",
  424. '#suffix' => "</div>",
  425. '#options' => $handlers_argument,
  426. '#required' => FALSE,
  427. '#default_value' => $default_argument_handler,
  428. );
  429. $default_relationship_handler = 0;
  430. if(isset($setup_id) && !isset($form_state['storage']["fields_relationship_handler_$table_id-$i"])){
  431. $default_relationship_handler = $default_handlers[$column_name]['relationship']['handler_name'];
  432. $form_state['storage']["fields_relationship_handler_$table_id-$i"]=$default_relationship_handler;
  433. }
  434. else {
  435. $default_relationship_handler = $form_state['storage']["fields_relationship_handler_$table_id-$i"];
  436. }
  437. $form['view_setup_table']["fields_relationship_handler_$table_id-$i"] = array(
  438. '#type' => 'select',
  439. '#prefix' => "<div class=\"fields-relationship-handler\">",
  440. '#suffix' => "</div>",
  441. '#options' => $handlers_rel,
  442. '#required' => FALSE,
  443. '#default_value' => $default_relationship_handler,
  444. );
  445. $default_join_handler = 0;
  446. if(isset($setup_id) && !isset($form_state['storage']["fields_join_handler_$table_id-$i"])){
  447. $default_join_handler = $default_handlers[$column_name]['join']['handler_name'];
  448. $form_state['storage']["fields_join_handler_$table_id-$i"]=$default_join_handler;
  449. }
  450. else {
  451. $default_join_handler = $form_state['storage']["fields_join_handler_$table_id-$i"];
  452. }
  453. $form['view_setup_table']["fields_join_handler_$table_id-$i"] = array(
  454. '#type' => 'select',
  455. '#prefix' => "<div class=\"fields-join-handler\">",
  456. '#suffix' => "</div></div>",
  457. '#options' => $handlers_join,
  458. '#required' => FALSE,
  459. '#default_value' => $default_join_handler,
  460. );
  461. $form['view_setup_table']["fields_end_$i"] = array(
  462. '#type' => 'markup',
  463. '#value' => "</div></div>",
  464. );
  465. $i++;
  466. }
  467. $form['view_setup_table']['save'] = array(
  468. '#type' => 'submit',
  469. '#value' => t('Save'),
  470. );
  471. $data['row_count'] = $i - 1;
  472. }
  473. //use this to put values into $form_state['values']
  474. $form['data'] = array();
  475. //need to find out if storing $form['data'][$key]['#value'] = $value <- is an issue
  476. //since it will give me errors if i try to stare an array instead of $value
  477. //and yet $value can be an array ie "field_types"
  478. foreach ($data as $key => $value) {
  479. $form['data'][$key] = array(
  480. '#type' => 'hidden',
  481. '#value' => $value,
  482. );
  483. }
  484. $form['#redirect'] = 'admin/tripal/views/integration';
  485. return $form;
  486. }
  487. /**
  488. *
  489. * @ingroup tripal_views_integration
  490. */
  491. function tripal_core_views_integration_form_validate($form, &$form_state){
  492. $name_array = explode(" ", $form_state['values']['row_name']);
  493. $mview_id = $form_state['values']['mview_id'];
  494. $table_name = $form_state['values']['table_name'];
  495. if(count($name_array) > 1){
  496. form_set_error($form_state['values']['row_name'], 'The View type name must be a single word only.');
  497. }
  498. if($mview_id and $table_name){
  499. form_set_error($form_state['values']['mview_id'], 'Please select either a materialized view or a Chado table but not both');
  500. }
  501. if(!$mview_id and !$table_name){
  502. form_set_error($form_state['values']['mview_id'], 'Please select either a materialized view or a Chado table');
  503. }
  504. // TODO: do we need to require that a handler be set for each field and each type of handler?
  505. }
  506. /**
  507. *
  508. * @ingroup tripal_views_integration
  509. */
  510. function tripal_core_views_integration_form_submit($form, &$form_state){
  511. $name = $form_state['values']['row_name'];
  512. $mview_id = $form_state['values']['mview_id'];
  513. $table_name = $form_state['values']['table_name'];
  514. $setup_id = $form_state['values']['setup_id'];
  515. if($mview_id){
  516. $table_id = $mview_id;
  517. } else {
  518. $table_id = $table_name;
  519. }
  520. // If this is for a materialized view then we want to add/update that record
  521. $tripal_views_record = array();
  522. if($mview_id){
  523. // get details about this mview
  524. $sql = "SELECT * FROM {tripal_mviews} WHERE mview_id = $mview_id";
  525. $mview = db_fetch_object(db_query($sql));
  526. // build the record for insert/update
  527. $tripal_views_record = array(
  528. 'mview_id' => $mview_id,
  529. 'name' => $name,
  530. 'comment' => $form_state['values']['row_description'],
  531. );
  532. if(!$setup_id){ // this is an insert
  533. if(!drupal_write_record('tripal_views', $tripal_views_record)){
  534. drupal_set_message("Failed to add record.");
  535. return;
  536. }
  537. } else { // this is an update
  538. $tripal_views_record['setup_id'] = $setup_id;
  539. if(!drupal_write_record('tripal_views', $tripal_views_record,array('setup_id'))){
  540. drupal_set_message("Failed to update record.");
  541. return;
  542. }
  543. }
  544. }
  545. // if a chado table then...
  546. if($table_name){
  547. // TODO: add code to update tables for Chado table
  548. }
  549. // if this is an update then clean out the existing joins and handlers so we can add new ones
  550. if($setup_id){
  551. db_query("DELETE FROM {tripal_views_join} WHERE setup_id = %d",$setup_id);
  552. db_query("DELETE FROM {tripal_views_handlers} WHERE setup_id = %d",$setup_id);
  553. }
  554. // iterate through the columns of the form and add
  555. // the joins if provided, and the handlers
  556. $i = 1;
  557. foreach ($form_state['values']['field_types'] as $key => $value){
  558. // first add the join if it exists
  559. $left_table = $form_state['values']["fields_join_$table_id-$i"];
  560. $left_column = $form_state['values']["fields_join_column_$table_id-$i"];
  561. if($left_column){
  562. $view_join_record = array(
  563. 'setup_id' => $tripal_views_record['setup_id'],
  564. 'base_table' => $mview->mv_table,
  565. 'base_field' => $key,
  566. 'left_table' => $left_table,
  567. 'left_field' => $left_column,
  568. );
  569. // write the new joins to the database
  570. drupal_write_record('tripal_views_join', $view_join_record);
  571. }
  572. // add the hanlders
  573. $handlers = array('filter','field','sort','argument','join','relationship');
  574. foreach($handlers as $handler){
  575. $handler_name = $form_state['values']["fields_".$handler."_handler_$table_id-$i"];
  576. if($handler_name){
  577. $handler_record = array(
  578. 'setup_id' => $tripal_views_record['setup_id'],
  579. 'column_name' => $key,
  580. 'handler_type' => $handler,
  581. 'handler_name' => $handler_name,
  582. );
  583. drupal_write_record('tripal_views_handlers', $handler_record);
  584. }
  585. }
  586. $i++;
  587. }
  588. if(!$setup_id){
  589. drupal_set_message('Record Updated');
  590. } else {
  591. drupal_set_message('Record Added');
  592. }
  593. }
  594. /**
  595. *
  596. * @ingroup tripal_views_integration
  597. */
  598. function tripal_core_views_integration_discover_handlers() {
  599. $handlers = array();
  600. // Get handlers from all modules.
  601. foreach (module_implements('views_handlers') as $module) {
  602. $function = $module . '_views_handlers';
  603. $result = $function();
  604. if (!is_array($result)) {
  605. continue;
  606. }
  607. foreach ($result['handlers'] as $handler => $parent){
  608. $handlers[] = $handler;
  609. }
  610. }
  611. // these handlers are hard coded because I could not
  612. // get the views_views_handlers() function to be called
  613. // in the code above. However, we will be creating
  614. // Chado wrappers for many of these and once that work
  615. // is done these will no longer be needed.
  616. // argument handlers
  617. $handlers[] = 'views_handler_argument';
  618. $handlers[] = 'views_handler_argument_numeric';
  619. $handlers[] = 'views_handler_argument_formula';
  620. $handlers[] = 'views_handler_argument_date';
  621. $handlers[] = 'views_handler_argument_string';
  622. $handlers[] = 'views_handler_argument_many_to_one';
  623. $handlers[] = 'views_handler_argument_null';
  624. // field handlers
  625. $handlers[] = 'views_handler_field';
  626. $handlers[] = 'views_handler_field_date';
  627. $handlers[] = 'views_handler_field_boolean';
  628. $handlers[] = 'views_handler_field_markup';
  629. $handlers[] = 'views_handler_field_xss';
  630. $handlers[] = 'views_handler_field_url';
  631. $handlers[] = 'views_handler_field_file_size';
  632. $handlers[] = 'views_handler_field_prerender_list';
  633. $handlers[] = 'views_handler_field_numeric';
  634. $handlers[] = 'views_handler_field_custom';
  635. $handlers[] = 'views_handler_field_counter';
  636. // filter handlers
  637. $handlers[] = 'views_handler_filter';
  638. $handlers[] = 'views_handler_filter_equality';
  639. $handlers[] = 'views_handler_filter_string';
  640. $handlers[] = 'views_handler_filter_boolean_operator';
  641. $handlers[] = 'views_handler_filter_boolean_operator_string';
  642. $handlers[] = 'views_handler_filter_in_operator';
  643. $handlers[] = 'views_handler_filter_numeric';
  644. $handlers[] = 'views_handler_filter_float';
  645. $handlers[] = 'views_handler_filter_date';
  646. $handlers[] = 'views_handler_filter_many_to_one';
  647. // relationship handlers
  648. $handlers[] = 'views_handler_relationship';
  649. // sort handlers
  650. $handlers[] = 'views_handler_sort';
  651. $handlers[] = 'views_handler_sort_formula';
  652. $handlers[] = 'views_handler_sort_date';
  653. $handlers[] = 'views_handler_sort_menu_hierarchy';
  654. $handlers[] = 'views_handler_sort_random';
  655. return $handlers;
  656. }