Wednesday, February 18, 2009

Zend Framework - what a configuration

Hari ini mencoba sesuatu yang baru. Menggunakan 3 orang berpengalaman (including.. me:) )untuk menyelesaikan satu hal sepele.. yaitu mengkonfigurasi sebuah aplikasi PHP berbasis Zend Framework sehingga bisa ditaruh di folder selain webroot. Sebenarnya, tidak ada satupun yang pernah menggunakan Zend Framework (kami terbiasa dengan CakePHP dan CodeIgniter), jadi tentunya tetap ada tantangan.
CodeIgniter menggunakan file konfigurasi system/application/config/config.php untuk menset base_url, dan pada CodeIgniter yg kami pakai sudah ada algoritma deteksi otomatis yang berfungsi baik.
$config['base_url'] = "http://".$_SERVER['HTTP_HOST'];
$config['base_url'] .= preg_replace('@/+$@','',dirname($_SERVER['SCRIPT_NAME'])).'/';
Neverthless, untuk Zend tampaknya konfigurasi disimpan di file app.ini. Ternyata, agak sulit juga mencari dokumentasi tentang isi file ini. Setelah membrowsing-browsing cukup lama, kami menemukan dokumentasi fungsi setBaseUrl di FrontPageController. Pertanyaannya.. darimana ini harus disetup? Hipotesa bahwa baseUrl ini seharusnya diubah via app.ini ternyata salah, kami selanjutnya menemukan bahwa ada orang yang mengubah baseUrl di bootstrap.php.
Dan.. setelah mengikuti itu pun.. tetap saja aplikasi merefer ke CSS dan JS yang ditulis tanpa prefix baseUrl yang baru diset..
Penelusuran lebih lanjut, dengan lead dari seseorang dari kami yang menunjukkan bahwa kita baru menset baseUrl di controller, di mana ada kode pada view mengasumsikan keberadaan $this->baseUrl, yang mana.. ternyata bukan standar Zend Framework..
Mengutip seorang teman yang lebih senior, ternyata embe itu bukan kuda, memang Controller dengan View itu berbeda.. (lain dengan CodeIgniter ya, di mana $this di Controller ekivalen dengan $this di View)
Setelah browsing lebih lanjut, ketemu di blog entry ini dan juga ini, yang menjelaskan bahwa ini memang bukan standar Zend Framework, tapi kita dapat mensetnya di bootstrap.php (juga).
Intinya, cara yang standard dari Zend ialah membuat view dengan kode seperti :
<a href="<?php echo $this->url(array(
'controller' => 'user',
'action' => 'edit',
'id' => '123'
));?>">click me!</a>
untuk menggantikan
<a href="/my_app/user/edit/id/123/">click me!</a>

Tetapi ada cara yang lain (non-standard), yaitu
<a href="<?=$this->baseUrl ?>/user/edit/id/123/">click me!</a>
Sambil menambahkan di bootstrap.php sehingga (garis besarnya) ada fragmen seperti berikut:
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
//view renderer (from the helper broker)
if (is_null($viewRenderer->view)) {
$viewRenderer->init();
//force instantiation of the view
}

$frontController = Zend_Controller_Front::getInstance();
//frontcontroller

//... additional front controller setup goes here ...

$frontController->setBaseUrl('/my_app');
//set your base URL here

$viewRenderer->view->baseUrl = $frontController->getBaseUrl();
//set baseUrl for views, retrieved from the front controller

$response = $frontController->dispatch();
//do... something!
What a configuration. Sebetulnya kalo programmer aslinya (hiudah pakai url helper semua bakal beres. Dan ternyata, masih banyak URL yang ditulis bahkan tanpa referensi ke $this->baseUrl ataupun $this->url(...), yang harus ditulis ulang supaya aplikasi dapat hidup di dalam sebuah folder di bawah webroot.
The moral is.. know your framework well.. or else you'll be shot in

No comments: