Welcome to Abdul Malik Ikhsan's Blog

Zend Framework : View Partials – Dealing with Complex Templates

Posted in Tutorial PHP, Zend Framework by samsonasik on April 6, 2011

Bagi kamu-kamu yang ber-background Ruby on Rails, tentu sudah tidak asing lagi donkz dengan View Partials. Perbedaan rendering secara partial dengan normal view adalah bahwa partial mempunyai ruang lingkup variable sendiri, ia hanya akan melihat variable yang dilewatkan secara langsung. Sebagai contoh seperti berikut :

<?php echo $this->partial('foo.phtml', array('foo' => 'bar'));  ?> 

Dari contoh di atas, variable yang bisa dipakai di foo.phtml hanyalah single variable ‘foo’ dengan value ‘bar’. View Partials biasanya digunakan untuk menangani complex templates dengan mempunyai banyak view logic ( dalam konsep MVC, dibolehkan terdapat logic di view, asalkan logic tersebut digunakan untuk mengolah view , bukan mengolah data ). Misal kita ingin menampilkan data sehingga tampil seperti berikut :

Ok, kita bisa membuat Controller seperti di bawah :

<?php
//Controller
class TestpartialController extends Zend_Controller_Action
{
 public function init()
 {
 $this->getHelper('layout')->disableLayout();
 }

 //simple func to create fake data
 private function setItem($id,$name)
 {
 $item = new stdClass();
 $item->id = $id;
 $item->name = $name;

 return $item;
 }

 //index action -> render to index.phtml
 public function indexAction()
 {
 $items = array();
 $items[] = $this->setItem(1,'abdul');
 $items[] = $this->setItem(2,'malik');
 $items[] = $this->setItem(3,'ikhsan');
 $items[] = $this->setItem(4,'emang');
 $items[] = $this->setItem(5,'ganteng');
 $items[] = $this->setItem(6,'banget');
 $items[] = $this->setItem(7,'gitu lhoh');

 $this->view->items = $items;
 }
}

Nah, di sisi view, kita ingin menampilkan data dengan record bergantian warna-warni ( dibutuhkan logic untuk mengolah view ), maka kita bisa bagi menjadi 2, satu untuk “heading” ( index.phtml ) dan satu untuk dilooping dengan logic yg lebih kompleks ( rows.phtml ) .

<table width="70%">
 <tr>
 <th>ID</th>
 <th>NAME</th>
 </tr>
 <?php
 $alt = false;
 foreach($this->items as $item){
 $alt = !$alt;
 // 'render' another view
 echo $this->partial('testpartial/rows.phtml', array('alt'=>$alt, 'item'=>$item) );
 } ?>
</table>

Sekarang, kita buat file view lain yang akan dirender dengan variable yang dilewatkan

array('alt'=>$alt, 'item'=>$item)

Berikut contoh view logic ( rows.phtml ) :

<?php
 $style = "background-color:yellow;";  //view logic to manage view
 if ($this->alt) $style="";
?>
<tr style="<?php echo $style; ?>">
 <td><?php echo $this->item->id; ?></td>
 <td><?php echo $this->item->name; ?></td>
</tr>

Semoga bermanfaat 😀
Referensi :
http://www.zendcasts.com/zend-view-partials/2009/03/
http://devzone.zend.com/article/3412
http://framework.zend.com/manual/en/zend.view.helpers.html
http://stackoverflow.com/questions/746260/where-do-i-save-partial-views-in-zend-framework-to-be-accessible-for-all-views
http://stackoverflow.com/questions/931407/what-is-stdclass-in-php
http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/
http://us2.php.net/variables.scope

Zend Framework – Controller Plugin vs Action Helpers

Posted in Tutorial PHP, Zend Framework by samsonasik on January 2, 2011

