การทำ iReport + PHP ด้วย JavaBridge (Step by Step)


หน้าแรก PHP MySQL เกร็ดความรู้ การทำ iReport + PHP ด้วย JavaBridge (Step by Step)
การทำ iReport + PHP นี้จะทำไม่ได้ถ้าไม่มี JavaBridge มาช่วยนะครับ สำหรับ JavaBridge ที่ผมแนะนำก็ตัวนี้เลยครับ OpenSource
หลังจากติดตั้งเสร็จก็ลงมือทำ Report ใน iReport Designer ได้เลยตามปกตินะครับ
ส่วนนี้ไม่ยากคิดว่าคงทำ Report เป็นอยู่แล้ว

ขอข้ามมาที่ Code เลยนะครับ

<?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")))
                               
if(!(require_once("./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;  
}

error_reporting
(E_ALL);
checkJavaExtension
();

/* Inherits JasperReport Compiler Class */
$compileManager
= new JavaClass("net.sf.jasperreports.engine.JasperCompileManager");
$report
= $compileManager->compileReport(realpath("aaaa.jrxml"));

/* Inherits JasperFillManager */
$fillManager
= new JavaClass("net.sf.jasperreports.engine.JasperFillManager");

/* Parameter defining */
$params
= new Java("java.util.HashMap");
//ในกรณีที่เราจะส่ง Parameter ให้ Report ให้สร้าง HashMap เพื่อส่งให้กับ Report แบบนี้นะครับ

$params
->put("text", "Text");
$params
->put("number", 3.00);
$params
->put("date", convertValue("2007-12-31 0:0:0", "java.sql.Timestamp"));

/* get database JDBC connection */
//ตรงนี้เป็นการ Get JDBC Connection เพื่อทำการ Fill Data Source ให้กับ Report นะครับ ใน ตย.นี้เป็น MSSQL นะครับ
$class
= new JavaClass("java.lang.Class");
$class
->forName("net.sourceforge.jtds.jdbc.Driver");
$driverManager
= new JavaClass("java.sql.DriverManager");
$conn
= $driverManager->getConnection("jdbc:jtds:sqlserver://quetzalcoatl/DBXXXX;user=sa;password=xxxx");

// อันนี้เป็นกรณีที่จะใช้ Empty Data Source
/*$emptyDataSource = new JavaClass("net.sf.jasperreports.engine.JREmptyDataSource");*/
// อันนี้เป็นกรณีที่ใช้ JDBC Connection นะครับ
$jasperPrint
= $fillManager->fillReport($report, $params, $conn);

//สร้าง output เป็น PDF File แต่สามารถใช้ Export Manager ตัวอื่นก็ได้นะครับ
$filename
= uniqid('Report_');
$outputPath
= realpath(".")."/"."{$filename}.pdf";

$exportManager
= new JavaClass("net.sf.jasperreports.engine.JasperExportManager");
$exportManager
->exportReportToPdfFile($jasperPrint, $outputPath);

header
("Content-type: application/pdf");
readfile
($outputPath);
unlink
($outputPath);

?>


เท่านี้เองครับ ไม่ยากเลยใช่ไหมครับ
สงสัยสอบถามได้ครับ

ปล. การ Load JavaBridge ในตย.นี้จะ Deploy PHP Source ไว้ใน Tomcat ให้เราไปใช้ Include ผ่าน URL 
ซึ่งจะไม่ผ่านในกรณีที่ใช้ Share host แต่สามารถเอา PHP Source มาวางใน Apache แล้ว Include ตรงๆ ก็ได้ครับ

ปล2. ควรเขียน Java เป็น อย่างน้อยควรรู้วิธีการทำงานของ Servlet Container เช่น Tomcat นะครับ

--------------------------------------------------------------------------------------------------------
พอดีมีน้องมาถามเรื่องการ Setup PHP/JavaBridge กับการทำให้ JavaBridge ใช้ Library ของ iReport ได้
เดี๋ยวผมเพิ่มรายละเอียดให้ตรงนี้นะครับ ขอไป PrtSc แปป

จาก http://www.narisa.com/forums/index.php?app=blog&module=display&section=blog&blogid=26&showentry=1658


ขึ้นไปด้านบน