jump to navigation

Zend Framework Modular Application for Efficient Development Process Desember 19, 2009

Posted by samsonasik in Tutorial PHP.
2 comments

Coba perhatikan 2 gambar berikut :

Secara sekilas, gambar bagian kanan ’seolah’ lebih sederhana daripada bagian kiri, hanya saja, ketika ruang lingkup aplikasi meluas, maka lebih menguntungkan jika kita menggunakan struktur bagian kiri. Pada gambar struktur bagian kiri, aplikasi disusun secara modularitas, seperti xaraya , sehingga ketika ada pengupdate-an suatu modul di sisi client, maka kita tidak perlu mencomot controllers, models, dan view satu-satu dari aplikasi, tapi cukup satu modul itu dicopy, dan ditimpa, just copy, and paste.

Persiapan untuk menggunakan cara ini, yang pertama, siapkan file konfigurasi (ex : application.ini ) di dalam folder config.
contoh :

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0

;Database Configuration
resources.db.adapter         = "PDO_PGSQL"
resources.db.params.host     = "localhost"
resources.db.params.username = "ikhsan"
resources.db.params.password = "ikhsan"
resources.db.params.dbname   = "zend_prj"

;resource module
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules = ""

;Bootstrap
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

[staging : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

Kalau sudah, langkah selanjutnya adalah set master bootstrap yang ada di direktori application.

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

 protected function _initAutoload()
 {
 $autoloader = new Zend_Application_Module_Autoloader(array(
 'namespace' => '',
 'basePath'  => APPLICATION_PATH.'/modules/default'
 ));

 return $autoloader;
 }

 protected function _initDoctype()
 {
 $this->bootstrap('view');

 $view = $this->getResource('view');
 $view->doctype('XHTML1_STRICT');

 return $view;
 }

 protected function _initView()
 {
 $view = new Zend_View();
 $sesi = new Zend_Session_Namespace();

 $view->headTitle('Zend Project');

 //set layout directory ...
 $layout = (null!=$sesi->sesiuser) ?"layout" : "layoutlogin";

 //contoh set theme style....
 $theme = "zend_prj";

 Zend_Layout::startMvc(array(
 'layoutPath' => PUBLIC_PATH."/themes/$theme/$layout/scripts",
 'layout' => 'layout'
 ));

 return $view;
 }

}
?>

Setelah itu, kita set default bootstrap module (nama class = Namamodule_Bootstrap ) –> file Bootstrap dapat dicopy untuk tiap module :)

<?php
class Default_Bootstrap extends Zend_Application_Module_Bootstrap
{
 protected function _initView()
 {
 $router = new Zend_Controller_Router_Rewrite();
 $request =  new Zend_Controller_Request_Http();
 $router->route($request);

 $module = $request->getModuleName();
 $module = ($module=='default') ? 'home' : $module;

 $view = new Zend_View();
 $view->headTitle(' : '.$module);

 return $view;
 }

}
?>

Penamaan kelas dalam module dipisahkan oleh namespace masing-masing, jadi kalau kita letakkan file model di dalam module samplemodule misal, ya berarti kita bisa beri nama kelasnya,
misalnya Samplemodule_Model_Examplemodel dengan nama file Examplemodel.php

NB :
untuk PUBLIC_PATH , kita bisa define kan seperti berikut di public/index.php:

defined('PUBLIC_PATH')
 || define('PUBLIC_PATH', realpath(dirname(__FILE__)));

Cerita pendek berjudul ” Cape deh “ Desember 16, 2009

Posted by samsonasik in lucu2.
add a comment

Boss bicara dengan sekretarisnya: “Seminggu kita pergi untuk perjalanan
dinas, tolong siap-siap.”

Sekretaris telepon suaminya: “Mas, saya mau berangkat untuk perjalanan
dinas, hati-hati di rumah ya.”

Suami telepon kekasih gelapnya: “Istriku mau berangkat seminggu, kau ada
waktu?”

Kekasih gelap bilang terhadap anak kursusnya: “Nak, ibu punya banyak
kerjaan selama seminggu, kursus ditiadakan selama seminggu.”

