Zend set Layout directory November 1, 2009
Posted by samsonasik in Tutorial PHP.Tags: Zend_Layout set layout directory
add a comment
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
add a comment
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
backup and restore di mysql via command line Agustus 6, 2009
Posted by samsonasik in Uncategorized.2 comments
Karena keterbatasan phpmyadmin dalam mengeksekusi stored procedure , view, dan trigger, maka kita bisa menggunakan cara lama, yaitu via command line, he.he..
Untuk Linux(dengan web container lampp, kita harus setting dulu, bisa ditambahkan di rc.local )
mkdir /var/run/mysqld
ln -s /opt/lampp/var/mysql/mysql.sock /var/run/mysqld/mysqld.sock
mkdir /var/lib/mysql
ln -s /opt/lampp/var/mysql/mysql.sock /var/lib/mysql/mysql.sock
Untuk mysqldump :
a. di windows :
b. di Linux
Untuk restore :
a. di windows :
b. di Linux:
Membuat Library sendiri di Zend 1.8.4 Juli 24, 2009
Posted by samsonasik in Tutorial PHP.add a comment
Kadang, karena kebutuhan yg tidak terbatas, kebutuhan akan library yang disediakan framework saja tidaklah cukup, maka dari itu, kita perlu membuat library sendiri untuk keperluan2 kita,bisa dengan cara extends library yang ada, bisa juga buat dari awal, yang sebaiknya tidak dilakukan adalah mengubah core library yang ada. Berikut saya paparkan satu contoh sederhana.
Library yang kita buat harus didaftarkan dalam object autoloader di public/index.php, contoh
<?php
......
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('samsonlibrary_');
......
?>
Kita bisa meletakkan library di bawah folder library/
Kita buat folder bernama (contoh) samsonlibrary , nah, di dalamnya baru kita buat file2 kita sendiri, misal : Convertdate.php
Nah, penamaan kelasnya adalah namaNamespace.”_”.namaFile, sebagai contoh, berarti nama kelasnya samsonlibrary_Convertdate :
<?php
class samsonlibrary_Convertdate
{
private $bulan = array(
'01'=>'Januari',
'02'=>'Februari',
'03'=>'Maret',
'04'=>'April',
'05'=>'Mei',
'06'=>'Juni',
'07'=>'Juli',
'08'=>'Agustus',
'09'=>'September',
'10'=>'Oktober',
'11'=>'November',
'12'=>'Desember'
);
//konstruktor...
public function samsonlibrary_Convertdate(){ }
public function toIndonesian($date)
{
$explodeDate = explode("-",$date);
$strDate .= $explodeDate[2];
foreach($this->bulan as $key=>$bul)
{
if ($key==$explodeDate[1]){
$strDate .=" ".$bul;
break;
}
}
$strDate .= " ".$explodeDate[0];
return $strDate;
}
}
?>
Sekarang, tinggal pakai aja :
<?php
$date = new samsonlibrary_Convertdate();
echo $date->toIndonesian('2009-01-17');
//output : 17 Januari 2009
?>
Semoga bermanfaat
Menangani error mysql command line : ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2) Juli 6, 2009
Posted by samsonasik in mysql docs, tips and tricks.Tags: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2), handling mysql command line error
4 comments
Pernahkah anda pas ngerun mysql di command line mengalami error seperti ini ?

Nah, cara mengatasinya adalah membuat ‘link’ ke file /var/run/mysqld/mysqld.sock, caranya :


