Передача данных массива из PHP в JasperReports (с помощью PHP / JavaBridge)

В настоящее время я пытаюсь создать pdf-файл из php-скрипта. У меня есть JasperReports & PHP / JavaBridge и работает, и он создает PDF-файлы при отправке строк и целых чисел в качестве параметров.

Я использовал руководства от Jasper Reports и PHP & Bullet-Proof Jasper Reports и PHP, чтобы помочь настроить отчеты PHP / JavaBridge и Jasper.

Так выглядит мой PHP-скрипт (очень похожий на пример из упомянутого выше руководства):

<?php /** * see if the java extension was loaded. */ function checkJavaExtension() { if(!extension_loaded('java')) { $sapi_type = php_sapi_name(); $port = (isset($_SERVER['SERVER_PORT']) && (($_SERVER['SERVER_PORT'])>1024)) ? $_SERVER['SERVER_PORT'] : '8080'; if ($sapi_type == "cgi" || $sapi_type == "cgi-fcgi" || $sapi_type == "cli") { if(!(PHP_SHLIB_SUFFIX=="so" && @dl('java.so'))&&!(PHP_SHLIB_SUFFIX=="dll" && @dl('php_java.dll'))&&!(@include_once("java/Java.inc"))&&!(require_once("http://127.0.0.1:$port/java/Java.inc"))) { return "java extension not installed."; } } else { if(!(@include_once("java/Java.inc"))) { require_once("http://127.0.0.1:$port/java/Java.inc"); } } } if(!function_exists("java_get_server_name")) { return "The loaded java extension is not the PHP/Java Bridge"; } return true; } /** * convert a php value to a java one... * @param string $value * @param string $className * @returns boolean success */ function convertValue($value, $className) { // if we are a string, just use the normal conversion // methods from the java extension... try { if ($className == 'java.lang.String') { $temp = new Java('java.lang.String', $value); return $temp; } else if ($className == 'java.lang.Boolean' || $className == 'java.lang.Integer' || $className == 'java.lang.Long' || $className == 'java.lang.Short' || $className == 'java.lang.Double' || $className == 'java.math.BigDecimal') { $temp = new Java($className, $value); return $temp; } else if ($className == 'java.sql.Timestamp' || $className == 'java.sql.Time') { $temp = new Java($className); $javaObject = $temp->valueOf($value); return $javaObject; } } catch (Exception $err) { echo ( 'unable to convert value, ' . $value . ' could not be converted to ' . $className); return false; } echo ( 'unable to convert value, class name '.$className. ' not recognised'); return false; } if (true == checkJavaExtension()) { echo 'java extension is loaded!!'; } $compileManager = new JavaClass("net.sf.jasperreports.engine.JasperCompileManager"); $report = $compileManager->compileReport(realpath("test.jrxml")); $fillManager = new JavaClass("net.sf.jasperreports.engine.JasperFillManager"); $params = new Java("java.util.HashMap"); $params->put("text", "This is a text"); $params->put("report_id", 2); $emptyDataSource = new Java("net.sf.jasperreports.engine.JREmptyDataSource"); $jasperPrint = $fillManager->fillReport($report, $params, $emptyDataSource); $outputPath = realpath(".")."/"."output.pdf"; $exportManager = new JavaClass("net.sf.jasperreports.engine.JasperExportManager"); $exportManager->exportReportToPdfFile($jasperPrint, $outputPath); header("Content-type: application/pdf"); readfile($outputPath); unlink($outputPath); ?> 

Код выше работает, но я хочу использовать массив PHP в качестве параметра для моего jrxml-файла. Что было бы лучшим решением для этого?

Я думаю, что, вероятно, мне нужно создать класс java.util.List, установить данные из моего php-массива в качестве элементов списка и отправить это как параметр в файл jrxml, но я не могу заставить это работать.

С другой стороны, это может быть очень неправильно, потому что это для меня совершенно новое: \ Я ценю всю помощь, которую я могу получить! 🙂

Я не уверен, что понимаю, но если у вас есть массив значений, таких как {id => 1, name => 'fubar', something => 'blala'. Попробуй это:

 $map = new Java("java.util.HashMap"); foreach ($array as $key=>$value){ $map->put($key,$value); } $Jfm = new Java("net.sf.jasperreports.engine.JasperFillManager"); $this->FillReport = $Jfm->fillReport($this->CompileReport, $map, $this->DbConnect);