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 ![]()
Zend set Layout directory November 1, 2009
Posted by samsonasik in Tutorial PHP.Tags: Zend_Layout set layout directory
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: subquery zend
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: handling php 5.3 strict
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: namespace package php, namespace php, zend namespace php
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 :
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: jsp taglib
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 ) :

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: flex and zend
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 :
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