Anak kursus bilang terhadap kakeknya: “Kek, seminggu tidak ada kursus,
gurunya sibuk. Ayo kita jalan-jalan. “

Kakek (=Boss) telepon sekretarisnya: “Minggu ini saya mau jalan-jalan sama
cucu saya, meeting dibatalkan.”

Sekretaris telepon suaminya: “Bossnya ada kerjaan rumah yang mendadak,
tripnya dibatalkan Mas.”

Suami bilang kekasih gelapnya: “Kau tak bisa datang, istriku tak jadi
pergi.”

Kekasih gelap telepon anak kursusnya : “Nak, kursus minggu ini berjalan
seperti biasa.”

Anak kursus bilang sama kakeknya: “Kek, guruku bilang kursus berjalan
normal. Kakek jalan sendiri aja.”

Kakek bilang sama sekretarisnya: “Minggu ini kita atur perjalanan dinas
lagi. Kamu siap-siap, yah!”

Cape deh…

Sumber : email forwad-an :D

Menyembunyikan Image path (PHP) November 15, 2009

Posted by samsonasik in Tutorial PHP, tips and tricks.
Tags:
1 comment so far

Untuk kebutuhan keamanan, baiknya kita menyembunyikan path file asset ( misal gambar ) dari web kita. Di php, kita bisa menggunakan header dengan content-type image untuk menyembunyikan target gambar yang diambil dengan kode program seperti berikut  :


<?php
 header('Content-type: image/jpeg');
 $image = "path/to/image/file.jpg";
 $fp = fopen($image,"r");
 echo fpassthru($fp);

?>

Demikian, semoga bermanfaat :) .

Zend set Layout directory November 1, 2009

Posted by samsonasik in Tutorial PHP.
Tags:
1 comment so far

Penggunaan two step view pada Zend Framework tentulah akan sangat membantu developer dalam membangun aplikasi, karena reuse templating ini sangat memudahkan sehingga tidak perlu lagi include header or footer karena sudah di set secara global. Masalah muncul apabila kita hendak menggunakan layout yg berbeda untuk modul tertentu. Nah, maka dari itu, kita bisa menggunakan Zend_Layout library untuk mengakalinya, caranya, kita set di Bootsrap.php :
Tambahkan line coding seperti berikut :


protected function _initDoctype()
{

$sesi = new Zend_Session_Namespace();

$this->bootstrap('view');
$view = $this->getResource('view');
$view->doctype('XHTML1_STRICT');

//set layout directory ... (kondisional jk
//mempunyai sesi atau tidak punya sesi dengan
// folder layout yg berbeda)
$layout = ($sesi->sesiUser!=null) ?"layouts" : "layoutslogin";

Zend_Layout::startMvc(array(
'layoutPath' => APPLICATION_PATH."/$layout/scripts",
'layout' => 'layout'
));

}

SubQuery pada Zend_Db_Select Oktober 30, 2009

Posted by samsonasik in Tutorial PHP, tips and tricks.
Tags:
add a comment

Anggaplah kita akan menjalankan query seperti berikut :

select is_add from dwt_menushow where menu_id = any(select menu_id
from dwt_menu where menu_link = 'mfirst') and groupuser_id = 1

Maka yang harus kita lakukan adalah mengkonversi penggunaan Zend_Db_Select pada subquery menjadi String.

$exp = $this->db->select()->from($this->prefixDbDefault."menu",
   array('menu_id'))
 ->where("menu_link = 'mfirst' ")
 ->__toString();

Setelah itu, baru kita panggil :

$select = $this->db->select()->
  from($this->prefixDbDefault."menushow",array("is_add"))
 ->where("menu_id = any( $exp ) and groupuser_id = 1 ");

//cek ...
echo "<pre>";
print_r($this->db->fetchAll($select));
echo "</pre>"

Referensi : http://old.nabble.com/

PHP 5.3 safe mode Oktober 29, 2009

Posted by samsonasik in Tutorial PHP, tips and tricks.
Tags:
2 comments

