[Symfony] Criteria Objek Syntax
Catetan dikit,
| SQL | Criteria |
|---|---|
WHERE column = value |
->add(column, value); |
WHERE column <> value |
->add(column, value, Criteria::NOT_EQUAL); |
| Other Comparison Operators | |
> , < |
Criteria::GREATER_THAN, Criteria::LESS_THAN |
>=, <= |
Criteria::GREATER_EQUAL, Criteria::LESS_EQUAL |
IS NULL, IS NOT NULL |
Criteria::ISNULL, Criteria::ISNOTNULL |
LIKE, ILIKE |
Criteria::LIKE, Criteria::ILIKE |
IN, NOT IN |
Criteria::IN, Criteria::NOT_IN |
| Other SQL Keywords | |
ORDER BY column ASC |
->addAscendingOrderByColumn(column); |
ORDER BY column DESC |
->addDescendingOrderByColumn(column); |
LIMIT limit |
->setLimit(limit) |
OFFSET offset |
->setOffset(offset) |
FROM table1, table2 WHERE table1.col1 = table2.col2 |
->addJoin(col1, col2) |
FROM table1 LEFT JOIN table2 ON table1.col1 = table2.col2 |
->addJoin(col1, col2, Criteria::LEFT_JOIN) |
FROM table1 RIGHT JOIN table2 ON table1.col1 = table2.col2 |
->addJoin(col1, col2, Criteria::RIGHT_JOIN) |
Starting : PHP Framework Symfony
![]()
Jangan tanya gw tentang deskripsi formalnya. Gw penulis code yang berasaskan best practice dengan konsep seperlunya. Ketika koding sudah efektif dari segi algoritma, memori, dan run time nya, maka cukup sudah. Coding lama2 menyebabkan penggunaan dosis caffein dan nikotin meningkat. Gak Sehat. *malah curhat*
Jadi, setelah cukup lama membangun aplikasi web deingan Code Igniter (CI), sekarang gw dilibatkan dengan aplikasi yang menggunakan php framework Symfony. Seberapa jauh bedanya??? beda banged.
Symfony dikembangkan sampe versi 1.3 . Beda ama CI yang sekarang udah ampe 1.7. Bukan berarti Symfony ga da perkembangan, ato kurang komunitasnya. Justru sejak awal dibangun, Symfony udah sangat direncanakan dengan konsep yang matang. Jadi, baik frameworknya, dokumentasinya, dan dukungan third party libraries-nya bisa dibilang lengkap dan stabil.
What next? pertamakali, cari tahu makhluk apa ini di site resminya : http://www.symfony-project.org/ . Learning curve-nya lumayan berat, so just move on, slowly but sure.
Fundamental things that you have to know sebelum akhirnya masuk lebih jauh ke symfony, ga perlu tau detil, setidaknya cukup mengenal, antara lain :

1. PHP 5. Symfony dibangun diatas PHP 5. Dapat dipastikan berbau bau object, class, dsb.
2. OOP. Relasinya jelas dari point 1. Akan lebih sering menulis code “tanda panah” disini
3. ORM (Object Relational Mapping). Singkat kata, ini merupakan metode pemetaan objek database menjadi objek class, sehingga kelak apapun database yg digunakan, ga jadi masalah. Dalam hal ini, ORM yang digunakan bisa Propel, atau Doctrine.
4. YAML. Semacam XML but with a much simpler syntax. Scripting language yang vital dan banyak ditemukan di symfony. Script ini nantinya akan meng’generate’/parsing menjadi script php yang gak perlu lagi dicoding oleh programmernya.
5. MVC Pattern. Model, View, Controller. Bla bla bla

Ada yang bilang, framework symfony adalah awalan yang baik untuk belajar framework di PHP. Kenapa? ga tau juga, gw baru mulai. Mungkin karena saking kompleksnya framework ini, sehingga kalo ini dikuasai, maka penguasaan framework lain akan lebih mudah. Setidaknya sebelumnya gw udah buktiin kalo CI itu mudah. Lightweight banged ^^ Kita buktikan saja.
[Solved] 9 Langkah Install Windows XP di Compaq CQ40 AMD

