jump to navigation

Zend set Layout directory November 1, 2009

Posted by samsonasik in Tutorial PHP.
Tags:
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:
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:
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: , ,
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 :)

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: ,
4 comments

Pernahkah anda pas ngerun mysql di command line mengalami error seperti ini ?

errormysql

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

mysqlhandling