HP 5.3 disamping banyak mempermudah, di sisi lain jg sangat strict, sehingga yg terbiasa coding-nya agak acak-acakan (seperti saya, he.he.he.), akan sangat kesulitan ketika upgrade ke versi ini. Nah, cara mengatasinya adalah penggunaan error_reporting, cara ini saya anggap ampuh untuk menangani kode program yang strict tersebut, seperti : undefined variable, Undefined offset array, header already sent,  dan lain2. Sebagai contoh, kita definisikan error_reporting(0) di line pertama :

<?php
error_reporting(0);
//coding php yg lainnya ...

Untuk melihat perbandingan pelevelan-nya, bisa dilihat di sini

PHP 5.3 session.save_path Oktober 29, 2009

Posted by samsonasik in Tutorial PHP, tips and tricks.
add a comment

PHP 5.3 memang aneh bin ajaib, walaupun banyak sekali menuai kritik karena banyak mengangkat deprecated function, tapi tetap aja banyak pula yang tertarik karena fitur2 nya yg luar biasa, lihat PHP 5.3.0 Release Announcement . Karena ketertarikan itu pula-lah, banyak yg mencoba meng-kick hal-hal yang mengganggu itu, salah satu di antara-nya adalah saya (wkwkwk…).

Kemarin ceritanya, saya mencoba php 5.3 untuk Zend Framework. Nah, pas pakai session, ternyata ada masalah, masalahnya adalah halaman menjadi blank, tanpa respon apapun. Dug…, saya langsung panik, gmn neh…, nah, setelah itu saya cari2 tahu dengan mendebug line demi line (karena sebelumnya saya tidak tahu bahwa letak kesalahannya berada pada Zend_Session_Namespace). Nah, ternyata ketemu, permasalahannya ada di baris setelah instansiasi kelas Zend_Session_Namespace. Saya langsung cari tahu di Google , nah, ketemu, cara mengakalinya dengan mendefinisikan secara eksplisit session.save_path di php.ini, misal

;;;;
session.save_path = "/tmp"
;;;;

Pastikan directory tujuan bersifat writable agar bisa ditulisi.
Selamat mencoba :) .

Namespace ‘jadi-jadian’ ala PHP Oktober 20, 2009

Posted by samsonasik in Tutorial PHP.
Tags: , ,
add a comment

Namespace dapat dikatakan container yang mengelompokkan source code. Sejak lama, dalam Java telah kita kenal namespace, berupa penggunaan package di mana ketika kita mendefinisikan, misalnya, package org.postgresql , berarti class yang dipanggil berada dalam folder org/postgresql. Bagaimana dengan php ? Di php 5.3, namespace sudah mulai diperkenalkan, hanya saja, pendefinisian-nya menjadi rancu ketika kita masih tetap membutuhkan require. Lah, terus buat apa ada namespace? Tentu saja gunanya untuk pengelompokan file sehingga lebih dapi dan mudah untuk ditrace. Tentu saja kita ingin hal lain dong selain hal tersebut. Nah, untuk itu, perlu ada nya trik khusus, seperti di bawah ini.

Anggap saja kita mempunyai struktur direktori seperti di bawah ini :
namespacer Nah, yang kita perlukan adalah trik penggunaan function __autoload dalam php, yang akan mendefinisikan hal2 yg harus dilakukan ketika sebuah class diinstansiasi menjadi sebuah object.

Tentu penggunaan function __autoload ini bukan tanpa aturan. sebagai contoh, dalam file TestClass.php, saya buat sebuah class bernama org_samsonasik_TestClass , hal ini berguna untuk pemisahan folder nantinya.
source code TestClass.php :

<?php
 class org_samsonasik_TestClass{
 public function __construct($args)
 {
 echo $args ;
 }
 }

Nah, dalam file pemanggilnya, kita buat function __autoload :
sourcecode index.php

<?php

function __autoload($class)
{
 $file = str_replace("_","/",$class.".php");
 require_once $file;
}

$test = new org_samsonasik_TestClass("test");

ketika pemanggilan new org_samsonasik_TestClass, berarti telah merequire folder2 dalam package dengan akal-akalan function __autoload tersebut. Fungsi inilah yg digunakan seperti pada framework Zend.