Zend Framework mempunyai arsitektur Controller yang dapat “me-require” system plugin yang memungkinkan dipanggil pada saat sebelum, sedang, maupun setelah semua action controller berjalan.  Sebut saja routeStartup(), routeShutdown(), dispatchLoopStartup(), preDispatch(), postDispatch(), dispatchLoopShutdown(), mereka adalah event method yang berjalan mulai dari sebelum sampai sesudah action Controller dijalankan. FrontController menggunakan plugin broker sebagai registry, dan plugin broker memastikan event tersebut dipanggil pada saat plugin didaftarkan di FrontController.  Untuk memahami tiap event method, bisa di baca di sini.
Zend Framework juga mempunyai Action Helpers, ia adalah kumpulan fungsi yang bisa dipanggil di action controller manapun. Perbedaan action helpers dengan controller plugin adalah controller plugin otomatis terpanggil pada lifetime controller, sedang action helpers berjalan hanya pada saat dipanggil.
1. Contoh Implementasi Controller Plugin
Misalkan kita ingin mengubah layout default di aplikasi yang kita buat pada saat controller tertentu dipanggil secara otomatis. Kita ingin pengecekan dilakukan oleh controller plugin sebelum controller action dikirim. Contoh kode program bisa dilihat seperti di bawah :

<?php
/**
* Controller plugin untuk layout spesifik pada controller AdminController
* @package Zf_Controlplugin
* @author samsonasik
* @filename library\Zf\Controlplugin.php
*/
class Zf_Controlplugin extends
 Zend_Controller_Plugin_Abstract
{
 public function preDispatch(Zend_Controller_Request_Abstract $request)
 {
 $control =  $request->getControllerName();
 if ($control == 'admin' ){
 Zend_Layout::startMvc(array(
 'layoutPath' => APPLICATION_PATH."/layoutadmin/scripts",
 'layout' => 'layout'
 ));
 }
 }
}


Setelah itu, kita bisa daftarkan plugin di atas di Bootstrap kita :

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

 function _initAutoload()
 {
 $autoloader = new Zend_Application_Module_Autoloader(
 array('namespace'=>'',
 'basePath'=>APPLICATION_PATH
 )
 );

 return $autoloader;
 }

 public function _initPlugins()
 {
 $front = Zend_Controller_Front::getInstance();
//mendaftarkan plugin
 $front->registerPlugin(new Zf_Controlplugin());
 }
}


2. Contoh Implementasi Action Helpers
Sebuah helper bisa diinisialisasi dengan banyak cara, berikut beberapa cara yang bisa digunakan :

// a. menggunakan method getHelper() secara explisit
$flashMessenger = $this->_helper->getHelper('FlashMessenger');
$flashMessenger->addMessage('We did something in the last request');

//b. menggunakan helper broker's  __get()
$flashMessenger = $this->_helper->FlashMessenger;
$flashMessenger->addMessage('We did something in the last request');

Referensi :
http://stackoverflow.com/questions/2463378/zend-framework-controller-plugins-vs-action-helpers
http://framework.zend.com/manual/en/zend.controller.plugins.html
http://framework.zend.com/manual/en/zend.controller.actionhelpers.html
Gambar :
http://static.zend.com/shop/media/catalog/product/cache/1/image/190x/5e06319eda06f020e43594a9c230972d/z/f/zf-training-fundamentals-store-product-page-190px.gif

Zend Framework – Working with Custom Routes

Posted in Tutorial PHP, Zend Framework by samsonasik on December 21, 2010

Routes adalah penghubung antara request  dan action.  Ketika user me-request halaman aplikasi melalui URL, maka FrontController menampung request, dan memutuskan Controller dan action mana yang akan dipanggil berdasarkan URLpattern. Proses request routing adalah kunci dari eksekusi flow aplikasi.

Proses routing rinciannya sebagai berikut :
1. Ketika request datang, maka .htaccess akan me-rewrite ke standard format dan melewatkan ke index.php
2. FrontController memeriksa request berdasarkan URL, dan mencocokkan dengan default maupun custom routes.
3. Jika cocok, maka FrontController mentransfer ke controller dan action yang sesuai. Jika benar, maka view dan layout akan dirender ke user jika diperlukan.
4. Jika tidak cocok, maka exception dan ErrorController akan dipanggil dan errorAction akan merender error message ke user.

Secara default, Zend Framework mempunyai routing standard, yaitu  :module/:controller/:action/* ( params /paramsvalue) . Nah, bagaimana ketika kita membutuhkan routing yang berbeda ? Yang kita perlukan adalah FrontController untuk mengatur routing tersebut, dan kita bisa tambahkan itu di default Bootstrap aplikasi Zend Framework kita, seperti berikut :

class Default_Bootstrap extends Zend_Application_Module_Bootstrap
{
protected function _initModule()
{
//instance before route from controllerfront
$this->frontController = Zend_Controller_Front::getInstance();
$this->router = $this->frontController->getRouter();
}

protected function _initRoutes()
{
//routingnya menjadi lang/module/controller/action
$this->router->addRoute('langaddmodaction',
new Zend_Controller_Router_Route('/:lang/:module/:controller/:action/*',
array('lang'=>'id',
'module'=>'default',
'controller'=>'index',
'action'=>'index')
));
}

protected function _initApp()
{
$request =  new Zend_Controller_Request_Http();
$this->router->route($request);
}
}

Referensi :
Zend Frawework, A Beginner’s Guide, Vikram Viswani
http://framework.zend.com/manual/en/zend.controller.router.html

Zend Framework : Create Web Services using Zend_Soap

Posted in Tutorial PHP, Zend Framework by samsonasik on June 16, 2010

Web Services adalah software sistem design yang memungkinkan untuk INTEROPERABILITY aplikasi antara komputer satu dengan lainnya melalui jaringan via HTTP. Dengan web services, aplikasi di satu komputer memanggil method ( method-method ) di aplikasi lain, di komputer yang berbeda, dengan bahasa Pemrograman yang bisa berbeda. Misalkan kita di sisi server membuat web services menggunakan .NET, di sisi client kita tidak perlu mempunyai .NET. Nah, bagaimana komunikasinya ? Komunikasinya melalui sebuah Message Format, biasa disebut SOAP ( Simple Object Access Protocol ).
Web Service mengeluarkan output berformat XML yang disebuat WSDL ( Web Service Description Language).  Nah, file XML ini yang dikonsumsi oleh client dan didapatlah output.
Ok, let’s coding :
Saya akan mensimulasikan secara local. Pertama, kita siapkan class yang akan kita panggil, kita taruh di folder zfprojectnya\library :

<?php

class Soaps
{
 /**
 * Penambahan method
 *
 * @param Int $bilpertama
 * @param Int $bilkedua
 * @return Int
 */
 public function penambahan_data($bilpertama,$bilkedua)
 {
 $return = $bilpertama + $bilkedua;
 return  $return ;
 }

 /**
 * Pengurangan method
 *
 * @param Int $bilpertama
 * @param Int $bilkedua
 * @return Int
 */
 public function pengurangan_data($bilpertama,$bilkedua)
 {
 return $bilpertama - $bilkedua;
 }
}

Setelah itu, kita siapkan Controller kita :

<?php
//include file needed
require_once realpath(APPLICATION_PATH . '/../library/').'/Soaps.php';

class SoapwordpressController extends Zend_Controller_Action
{
    private $_WSDL_URI="http://192.168.1.3:10000/zftutwordpress/public/soapwordpress?wsdl";

    public function indexAction()
    {
        $this->getHelper('viewRenderer')->setNoRender();
        if(isset($_GET['wsdl'])) {
            //mengembalikan wsdl...
            $this->hadlereturnWSDL();
        } else {
            //menghandle SOAP request...
            $this->handleActualSOAP();
        }
        die;
    }

    private function hadlereturnWSDL() {
        $autodiscover = new Zend_Soap_AutoDiscover();
        $autodiscover->setClass('Soaps');
        $autodiscover->handle();
    }

    private function handleActualSOAP()
    {
        $soap = new Zend_Soap_Server($this->_WSDL_URI);
        $soap->setClass('Soaps');
        $soap->handle();
    }

    public function clientAction() {

        $client = new Zend_Soap_Client($this->_WSDL_URI);
        //isi variable...
        $tambah =  $client->penambahan_data(45,7);

        //coba tampilkan...
        echo $tambah;

        die;
    }
}

Ok, let’s check clientAction response 🙂
kalau berhasil, maka akan menampilkan angka 52 , karena kita memanggil function penambahan_data dengan input parameter 45 dan 7.

Referensi :
http://blog.ekini.net/2009/05/21/zend-framework-zend_soap-create-a-web-service/
http://makvin-it.com/
http://framework.zend.com