Welcome to Abdul Malik Ikhsan's Blog

Using Expressive’s middleware in Penny Framework

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

If we are using Penny Framework, we can use Expressive‘s middleware. We can do that with passing callable $next that handle request and response with Penny Event. The $next is simply like the following:

$next = function($request, $response) use ($event) {
   $event->setRequest($request);
   $event->setResponse($response);
};

and we are ready to go! Let’s try to do real example. We need to use los/basepath that can apply “base path” in our application that point to classic-app/public and we can to call: /classic-app/public after our host.

$ composer require los/basepath

We need to invoke the middleware to make it called. So, if we do in ‘bootstrap’ event, we can do:

$eventManager->attach('bootstrap', function($event) {
    $next = function($request, $response) use ($event) {
        $event->setRequest($request);
        $event->setResponse($response);
    };

    $basepathMiddleware = new \LosMiddleware\BasePath\BasePath(
        '/classic-app/public'
    );
    $basepathMiddleware(
        $event->getRequest(),
        $event->getResponse(), 
        $next
    );
});

This is the case if we are using penny skeleton app and we install under ‘classic-app’ directory, and the “front controller” is in public/index.php.

For routed middleware, we can just do the register the middleware as controller:

// config/di.php
// ...
    'router' => function () {
        return \FastRoute\simpleDispatcher(function (\FastRoute\RouteCollector $r) {
            $r->addRoute(
                'GET',
                '/',
                ['App\Controller\IndexController', 'index']
            );

            $r->addRoute(
                'GET',
                '/api/ping',
                ['App\Controller\PingAction', '__invoke']
            );
        });
    },
// ...

That’s it 😉

Advertisements

ZendExpressive: On Callable $next, and middleware_pipeline

Posted in Tutorial PHP, Zend Framework by samsonasik on September 20, 2015

In ZendExpressive, middleware_pipeline is a config that can be used to seed pre- and/or post-routing middleware. There are two keys inside it: pre_routing and post_routing.
Each of them has different purpose, pre_routing means the middleware registered under it will always be pipe()‘d before routing middleware, and for post_routing, they will be pipe()‘d afterwards.

If we create middlewares on them, we may need a call $next that on 3rd parameter in __invoke() method in its middlewares or middlewares that uses them as “next” middlewares. The code may be like this:

public function __invoke($request, $response, $next = null)
{
    // do something with request or response here
    return $next($request, $response);
}

$next will bring current $request and $response which may be modified before filled.

Ok, Let’s say we need an authorization middleware that pipe()‘d early, that means, we need a pre_routing:

class AuthorizationAction {

    public function __invoke($request, $response, $next = null)
    {
        // here, for example: check path and session exists
        // and handle with return response early or
        // continue to routing middleware
        return $next($request, $response);
    }

}

We can do something like this:

class AuthorizationAction {
  public function __construct($session) 
  { /** **/ }
    
  public function __invoke($request, $response, $next = null)
  {
    $path         = $request->getUri()->getPath();
    $sesionExists = $this->session->offsetExists('storage');

    // redirect to login page
    // when path = '/admin' and  
    // doesn't has session 
    if ($path === '/admin' && ! $sesionExists) {
        return new RedirectResponse('/auth');
    }

    if ($path === '/admin' && $sesionExists) {
        // check if session storage value !== 'admin'
        // then return early with status = 403
        $storageValue = $this->session->offsetGet('storage');
        if ($storageValue !== 'admin') {
            $response = $response->withStatus(403);
            $response->write('Forbidden');

            return $response;
        }
    }

    // if everything ok, continue
    return $next($request, $response);
  }
}

We then can register in our 'middleware_pipeline' config:

'middleware_pipeline' => [
    'pre_routing' => [
        [
            'middleware' => 'App\Action\AuthorizationAction',
        ],
    ],
    'post_routing' => [
        // ...
    ],
],

For example, we have routed middleware:

'routes' => [
    [
        'name' => 'funny',
        'path' => '/funny',
        'middleware' => App\Action\FunnyPageAction::class,
        'allowed_methods' => ['GET'],
    ],
    [
        'name' => 'admin',
        'path' => '/admin',
        'middleware' => App\Action\AdminPageAction::class,
        'allowed_methods' => ['GET'],
    ],
],

