44namespace FormTools \Modules \ExportManager ;
55
66use FormTools \Core ;
7+ use FormTools \Fields ;
8+ use FormTools \FieldTypes ;
9+ use FormTools \Forms ;
10+ use FormTools \General as CoreGeneral ;
711use FormTools \Hooks ;
812use FormTools \Module as FormToolsModule ;
913use FormTools \Modules ;
1014use FormTools \Sessions ;
1115use FormTools \Settings ;
16+ use FormTools \Submissions ;
17+ use FormTools \Views ;
18+
1219use PDOException ;
1320
1421
@@ -19,8 +26,8 @@ class Module extends FormToolsModule
1926 protected $ author = "Ben Keen " ;
2027 protected $ authorEmail = "ben.keen@gmail.com " ;
2128 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 " ;
2431 protected $ originLanguage = "en_us " ;
2532 protected $ jsFiles = array (
2633 "{MODULEROOT}/scripts/admin.js " ,
@@ -360,7 +367,7 @@ public function addExcelExportGroup()
360367 {assign var=value value= \$submission. \$col_name}
361368 <td>
362369 {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"}
364371 </td>
365372 {/foreach}
366373</tr>
@@ -558,4 +565,179 @@ private function createTables()
558565 $ db ->execute ();
559566 }
560567 }
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+ }
561743}
0 commit comments