Akhirnya, setelah ngilang sekian lama, muncul lagi dibelantara maya..ahahah!!!!! *ga jelas ga penting*
Diawali dengan gak singkronnya beberapa aplikasi programming yang ditanam under windows vista bajakan, maka Compaq CQ40 -gw yang konon gak akur banget dengan windows xp karena kendala driver yang macem2, gw paksa downgrade ke windows XP apapun yang terjadi.
Beberapa testimonial banyak mengeluh tentang kegagalan instalasi yang sudah dipandu berbagai macam tutorial dan petunjuk. masalah sound, graphic, atau lain-lain yang tidak kompatible yang justru malah merusak sistem.
So far, gw coba hanya sekali, dan berhasil. Semoga panduan kilat disini bisa diikuti. Hanya link2 url yang saya baca mulai dari persiapan downgrade, sampai windows xp tertanam baik di notebook gw.
FYI, spek notebook CQ40 ini yang berseri 104xx dengan spesifikasi AMD Turion X2 RM70 2 Gz dengan Ati Radeon 3450.
Lakukan step2 berikut:
1. Backup semua data di C.
2. Download semua driver disini : http://ebookspdf.wordpress.com/2009/08/04/hp-compaq-presario-cq40-drivers-for-windows-xp/
3. Download untuk KHUSUS driver VGA (Display Driver dan ATI Controller) disini : http://game.amd.com/us-en/drivers_catalyst.aspx?p=xp/radeonxip-xp
4. Ini petunjuk untuk rebuild CD XP versi ‘compaqcq40′.Hiraukan semua testimonial kegagalan di postingan berikut, termasuk harus pake cd xp asli
, ikuti saja petunjuknya, jangan terlewat : http://www.justyushi.web.id/2009/03/24/install-windows-xp-di-compaq-cq40-series/
5. Sampai di point 4, gw anggap anda udah pegang CD yang harus di instalkan. Silakan restart, f8, lalu booting lewat cd (f9).
6. Jika ada error tengah jalan, ulangi saja. tapi biasanya ini jarang sekali terjadi. Jika muncul error aneh2, biasanya anda gagal di point 4. Gw, sekali, berhasil.
7. Install driver2 di point 3. Jangan semua, pilih saja beberapa yang berkaitan langsung dengan notebook. Misal, audio, wireless, lan, dll.
8. Khusus untuk vga driver, pake yang yang di point 4. PENTING. karena setelah instalasi vga driver, driver harus di modify. caranya download modtool ATi di link ini, dan ikuti petunjuknya.
9. Done
Proses downgrade selesai.
Adding days on Oracle TIMESTAMP
langsung saja :
$tgl = /*ngambil tanggal yang tipenya timestamp*/
to_date('$tgl','YYYY-MM-DD')+ INTERVAL '30' DAY
catetan kecil aja, biar gampang nyari kalo lupa ; )
[Solved Gitu Loh] Bug Pagination Using Oracle
Begitulah, memang harus disadari bahwa, CodeIgniter sebagai framework yang konon handal dengan berbagai macam database engine, tetap saja suka rada ngadat jika dikawinkan dengan Oracle. Terlebih lagi jika versi oraclenya diatas versi 8.
Tapi, berbahagialah karena pengguna CI bejibun dan komunitasnya berhati doraemon semua. Baik hati dan mau berbagi. Sehingga perlahan tapi pasti semua problem terpecahkan.
Termasuk masalah gw yang akan memanfaatkan fitur pagination. Ada error sana sini ketika gw make fungsi query yang ada limitnya. Sampe akhirnya gw bikin fungsi sendiri.
Berterimakasihlah kepada nebulom-anggota forum ci yang udah memperbaiki fungsi _limit() di oci8_driver.php
timpa fungsi _limit dengan code berikut :
function _limit($sql, $limit, $offset)
{
$limit = $offset + $limit;
$newsql = "SELECT * FROM (select inner_query.*, rownum rnum FROM ($sql) inner_query WHERE rownum <= $limit)";
if ($offset != 0)
{
$newsql .= " WHERE rnum > $offset";
}
// remember that we used limits
$this->limit_used = TRUE;
return $newsql;
}
Sehingga gw bisa grabbing data lebih simple di model :
function GetArtistLimit($limit, $offset){
$sql = "select ....";
$sql_new = $this->db->_limit($sql,$limit,$offset);
$query = $this->db->query($sql_new);
return $query->result_array();
}
di controllernya jadi begini :
function artist_view($status=null)
{
$this->load->library('pagination');
$config['base_url'] = base_url().'index.php/admin/artist/artist_view/null';
$config['total_rows'] = $this->artist_model->count();
$config['per_page'] = '10';
$config['prev_link'] = 'Prev';
$config['next_link'] = 'Next';
$config['first_link'] = 'First';
$config['last_link'] = 'Last';
$config['uri_segment'] = 5;
$this->pagination->initialize($config);
$data['links']=$this->pagination->create_links();
/*data*/
$data['hasil_paging']= $this->artist_model->GetArtistLimit($config['per_page'],$this->uri->segment(5));
..
..
$this->load->view('admin/music/artist_view',$data);
Jangan takut pake CI,
karena pepatah mengatakan,
“If I have to be smarter to use your technology, then your technology sucks”
Error CI : 404 Page Not Found
Error ini gw temukan ketika aplikasi web yang gw kembangbiakkan di XAMPP windows, mendadak error 404 ketika di deploy di server linux.
Hasil pencarian menunjukkan beberapa yang harus diidentifikasi, mungkin juga ini jadi problem serupa yang dialami banyak CI coder :
- Server tidak bisa membaca routing URI yang dibentuk oleh CI. Salah satu solusinya adalah modifikasi file .htaccess. Detilnya silakan google. Ada kok yang versi indonesia dan komplit, sayang gw gak nyimpen linknya.
- Juga karena masalah routing URI. Barangkali sebelum ribet membongkar .htaccess bisa dicoba dengan mengubah-ubah variabel URI protocol di file config.
/*|-------------------------------------------------------------------------- | URI PROTOCOL |-------------------------------------------------------------------------- | | This item determines which server global should be used to retrieve the | URI string. The default setting of "AUTO" works for most servers. | If your links do not seem to work, try one of the other delicious flavors: | | 'AUTO' Default - auto detects | 'PATH_INFO' Uses the PATH_INFO | 'QUERY_STRING' Uses the QUERY_STRING | 'REQUEST_URI' Uses the REQUEST_URI | 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO | */ $config['uri_protocol'] = "AUTO";
Nah kalo anda sudah terlalu lama meng-analisa kebingungan anda tentang itu, coba telisik dengan sesuatu yang lebih fundamental.
Apakah anda ingat bahwa Linux itu bersifat case-sensitive, termasuk ketika membaca URI protocol?
JRENG JRENG!! … *efek ahaa!*
Apakah anda sudah menerapkan konvensi koding milik CI? Diantaranya memberi judul file php diawali dengan huruf kecil, jika terdiri dari dua kata maka harus dipisah dengan underscore ( _ ) .
Walaupun nama class anda diberi nama
Class WelcomeWorld extend Controller {….
Maka tetap saja nama file sebaiknya menjadi welcome_world.php
Sehingga, mungkin saja kesalahan error tadi hanya muncul karena anda memanggil : http://localhost/tdms/index.php/WelcomeWorld ,
yang seharusnya dipanggil
http://localhost/tdms/index.php/welcome_world
Semoga bermanfaat : )
Javascript check all/uncheck all pada checkbox
Kebanyakan tutorial onclick untuk checkbox mengasumsikan nama checkbox yang sama untuk semua item.
<form name="test"> <input type="checkbox" name="checkgroup" checked /> <input type="checkbox" name="checkgroup" /> <input type="checkbox" name="checkgroup" checked /> </form>
Padahal seringkali checkbox yang dibuat dinamai dengan sebuah array. Hal ini untuk mempermudah indexing saat POST di controller.
<input type="checkbox" name="checkgroup[]" checked /> <input type="checkbox" name="checkgroup[]" /> <input type="checkbox" name="checkgroup[]" checked />
Tentu saja, ini membuat js yang mereka share jadi ga valid.
Berikut js script yang gw modif sedikit dan bisa digunakan untuk melakukan ‘check all’ dan ‘uncheck all’ pada array checkbox
<SCRIPT LANGUAGE="JavaScript">
function select(myForm,nameField,a) {
var theForm = myForm;
for (i=0; i
<theForm.elements.length; i++) {
if (theForm.elements[i].name==nameField){
theForm.elements[i].checked = a;
}
}
}
</SCRIPT>
/**keterangan :
* myForm = nama form,
* nameField = nama field checkbox,
* a = 1 atau 0 (checked or not)
*/
Berikut contoh penggunaannya di html:
<a href="#" onClick="select(document.my_form,'view[]',1);return false;">Check All</a>
Atau kalo ditulis dalam CI menjadi :
anchor('#', 'Check All', array('onClick' => 'select(document.add_form,\'view[]\',1);return false;'))
Semoga bermanfaat.
Upload image/audio/video menggunakan CodeIgniter
Kalimat saktinya adalah, CodeIgniter atau CI memfasilitasi proses upload untuk segala file. Ini berarti, masalah selesai. Beres deh project.
Tapi ternyata ada beberapa kondisi yang tidak dijelaskan di manual CI dan problem+problem solving tentang upload ini didiskusikan hanya oleh komunitas CI.
1. Pastikan folder tempat penyimpanan hasil upload sudah tersedia. Karena fungsi upload di CI mengasumsikan bahwa path penyimpanan sudah tersedia. Kalo belum ada, bisa jadi upload menjadi gagal. Bukan berarti jadi ga da solusi. Manfaatkan saja fungsi untuk membuat folder bar
- ProjectCI - + System - + Uploads - - + Banner - - + Mp3 -+User_Guide
2. Atur configurasi upload sesuai yang diinginkan. Jika web anda menghendaki upload dengan berbagai tipe, maka lakukan config setiap kali melakukan proses upload. Tapi, kalo terhitung sedikit tipe-nya. Cukup generalkan saja konfigurasinya di sebuah file config.
/*petikan fungsi upload pada controller*/
function upload_photo(){
$config['upload_path'] = "./uploads/photo/";
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['max_size'] = '2000';
$config['max_width'] = '2000';
$config['max_height']= '2000';
//load library upload
$this->load->library('upload', $config);
//photo adalah nama field
if (!$this->upload->do_upload("photo")) {
$error = array('error' => $this->upload->display_errors());
print_r($error);
}else {
//state jika berhasil
}
}
3. Lihat pada view. Pastikan tipe input teks field bertipe ‘file’ dan jenis form adalah ‘multipart’ .
$new_form['file'] = array(
'type' => 'file',
'name' => 'photo',
'id' => 'file',
'value' => ' '
);
<? echo form_open_multipart('admin/photos/upload_photo/', $attributes); ?>
<? echo form_upload($new_form['file']) ?>
<? echo form_close() ?>
4. Cek kembali tipe file yang ingin anda upload. Buka file mimes.php.
system/application/config/mimes.php
File ini menunjukkan kompatibilitas tipe file apa saja yang dapat diupload.
Misal,
untuk upload mp3, mime type yang diijinkan oleh CI adalah sebagai berikut :
'mp3' => array('audio/mpeg','audio/mpeg3','audio/mpg'),
Beberapa mengalami gagal upload, maka sebaiknya tambahkan tipe tambahan di array tersebut, sehingga menjadi seperti ini.
'mp3' =>
array('audio/mpeg','audio/mpeg3','audio/mpg','audio/x-mpeg','audio/mp3','application/force-download','application/octet-stream'),
5. Sekali lagi cek. Kuncinya tetap di file mimes.php. File movie .mov telah tersedia, tapi tetap gagal upload. Kenapa? coba echo struktur file yang anda coba upload di controller.
print_r($_FILES) ;
/** -hasilnya-
Array
(
[photo] => Array
(
[name] => movieku.mov
[type] => application/octet-stream
[tmp_name] => C:\xampp\tmp\php8A.tmp
[error] => 0
[size] => 0
)
)
<ul>
<li>/</li>
</ul>
Di mimes.php (default CI versi 1.7.1), untuk type mov, strukturnya masih sperti ini:
'mov' => 'video/quicktime',
maka, tambahkan satu type lagi
'mov' => array('video/quicktime','application/octet-stream'),
6. Untuk meringkas proses 5, tambahkan code ini di controller saat upload, untuk melakukan debugging sederhana untuk mengecek type2 yang diijinkan (sesuai config anda) untuk mengecek apakah file upload anda sesuai.
echo "Mime uploaded: ".$this->upload->file_type;
foreach ($this->upload->allowed_types as $val)
{
echo "allowed: "; var_dump($this->upload->mimes_types(strtolower($val)));
}
Ini contoh debugging ketika files mimes.php, index mov udah gw ubah. dan upload sukses.
/*hasil eksekusi echo $_FILES*/
Array
(
[photo] => Array
(
[name] => movieku.mov
[type] => application/octet-stream
[tmp_name] => C:\xampp\tmp\php8A.tmp
[error] => 0
[size] => 0
)
)
/** hasil eksekusi tambahan code di atas.
* config gw -> $config['allowed_types']= 'mpg|avi|mov'
**/
Mime uploaded:
allowed: string(10) "video/mpeg"
allowed: string(15) "video/x-msvideo"
allowed: array(2) {
[0]=>
string(15) "video/quicktime"
[1]=>
string(24) "application/octet-stream"
}
Ini sebagian besar didapat dari googling dan sedikit hasil ulak ulik gw. Mudah2an bisa membantu. CMIIW.
Script JS PopUp Window dan Return Value
Gw punya satu field teks input, kelak isinya kode lagu, dan ada tabel master yang menyimpan kode lagu itu. Sehingga dropdown adalah kemungkinan pertama untuk bisa ‘mewakili’ cara isi di field itu. Tapi kebayang bakal seberapa panjang list dropdown gw, karena lagunya berjumlah ribuan.
So, gw beralih ke cara paling sederhana saja, yaitu dengan memunculkan popup window (child) dan mengembalikan nilainya ke field di window masternya.
<input type=button
onClick='targetitem = document.forms[0].musicid;
dataitem = window.open("url/popup/gw","dataitem", "toolbar=no, resizable = no,menubar=no, scrollbars=yes, width=300, height=300");
dataitem.targetitem = targetitem'
value="Get MusicID">
Code di atas membentuk sebuah button ‘Get MusicID’ yang akan memunculkan popup window.
musicid adalah id dari teks field @form yang akan menampung return value dari popup gw, yang kemudian ditampung ke variabel bernama targetitem.
Didalam halaman popup window (url/popup/gw) , tuliskan script js berikut
<script>
function select_item(item)
{
targetitem.value = item;
top.close();
return false;
}
</script>
Nah, pastinya ada anchor / button yang akan memicu untuk mengembalikan nilai ke window utama sekaligus menutup popup child ini. So, langkah terakhir ini cukup dengan menambahkan event onclick saja :
echo anchor('#', 'Return Value',array("onclick" =>'select_item('.$item['ID'].');'));
Diatas adalah perintah ‘a href’ versi CodeIgniter, yang digantikan dengan fungsi anchor.
HTML versi biasa ditulis seperti ini :
<<span class="start-tag">a</span><span class="attribute-name"> href</span>=<span class="attribute-value">"#" </span><span class="attribute-name">onclick</span>=<span class="attribute-value">"select_item(<?=$ID[$i]?>);"</span>>Return Value</<span class="end-tag">a</span>>
Upload Image 3in1 (3 size hanya 1 upload) menggunakan CodeIgniter
Untuk proses upload sendiri, CodeIgniter (CI) udah memfasilitasinya dengan library ‘upload’, sehingga cukup load library lalu gunakan fungsi-fungsi di dalamnya :
<code>$this->load->library('upload');</code>
Petunjuk lengkap referensi dan konfigurasinya bisa dilihat di CI user guide.
Kemudian, untuk beberapa kebutuhan gw butuh satu hasil upload image ini di resize, sehingga ada image thumbnail size, medium size, dan real size.
Untuk keperluan ini, Freddy Yuswanto membagi pengetahuannya berupa solusi untuk itu. Keterangan yang mudah dipahami ini bisa dilihat di postingnya:
http://kohaci.com/2008/12/14/image-resizing-di-php-codeigniter.html