The AuthorizationAction middleware above will be pipe()‘d before middleware that registered in routes when specified middleware with its route match called.

So, how about post_routing ? We can call middleware registered in it, only if desired, that means, only if $next called in middleware that uses that. For example, we have a SugarAction middleware that change response header that will be placed in post_routing:

class SugarAction {

  public function __construct(RouterInterface $router)
  { $this->router = $router;}

  public function __invoke($request, $response, $next = null)
  {
     if (! $this->router->match($request)->isFailure()) {
         $response = $response->withHeader('X-Powered-By', 'JAVA');
     }
     return $next($request, $response);
  }
}

For note: As post_routing, because if the route is not match, the middleware above will be fall called, and withHeader() actually create new Response instance, we need to check whenever route match is not failure.

We then can register in our ‘middleware_pipeline’ config:

'middleware_pipeline' => [
    'pre_routing' => [
        [
            'middleware' => 'App\Action\AuthorizationAction',
        ],
    ],
    'post_routing' => [
        [
            'middleware' => 'App\Action\SugarAction',
        ],
    ],
],

and we have a /funny that uses that, so we can call $next:

class FunnyAction { 
  public function __invoke($request, $response, $next = null) {
    $response =  $response->write(
        $this->template->render('app::funny-page')
    );
    return $next($request, $response);
  }
}

If we check the header ( for example with Firebug or RestClient), and we can see the header ‘X-Powered-By’ changed. If we have a “not funny page”, and don’t want to modify header, then we can just not use $next.

Using Router match Check and Diactoros’s RedirectResponse in Zend\Expressive

Posted in Tutorial PHP, Zend Framework by samsonasik on September 17, 2015

If we use Zend\Expressive middleware, and want to handle redirection using Diactoros’s RedirectResponse, we may need to check whenever the Uri that we want to redirect is a valid and match against registered Router, if not valid, then back to home/other handling. Zend\Expressive gives us a choice to use ZF2 Router, Aura Router, or FastRoute. They have a way to check Uri is on registered Router, and they return different value when not valid (null for ZF2 Router, false for Aura Router, and FastRoute check with Dispatcher FOUND and NOT_FOUND constants). Zend\Expressive facilitating it by provide Router ‘adapter’ for each of them, and they have match method that return RouteResult instance as Value Object. They RouteResult has a $success property that will be setted as false when not match, and true when matched via following functions:

namespace Zend\Expressive\Router;

class RouteResult
{
    // (new self())->success = true;
    public static function fromRouteMatch($name, $middleware, array $params){}
    // (new self())->success = false;
    public static function fromRouteFailure($methods = null){} 
}

We have another methods to check $success property that have setted:

namespace Zend\Expressive\Router;

class RouteResult
{
    // return $this->success
    public static function isSuccess(){}
    // return (! $this->success);
    public static function isFailure(){} 
}

We can use one of the methods above to check $success property value.

Ok, let’s create an example! For example, we have a SamplePageAction as middleware:

namespace App\Action;

use Zend\Diactoros\Response\RedirectResponse;

class SamplePageAction
{
    public function __invoke($request, $response, $next = null)
    {
        return new RedirectResponse('/a-sample-uri');
    }
}

