4
4
namespace FormTools \Modules \ExportManager ;
5
5
6
6
use FormTools \Core ;
7
+ use FormTools \Fields ;
8
+ use FormTools \FieldTypes ;
9
+ use FormTools \Forms ;
10
+ use FormTools \General as CoreGeneral ;
7
11
use FormTools \Hooks ;
8
12
use FormTools \Module as FormToolsModule ;
9
13
use FormTools \Modules ;
10
14
use FormTools \Sessions ;
11
15
use FormTools \Settings ;
16
+ use FormTools \Submissions ;
17
+ use FormTools \Views ;
18
+
12
19
use PDOException ;
13
20
14
21
@@ -19,8 +26,8 @@ class Module extends FormToolsModule
19
26
protected $ author = "Ben Keen " ;
20
27
protected $ authorEmail =
"[email protected] " ;
21
28
protected $ authorLink = "http://formtools.org " ;
22
- protected $ version = "3.0.0 " ;
23
- protected $ date = "2017-10-01 " ;
29
+ protected $ version = "3.0.1 " ;
30
+ protected $ date = "2017-10-07 " ;
24
31
protected $ originLanguage = "en_us " ;
25
32
protected $ jsFiles = array (
26
33
"{MODULEROOT}/scripts/admin.js " ,
@@ -360,7 +367,7 @@ public function addExcelExportGroup()
360
367
{assign var=value value= \$submission. \$col_name}
361
368
<td>
362
369
{smart_display_field form_id= \$form_id view_id= \$view_id submission_id= \$submission_id
363
- field_info= \$field_info field_types= \$field_types settings= \$settings value= \$value escape= \ "excel \ "}
370
+ field_info= \$field_info field_types= \$field_types settings= \$settings value= \$value escape="excel"}
364
371
</td>
365
372
{/foreach}
366
373
</tr>
@@ -558,4 +565,179 @@ private function createTables()
558
565
$ db ->execute ();
559
566
}
560
567
}
568
+
569
+ public function export ($ params )
570
+ {
571
+ $ L = $ this ->getLangStrings ();
572
+ $ root_dir = Core::getRootDir ();
573
+ $ root_url = Core::getRootUrl ();
574
+
575
+ // if any of the required fields weren't entered, just output a simple blank message
576
+ if (empty ($ params ["form_id " ]) || empty ($ params ["view_id " ]) || empty ($ params ["order " ]) ||
577
+ empty ($ params ["search_fields " ]) || empty ($ params ["export_group_id " ])) {
578
+ echo $ L ["notify_export_incomplete_fields " ];
579
+ exit ;
580
+ }
581
+
582
+ $ form_id = $ params ["form_id " ];
583
+ $ view_id = $ params ["view_id " ];
584
+ $ order = $ params ["order " ];
585
+ $ search_fields = $ params ["search_fields " ];
586
+ $ export_group_id = $ params ["export_group_id " ];
587
+ $ export_type_id = $ params ["export_type_id " ];
588
+ $ results = $ params ["results " ];
589
+
590
+ set_time_limit (300 );
591
+
592
+ // if the user only wants to display the currently selected rows, limit the query to those submission IDs
593
+ $ submission_ids = array ();
594
+ if ($ results == "selected " ) {
595
+ $ submission_ids = Sessions::get ("form_ {$ form_id }_selected_submissions " );
596
+ }
597
+
598
+ // perform the almighty search query
599
+ $ results_info = Submissions::searchSubmissions ($ form_id , $ view_id , "all " , 1 , $ order , "all " , $ search_fields , $ submission_ids );
600
+
601
+ $ form_info = Forms::getForm ($ form_id );
602
+ $ view_info = Views::getView ($ view_id );
603
+ $ form_fields = Fields::getFormFields ($ form_id , array (
604
+ "include_field_type_info " => true ,
605
+ "include_field_settings " => true
606
+ ));
607
+ $ field_types = FieldTypes::get (true );
608
+
609
+ // display_fields contains ALL the information we need for the fields in the template
610
+ $ display_fields = array ();
611
+ foreach ($ view_info ["fields " ] as $ view_field_info ) {
612
+ $ curr_field_id = $ view_field_info ["field_id " ];
613
+ foreach ($ form_fields as $ form_field_info ) {
614
+ if ($ form_field_info ["field_id " ] != $ curr_field_id ) {
615
+ continue ;
616
+ }
617
+ $ display_fields [] = array_merge ($ form_field_info , $ view_field_info );
618
+ }
619
+ }
620
+
621
+ // first, build the list of information we're going to send to the export type smarty template
622
+ $ placeholders = General::getExportFilenamePlaceholderHash ();
623
+ $ placeholders ["export_group_id " ] = $ export_group_id ;
624
+ $ placeholders ["export_type_id " ] = $ export_type_id ;
625
+ $ placeholders ["export_group_results " ] = $ results ;
626
+ $ placeholders ["field_types " ] = $ field_types ;
627
+ $ placeholders ["same_page " ] = CoreGeneral::getCleanPhpSelf ();
628
+ $ placeholders ["display_fields " ] = $ display_fields ;
629
+ $ placeholders ["submissions " ] = $ results_info ["search_rows " ];
630
+ $ placeholders ["num_results " ] = $ results_info ["search_num_results " ];
631
+ $ placeholders ["view_num_results " ] = $ results_info ["view_num_results " ];
632
+ $ placeholders ["form_info " ] = $ form_info ;
633
+ $ placeholders ["view_info " ] = $ view_info ;
634
+ $ placeholders ["timezone_offset " ] = Sessions::get ("account.timezone_offset " );
635
+
636
+ // pull out a few things into top level placeholders for easy use
637
+ $ placeholders ["form_id " ] = $ form_id ;
638
+ $ placeholders ["form_name " ] = $ form_info ["form_name " ];
639
+ $ placeholders ["form_url " ] = $ form_info ["form_url " ];
640
+ $ placeholders ["view_id " ] = $ view_id ;
641
+ $ placeholders ["view_name " ] = $ view_info ["view_name " ];
642
+ $ placeholders ["settings " ] = Settings::get ();
643
+
644
+ $ export_group_info = ExportGroups::getExportGroup ($ export_group_id );
645
+ $ export_types = ExportTypes::getExportTypes ($ export_group_id );
646
+
647
+
648
+ // if the export type ID isn't available, the export group only contains a single (visible) export type
649
+ $ export_type_info = array ();
650
+ if (empty ($ export_type_id )) {
651
+ foreach ($ export_types as $ curr_export_type_info ) {
652
+ if ($ curr_export_type_info ["export_type_visibility " ] == "show " ) {
653
+ $ export_type_info = $ curr_export_type_info ;
654
+ break ;
655
+ }
656
+ }
657
+ } else {
658
+ $ export_type_info = ExportTypes::getExportType ($ export_type_id );
659
+ }
660
+
661
+ $ placeholders ["export_group_name " ] = CoreGeneral::createSlug (CoreGeneral::evalSmartyString ($ export_group_info ["group_name " ]));
662
+ $ placeholders ["export_group_type " ] = CoreGeneral::createSlug (CoreGeneral::evalSmartyString ($ export_type_info ["export_type_name " ]));
663
+ $ placeholders ["page_type " ] = $ export_group_info ["action " ]; // "file" / "popup" or "new_window"
664
+ $ placeholders ["filename " ] = CoreGeneral::evalSmartyString ($ export_type_info ["filename " ], $ placeholders );
665
+
666
+ $ template = $ export_type_info ["export_type_smarty_template " ];
667
+ $ placeholders ["export_type_name " ] = $ export_type_info ["export_type_name " ];
668
+
669
+ $ plugin_dirs = array ("$ root_dir/modules/export_manager/smarty_plugins " );
670
+ $ export_type_smarty_template = CoreGeneral::evalSmartyString ($ template , $ placeholders , "" , $ plugin_dirs );
671
+
672
+
673
+ // next, add the placeholders needed for the export group smarty template
674
+ $ template = $ export_group_info ["smarty_template " ];
675
+ $ placeholders ["export_group_name " ] = CoreGeneral::evalSmartyString ($ export_group_info ["group_name " ]);
676
+ $ placeholders ["export_types " ] = $ export_types ;
677
+ $ placeholders ["export_type_smarty_template " ] = $ export_type_smarty_template ;
678
+
679
+ $ page = CoreGeneral::evalSmartyString ($ template , $ placeholders );
680
+
681
+ if ($ export_group_info ["action " ] == "new_window " || $ export_group_info ["action " ] == "popup " ) {
682
+
683
+ // if required, send the HTTP headers
684
+ if (!empty ($ export_group_info ["headers " ])) {
685
+ $ headers = preg_replace ("/ \r\n| \r/ " , "\n" , $ export_group_info ["headers " ]);
686
+ $ header_lines = explode ("\n" , $ headers );
687
+ foreach ($ header_lines as $ header ) {
688
+ header (CoreGeneral::evalSmartyString ($ header , $ placeholders ));
689
+ }
690
+ }
691
+ echo $ page ;
692
+
693
+ // create a file on the server
694
+ } else {
695
+ $ settings = Settings::get ("" , "export_manager " );
696
+ $ file_upload_dir = $ settings ["file_upload_dir " ];
697
+ $ file_upload_url = $ settings ["file_upload_url " ];
698
+
699
+ $ file = "$ file_upload_dir/ {$ placeholders ["filename " ]}" ;
700
+ if ($ handle = @fopen ($ file , "w " )) {
701
+ fwrite ($ handle , $ page );
702
+ fclose ($ handle );
703
+ @chmod ($ file , 0777 );
704
+
705
+ $ placeholders = array ("url " => "$ file_upload_url/ {$ placeholders ["filename " ]}" );
706
+ $ message = CoreGeneral::evalSmartyString ($ L ["notify_file_generated " ], $ placeholders );
707
+ echo json_encode (array (
708
+ "success " => 1 ,
709
+ "message " => $ message ,
710
+ "target_message_id " => "ft_message "
711
+ ));
712
+ exit ;
713
+ } else {
714
+ $ placeholders = array (
715
+ "url " => "$ file_upload_url/ {$ placeholders ["filename " ]}" ,
716
+ "folder " => $ file_upload_dir ,
717
+ "export_manager_settings_link " => "$ root_url/modules/export_manager/settings.php "
718
+ );
719
+ $ message = CoreGeneral::evalSmartyString ($ L ["notify_file_not_generated " ], $ placeholders );
720
+ echo json_encode (array (
721
+ "success " => 0 ,
722
+ "message " => $ message ,
723
+ "target_message_id " => "ft_message "
724
+ ));
725
+ exit ;
726
+ }
727
+ }
728
+ }
729
+
730
+
731
+ /**
732
+ * Wrapper methods. This is for convenience: anyone consuming this module can just call:
733
+ * $module = Modules::getModuleInstance();
734
+ * and access the methods here.
735
+ */
736
+ public function getExportGroups () {
737
+ return ExportGroups::getExportGroups ();
738
+ }
739
+
740
+ public function getExportTypes ($ export_group , $ only_return_visible ) {
741
+ return ExportTypes::getExportTypes ($ export_group , $ only_return_visible );
742
+ }
561
743
}
0 commit comments