JSP Custom Tag Library Agustus 30, 2009

Posted by samsonasik in Tutorial JSP.
Tags:
3 comments

Bosan sama JSTL & Standard Action ? Gunakan Custom Tag Library Anda sendiri. Pada tutorial kali ini, saya akan memaparkan penggunaan SimpleTagSupport untuk menjalankan tag buatan kita sendiri ( tentunya ada aturan mainnya :) ). Class SimpleTagSupport mengextends Interface SimpleTag yang mengextends Interface JSPTag. Tentang method2 detail nya, mungkin bisa dicari sendiri di google, kali ini saya lebih memfokuskan pada penggunaan method doTag saja :) .

Ok, let’s start. Pertama, buat project yang struktur directory nya seperti di bawah ini. (Jika belum terbiasa menggunakan WAR (Web Application Archive) , Anda bisa gunakan ROOT directory ) :
web

Nah, kalau sudah, kita isi source code masing2.
1). wordpress.tld

<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
 version="2.0">

 <tlib-version>1.2</tlib-version>
 <uri>simpletagwordpress</uri>
 <tag>
 <description>Worst use of a custom tag</description>
 <name>simpletag</name>
 <tag-class>wordpress.SamsonSimpleTag</tag-class>
 <body-content>empty</body-content>
 </tag>
</taglib>

2). SamsonSimpleTag.java

package wordpress;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class SamsonSimpleTag extends SimpleTagSupport{
 public void doTag() throws JspException, IOException{
 PageContext pageContext = (PageContext) getJspContext();
 JspWriter out = pageContext.getOut();
 out.print("Test Tag Buatanku");
 }
}

And The View :
3). wordpress.jsp

<%@ taglib prefix="tagbuatanku" uri="simpletagwordpress" prefix="r"%>
<tagbuatanku:simpletag/>

<!-- agar ketika class diubah & dikompilasi ulang, otomatis reload -->
<r:reload/>

Asik kan :)
————————
referensi : Basham, Bryan ; Sierra, Kathy ; Bates, Bert : Head First Servlet & JSP

Kolaborasi Flex dan zend 1.9.0 Agustus 10, 2009

Posted by samsonasik in Flex, Tutorial PHP.
Tags:
add a comment

Akhirnya, setelah sekian lama zend 1.8 ke atas dapat dikolaborasikan dengan Flex 3. Untuk yang zend 1.8, yang menjadi masalah bukan di sisi zend-nya, tapi di sisi library amf nya. Bagi yang menggunakan zend 1.8, bisa downgrade ke amf versi 1.7 ( zend tetap pakai 1.8 ), atau upgrade ke zend 1.9.0 sekalian.

Struktur directory framework untuk kebutuhan koneksi ke zend 1.9.0 berbeda dari sebelumnya, dapat dilihat dari gambar berikut :

Di sini kita tidak butuh controller, karena sudah digantikan oleh service.

Isi file configs\application.ini :

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH “/../library”
bootstrap.path = APPLICATION_PATH “/Bootstrap.php”
bootstrap.class = “Bootstrap”
resources.db.adapter = “PDO_MYSQL”
resources.db.params.host = “localhost”
resources.db.params.username = “root”
resources.db.params.password = “”
resources.db.params.dbname = “test”

[staging : production]
resources.db.params.dbname = “test”

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.db.params.dbname = “test”

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.db.params.dbname = “test”

Untuk Bootstrap file :
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

protected function _initAutoload()
{

$autoloader = new Zend_Application_Module_Autoloader(array(

‘namespace’ => ”,

‘basePath’ => dirname(__FILE__),

));

return $autoloader;
}

}

Untuk contoh isi file models : (asumsi ada table bernama testaa, field-fieldnya id dan nama)
<?php
class Model_Testaa extends Zend_Db_Table
{
protected $_name = “testaa”;
protected $_primary = “id”;
}

Untuk penjabaran field-field table, kita definisikan di class TestaaClass (contoh) di directory services :
<?php
class TestaaClass
{
var $id ;
var $nama;
}

Nah, untuk servicenya :
<?php
require_once(‘TestaaClass.php’);

class TestaaService {

private $testaa;

public function __construct()
{
$this->testaa = new Model_Testaa();
}

public function getData()
{

$result = array();
foreach($this->testaa->fetchAll() as $key=>$val)
{

$testaaobj = new TestaaClass();
$testaaobj->id = $val->id;
$testaaobj->nama = $val->nama;

$result[] = $testaaobj;
}
return $result;
}

public function removeData($idField)
{
$currentTestaa = $this->testaa->find($idField)->current();
$currentTestaa->delete();
}

public function addData($namanya)
{

$data = array(‘nama’ =>$namanya);
$this->testaa->insert($data);
}

public function editData($id, $namanya)
{

$row = $this->testaa->find($id)->current();
$row->nama = $namanya;
$row->save();
}
}

Untuk index.php :

<?php

defined(‘APPLICATION_PATH’) || define(‘APPLICATION_PATH’, realpath(dirname(__FILE__) . ‘/../application’));
defined(‘APPLICATION_ENV’) || define(‘APPLICATION_ENV’, (getenv(‘APPLICATION_ENV’) ? getenv(‘APPLICATION_ENV’) : ‘production’));
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . ‘/../library’),
get_include_path(),
)));

require_once ‘Zend/Loader/Autoloader.php’;
$autoloader = Zend_Loader_Autoloader::getInstance();

$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . ‘/configs/application.ini’
);

$application->bootstrap();

$server = new Zend_Amf_Server();
$server->addDirectory(‘./services/’);
echo($server->handle());

Nah, sekarang, untuk di flex nya, struktur nya sama seperti pada dokumentasi sebelumnya :

Jangan lupa setting compiler settingnya :

Untuk konfigurasi service-config.xml nya :
<?xml version=”1.0″ encoding=”UTF-8″?>

<services-config>

<services>

<service id=”amfphp-flashremoting-service” class=”flex.messaging.services.RemotingService” messageTypes=”flex.messaging.messages.RemotingMessage”>

<destination id=”zendamf”>

<channels>

<channel ref=”myamfphp”/>

</channels>

<properties>

<source>*</source>

</properties>

</destination>

</service>

</services>

<channels>

<channel-definition id=”myamfphp” class=”mx.messaging.channels.AMFChannel”>

<endpoint uri=”../zf190_amf/public/index.php” class=”flex.messaging.endpoints.AMFEndpoint”/>

</channel-definition>

</channels>

</services-config>

Terakhir, isi source mxml kita :

<?xml version=”1.0″ encoding=”utf-8″?>

<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”vertical”

creationComplete=”getDataExample()”>

<mx:RemoteObject id=”remoteExample” destination=”zendamf” source=”TestaaService”

showBusyCursor=”true” fault=”faultListener(event)”>

<mx:method name=”getData” result=”getDataListener(event)”/>

</mx:RemoteObject>

<mx:Script>

<![CDATA[

import mx.controls.Alert;

import mx.rpc.events.FaultEvent;

import mx.rpc.events.ResultEvent;

import mx.collections.ArrayCollection;

//siapkan array

[Bindable]

private var exampledata :ArrayCollection;

[Bindable]

private var idnya :Number;

private function getDataListener(event:ResultEvent):void

{

exampledata = new ArrayCollection(event.result as Array) ;

}

private function faultListener(event:FaultEvent):void

{

Alert.show(event.fault.message, “Error”);

}

private function getDataExample():void

{

//load data

remoteExample.getData();

}

]]>

</mx:Script>

<mx:DataGrid id=”myGrid” dataProvider=”{exampledata}”>

<mx:columns>

<mx:DataGridColumn headerText=”id” dataField=”id” draggable=”true” />

<mx:DataGridColumn headerText=”nama” dataField=”nama” draggable=”true”/>

</mx:columns>

</mx:DataGrid>

</mx:Application>

Hasil akhirnya :

Kalau dicoba seperti ini sudah jalan, berarti kita sudah berhasil :)