We need to ‘validate’ if ‘/a-sample-uri’ is a valid uri for our Zend\Expressive application. We can do:

  1. Inject the middleware with Zend\Expressive\Router\RouterInterface
    class SamplePageAction
    {
        private $router;
    
        public function __construct(RouterInterface $router)
        {
            $this->router = $router;
        }
    
        public function __invoke($request, $response, $next = null)
        { /** **/ }
    }
    

  2. Make factory for it

    namespace App\Action;
    
    use Interop\Container\ContainerInterface;
    use Zend\Expressive\Router\RouterInterface;
    
    class SamplePageActionFactory
    {
        public function __invoke(ContainerInterface $container)
        {
            $router   = $container->get(RouterInterface::class);
            return new SamplePageAction($router);
        }
    }
    

  3. If we are using Zend\ServiceManager as the Container, we can register inside our config at ‘factories’

    use App\Action\SamplePageAction;
    use App\Action\SamplePageActionFactory;
    
    //...
            'factories' => [
                SamplePageAction::class => SamplePageActionFactory::class,
            ]
    // ...
    

    if we use other container, we can follow the docs.

  4. Now, we can use it to check and handle route match the request uri

    class SamplePageAction
    {
        public function __construct(RouterInterface $router){ /** **/ }
        public function __invoke($request, $response, $next = null)
        {
            $uri         =  '/a-sample-uri';
    
            // save current path as variable
            $currentPath = $request->getUri()->getPath();
            // set request with Uri
            $request     = $request->withUri(new Uri($uri));
    
            // check match
            $match = $this->router->match($request);
            // check failure and if request uri path is not same with current
            // path to avoid infinite redirection 
            if (! $match->isFailure() 
                && $currentPath !== $request->getUri()->getPath()
            ) {   
                return new RedirectResponse($uri);
            }
    
            // redirect to uri with router name = home 
            // when router is not match  
            return new RedirectResponse($this->router->generateUri('home'));
        }
    }
    

    In real world app, the redirect check usually come from a variable, for example, a Query param(for ex: ‘redirect’ query param). For that case, we can do check like this:

    class SamplePageAction
    {
        public function __construct(RouterInterface $router){ /** **/ }
        public function __invoke($request, $response, $next = null)
        {
            // get arrays of Query params
            $queryParams = $request->getQueryParams();
            
            // check if 'redirect' Query param is set
            // and not equals than ''
            if (isset($queryParams['redirect']) 
                && trim($queryParams['redirect']) !== ''
            ) {  
                // save current path as variable
                $currentPath = $request->getUri()->getPath();
                // set request with Uri
                $request = $request->withUri(new Uri($queryParams['redirect']));
                 
                 // check match
                 $match = $this->router->match($request);
                 // check failure and if request uri path is not same with
                 // current path to avoid infinite redirection 
                 if (! $match->isFailure() 
                     && $currentPath !== $request->getUri()->getPath()
                 ) {
                     return new RedirectResponse($queryParams['redirect']);
                 }
            }
    
            return new RedirectResponse($this->router->generateUri('home'));
        }
    }
    

Update: There is a package for that that I created, go grab it here: https://github.com/samsonasik/ExpressiveRedirectHandler 😉

Zend Framework 2 : Using Zend Framework 1 libraries

Posted in Tutorial PHP, Zend Framework, Zend Framework 2 by samsonasik on December 4, 2012

zf2-zendframework2 Do you still need some components of Zend Framework 1 in your Project that use Zend Framework 2 ? It easy to use Zend Framework 1 libraries in Zend Framework 2 by register Zend Framework 1 libraries in Zend Framework 2 StandardAutoloader or by register at composer’s ClassLoader.

Continue Reading

Zend Framework 2 : Handling Multiple Database

Posted in Teknologi, Tutorial PHP, Zend Framework, Zend Framework 2 by samsonasik on June 6, 2012

Pada skala aplikasi yang besar, kita sering menjumpai aplikasi yang menggunakan beberapa database sekaligus. Zend Framework 2 memfasilitasi kebutuhan ini dengan settingan yang super flexible. Cukup memanggil array konfigurasi, tak perlu pusing memikirkan sintax sql yang mungkin berbeda di teknologi database lain, cukup configure, and run!

Baca Selengkapnya

Zend Framework : Zend_Oauth and Zend_Service_Twitter – Access Your Twitter Application

Posted in Zend Framework by samsonasik on December 12, 2011

Oauth, adalah sebuah protokol terbuka yang memungkinkan pengguna berbagi sumber pribadi yang disimpan di situs web dengan situs lain tanpa perlu menyerahkan username dan kata sandi. Proses ini diberikan dengan memberikan token. Setiap token memberikan akses spesifik terhadap resource spesifik.

Zend Framework mempunyai komponen hebat, bernama Zend_Oauth yang bisa digunakan sebagai consumer untuk me-request token yang dibutuhkan dengan passing konfigurasi callbackUrl, siteUrl, consumerKey, dan consumerSecret.

Baca Selengkapnya

Zend Framework : Zend_Search_Lucene – Content Indexing

Posted in Teknologi, Tutorial PHP, Zend Framework by samsonasik on August 8, 2011

Lucene adalah indexing dan retrieval library yang awalnya didevelop di teknologi Java, dan disupport oleh Apache Software Foundation. Ketika data sudah terindex dalam sistem file, maka tidak membutuhkan database server. Zend_Search_Lucene adalah salah satu komponen dari Zend Framework yang mengimplementasikan teknologi ini.  Zend_Search_Lucene support beberapa fitur :

1. Perangkingan hasil pencarian
2. Powerful query types : boolean, wildcard, phrase queries
3. pencarian dengan field spesifik

Baca Selengkapnya

Symfony2 and Zend Framework Integration

Posted in Tutorial PHP, Zend Framework by samsonasik on July 17, 2011

Symfony2 adalah Full stack PHP Development Framework dengan menggunakan fitur-fitur PHP 5.3, sedang Zend Framework adalah komponen library yang super banyak dan mempunyai layer MVC. Bila 2 Framework ini digabungkan, kebayang kan betapa dahsyatnya ? Hm…, tentu saja prinsip Use at will ( Use What you Need, Forget Everything Else) harus tetap dipakai. Kebutuhan komponen yang very komplit di Zend Framework bisa digunakan di Symfony dengan me-register-kan komponen Zend Framework pada autoloader Symfony Framewok.
Baca Selengkapnya

Dependency Injection -:: The Introduction ::- something must be known before attempting to use zend framework 2.0

Posted in Teknologi, Tutorial PHP, Zend Framework by samsonasik on June 18, 2011

Dependency Injection terjadi ketika komponen software ( dalam hal ini, kelas ) dependensinya diberikan melalui konstruktor mereka, method, atau langsung ke fields. Secara sederhana, Dependency Injection adalah passing atau setting dependency ke dalam komponen software ( Dependency Injection Container ). Dengan kata lain, jika sebuah kelas tidak dapat melakukan pekerjaannya tanpa dependency, maka terjadilah dependency injection. Kelas yang diinject, tidak hanya dapat membangun object, tapi juga perilakunya.

Baca Selengkapnya

Zend Framework : Zend_Acl ( Access Control Lists) Basic – Simple Authorization

Posted in Teknologi, Tutorial PHP, Zend Framework by samsonasik on May 29, 2011

Otorisasi adalah tindakan menentukan apakah seseorang memiliki izin untuk melakukan tindakan atas resource yang ada. Zend Framework mempunyai komponen Zend_Acl untuk mengatur hal tersebut. Zend_Acl dibagi menjadi 3 area, yaitu Resources, Roles, dan Rights. Resources adalah apa yang diakses, Roles adalah “yang mengakses” satu atau beberapa resource, dan Rights adalah hak akses Role terhadap Resource yang diakses. Secara default, Zend_Acl memberikan akses deny untuk semua resource, kita diharuskan memberikan whitelist terhadap akses roles terhadap resources yang kita inginkan.

Baca Selengkapnya

Zend Framework : Zend_Filter vs Zend_Validate – Filtering vs Validation

Posted in Tutorial PHP, Zend Framework by samsonasik on May 17, 2011

Definisi dasar dari filter dapat diartikan menghapus porsi yang tidak diinginkan dari sebuah input, dan membiarkan porsi yang diinginkan lewat dan tampil dalam output. Filtering sangat berguna pada aplikasi web untuk menghapus ilegal input, trimming white space yang tidak perlu, dan lain sebagainya.
Definisi dasar dari filter dapat diperluas untuk mencakup transformasi atas input yang dimasukkan. Transformasi yang banyak digunakan adalah escape HTMLEntities untuk meminimalisir lubang keamanan ( contoh : dari javascript ).

Lain halnya dengan validator, validator memeriksa input sehubungan dengan beberapa persyaratan yang memberikan nilai balik boolean true/false – apakah input berhasil divalidasi berdasar persyaratan yang diberikan.Sebagai contoh, sebuah aplikasi web memberi persyaratan bahwa username  harus lebih dari atau sama dengan 7 karakter dan kurang dari atau sama dengan 15 karakter.

Baca Selengkapnya

Zend Framework : CSRF ( Cross Site Request Forgery ) Protection

Posted in Javascript, Teknologi, Tutorial PHP, Zend Framework by samsonasik on May 6, 2011

XHR (  XMLHttpRequest ) adalah backbone dari aplikasi web 2.0. Adalah fungsi javascript yang powerfull yang menciptakan HttpRequest. Namun, dari kemudahan yang didapat, ternyata XHR menghadirkan konsekuensi tersendiri, yaitu security hole. XHR, seperti yang telah diatur oleh W3C (  World Wide Web Consortium ), hanya digunakan ketika request itu berasal dari website di mana javascript di muat ( same origin ) untuk menghindari penyalahgunaan dari pihak yang tidak bertanggungjawab.
‘Tekanan’ untuk membolehkan adanya akses cross domain mengingkat dengan adanya konsep mash-ups (sebuah konsep di mana membolehkan data dari beberapa site untuk bisa digabungkan dalam satu single view). Requirement ini bertentangan dengan “same origin policy” ( kebijakan penggunaan request dalam site yang sama)  yang diformulasikan untuk XHR. Sebagai response dari kebutuhan ini, maka kebijakan tersebut  diextends ke “level 2” standard, yang membolehkan akses cross domain jika persyaratan lain terpenuhi, untuk melindungi pengguna (W3C Web Applications Working Group, 2008).
Baca Selengkapnya

Zend Framework : Output Escaping – preventing XSS

Posted in Javascript, Teknologi, Tutorial PHP, Zend Framework by samsonasik on April 19, 2011

Cross-site scripting (XSS) merupakan salah satu jenis serangan injeksi kode yang secara umum ditemukan di aplikasi berbasis web melalui client-side script.  Salah satu cara menanganinya adalah dengan cara meng-escape output yang tampil pada halaman web. Pada Symfony Framework, output escaping otomatis dilakukan oleh framework itu sendiri, untuk Zend Framework , preventing XSS adalah tugas programmer :). XSS terjadi di bagian View, maka dari itu, Zend Framework menyediakan component Zend_View ( “view” portion of the ZF model-view-controller pattern) yang bisa digunakan untuk meng-escape output dari misalnya :

<script type="text/javascript">alert('hello');</script>

menjadi :

&lt;script type="text/javascript"&gt;alert('hello');&lt;/script&gt;

Sehingga kode javascript tidak tereksekusi. Nah, ada 2 cara penggunaan metode ini :
1. Encoding before echoing
Di layer View, tinggal kita panggil :

<?php echo $this->escape("<script type=\"text/javascript\">alert('hello');</script>"); ?>

2. Encoding when assigning template variables
Cara yang kedua ini, kita escape dulu di controller, contoh sebagai berikut :

$this->view->title = $this->view->escape("<script type=\"text/javascript\">alert('hello');</script>");

Baru di layer view :

 echo $this->title; 

Referensi :
http://www.scribd.com/doc/18171526/Secure-Programming-with-the-Zend-Framework
http://www.minte9.com/kb/zend-view-helper-programming-zend-framework-i329
http://devzone.zend.com/article/3412
http://en.wikipedia.org/wiki/Client-side_script
http://en.wikipedia.org/wiki/Cross-site_scripting
http://id.wikipedia.org/wiki/XSS
http://stackoverflow.com/questions/507593/what-is-the-best-way-to-escape-user-output-with-the-zend-framework

Zend Framework : Zend_Log – Working with Logs

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

Sebegitu pentingnya sebuah sejarah, sampai-sampai beberapa framework menambahkan fitur log, termasuk Zend Framework. Dengan adanya application log, kita bisa mengetahui apa saja yang telah terjadi yang bersinggungan dengan aplikasi kita. Log yang ada, salah satunya, bisa kita simpan di dalam file.
Kali ini, saya akan mencoba memaparkan penggunaan Zend_Log dengan media penyimpanan file dengan teknik Stream.
Pertama, yang kita butuhkan adalah file yang kita tunjuk sebagai media penyimpanan log, anggaplah kita simpan dalam PROJECTKITA\log\application.log, seperti berikut :


Kalau sudah, kita atur deh ErrorController kita sebagai berikut :

<?php
class ErrorController extends Zend_Controller_Action
{
public function errorAction()
{
$errors = $this->_getParam('error_handler');
switch ($errors->type) {
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
// 404 error -- controller or action not found
$this->getResponse()->setHttpResponseCode(404);
$this->view->message = 'Page not found';
break;
default:
// application error
$this->getResponse()->setHttpResponseCode(500);
$this->view->message = 'Application error';
break;
}

// Log exception, if logger available
if ($log = $this->getLog()) {
$log->crit($this->view->message . " : ". $errors->exception);
}

// conditionally display exceptions
if ($this->getInvokeArg('displayExceptions') == true) {
$this->view->exception = $errors->exception;
}

$this->view->request   = $errors->request;
}

public function getLog()
{
$bootstrap = $this->getInvokeArg('bootstrap');
if (!$bootstrap->hasPluginResource('Log')) {
return false;
}
$log = $bootstrap->getResource('Log');
return $log;
}

}

Selanjutnya, kita setting di application.ini kita, tambahkan kode berikut :

;call Zend_Log_Writer_Stream
resources.log.stream.writerName = "Stream"
resources.log.stream.writerParams.stream = APPLICATION_PATH "/../log/application.log"

Dari kode yang telah kita buat di atas, semua critical error akan dicatat dalam file application.log seperti berikut :

2011-04-16T20:54:33+07:00 CRIT (2): Page not found : exception 'Zend_Controller_Action_Exception' with message 'Action "aa" does not exist and was not trapped in __call()' in D:\Zend\Apache2\htdocs\zftutwordpress\library\Zend\Controller\Action.php:485
Stack trace:
#0 D:\Zend\Apache2\htdocs\zftutwordpress\library\Zend\Controller\Action.php(515): Zend_Controller_Action->__call('aaAction', Array)
#1 D:\Zend\Apache2\htdocs\zftutwordpress\library\Zend\Controller\Dispatcher\Standard.php(295): Zend_Controller_Action->dispatch('aaAction')
#2 D:\Zend\Apache2\htdocs\zftutwordpress\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#3 D:\Zend\Apache2\htdocs\zftutwordpress\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
#4 D:\Zend\Apache2\htdocs\zftutwordpress\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#5 D:\Zend\Apache2\htdocs\zftutwordpress\public\index.php(27): Zend_Application->run()
#6 {main}

Nah, bagaimana ketika kita mempunyai hal aktivitas lain yang ingin kita simpan juga dalam history ? Yang kita perlukan adalah meng-inisialisasi resource dalam file Bootstrap.php kita dengan menambahkan function _init* sebagai berikut :

protected function _initLog()
{
if ($this->hasPluginResource('log')){
$r = $this->getPluginResource('log');
$log = $r->getLog();
Zend_Registry::set('log', $log);
}
}


Kalau sudah, kita coba test dengan memanggil di sembarang action ( misal di TestlogController dengan action indexAction ) sebagai berikut  :

Zend_Registry::get('log')->info('something happened');

maka, di file log akan tampil semacam berikut :

2011-04-17T00:03:15+07:00 INFO (6): something happened

Hm…, asyik kan ? semoga bermanfaat 😀

Referensi :
http://www.zendcasts.com/transparent-logging-with-zend_log/2010/06/
http://framework.zend.com/manual/en/zend.log.writers.html
http://id.php.net/stream
http://en.wikipedia.org/wiki/Server_log
http://framework.zend.com/manual/en/learning.quickstart.create-model.html
http://en.wikipedia.org/wiki/Stream_%28computing%29

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