Skip navigation

Tag Archives: Yii


To accept Angular $http.post that is formatted as JSON in Yii2, just set this in the Yii2 application component.

        'request' => [
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]
        ],

To use the data, don’t use global $_POST. Instead use

$data = Yii::$app->getRequest->post();
Iklan

Pada postingan kali ini saya akan menuliskan bagaimana menggunakan AWS SDK for PHP version 2 pada Yii. Sebelum menggunakan yang versi 2, saya sudah menggunakan versi 1 dan versi kedua ini lebih mudah digunakan karena dia sudah mendukung pengaturan kode PHP yang sudah terstruktur sesuai dengan rekomendasi standar yang sedang tren yakni PSR. Oleh karena itu penggunaan SDK v2 ini dapat dilakukan dengan menggunakan Composer.

Cara instalasi program Composer untuk melakukan instalasi library AWS SDK, dapat dilihat di sini.

Seperti instalasi paket library ala Composer, pertama-tama kita membuat spesifikasi paket pada berkas “composer.json”. Untuk menambahkan AWS SDK, isi “composer.json” adalah sebagai berikut.

{
  "config": {
    "vendor-dir": "protected/composer/vendors"
  },
  "require": {
    "aws/aws-sdk-php": "2.3.*@dev"
  }
}

Sebenarnya konfigurasi Composer untuk instalasi SDK sudah cukup pada baris 5 sampai 7, tetapi saya pribadi lebih suka menambahkan konfigurasi untuk menyimpan library dari Composer pada direktori “protected/composer/vendors” agar tidak mengotori direktori lain seperti “protected/extensions” dan “protected/vendors“.

Setelah menambahkan konfigurasi tersebut, kita harus menjalankan perintah instalasinya.

petra@pc$composer install
Loading composer repositories with package information
Installing dependencies
  - Installing symfony/event-dispatcher (v2.2.1)
    Loading from cache

  - Installing guzzle/guzzle (v3.5.0)
    Loading from cache

  - Installing aws/aws-sdk-php (dev-master a299b46)
    Cloning a299b46693878b5a7ffaa30e236fbefe9113b6e0

symfony/event-dispatcher suggests installing symfony/dependency-injection (2.2.*)
symfony/event-dispatcher suggests installing symfony/http-kernel (2.2.*)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file
Generating autoload files

Sebelum bisa menggunakan composer, kita harus melakukan include untuk autoloading Composer.

require_once(dirname(__FILE__).'/protected/composer/vendors/autoload.php');
// change the following paths if necessary
$yii=dirname(__FILE__).'/yii/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';

// remove the following lines when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);
// specify how many levels of call stack should be shown in each log message
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);

require_once($yii);
Yii::createWebApplication($config)->run();

Lalu kode di bagian controllernya seperti demikian

class SiteController extends Controller
{

    public function actionIndex()
    {
        if (Yii::app()->request->getIsPostRequest()) {
            $file = CUploadedFile::getInstanceByName('file');
            /* @var $file CUploadedFile */
            if (isset($file)) {
                $s3 = \Aws\S3\S3Client::factory(array(
                        'key' => 'YourAWSKEY',
                        'secret' => 'YourAWSSecret',
                        'region' => \Aws\Common\Enum\Region::SINGAPORE,
                    ));
                /* @var $s3 Aws\S3\S3Client */
                try {
                    $result = $s3->putObject(array(
                        'Bucket' => 'bucketname',
                        'Key' => $file->name,
                        'SourceFile' => $file->tempName,
                        ));
                    /* @var $result \Guzzle\Service\Resource\Model */
                    $url = $result->get("ObjectURL");
                    Yii::app()->user->setFlash('Success', "Upload Success: " . CHtml::link($url, $url));
                } catch (\Aws\S3\Exception\S3Exception $exc) {
                    /* @var $exc \Aws\S3\Exception\S3Exception */
                    $message = $exc->getMessage();
                    Yii::app()->user->setFlash('Failed', "Upload Failed: {$message}");
                }
            }
        }
        $this->render('index');
    }

}

Bagian controller akan menangani request dari upload form kemudian melakukan pengunggahan ke S3. Untuk pengunggahan kita memerlukan kelas S3Client dari AWS SDK. Pada instansiasinya kita perlu mengeset key dan secret dari akun AWS yang dimiliki, serta region tempat penyimpanan.

Lalu proses pengunggahan sendiri akan dilakukan dengan menginvokasi method putObjectObyek yang dikembalikan oleh method ini hanya berupa model yang berisi return value dari invokasi HTTP request yang dilakukan oleh Guzzle. Untuk mengambil URL dari file yang telah diunggah, kita ambil saja atribut ObjectURL pada model tersebut.

Bagian viewnya sangat sederhana.

<h1>Upload file</h1>

<?php if (Yii::app()->user->hasFlash('Success')): ?>
    <div class="flash-success">
        <?php echo Yii::app()->user->getFlash('Success'); ?>
    </div>
<?php endif; ?>
<?php if (Yii::app()->user->hasFlash('Failed')): ?>
    <div class="flash-error">
        <?php echo Yii::app()->user->getFlash('Success'); ?>
    </div>
<?php endif; ?>

<?php echo CHtml::beginForm('', 'post', array('enctype' => 'multipart/form-data')); ?>
<?php echo CHtml::fileField('file'); ?>
<?php echo CHtml::submitButton(); ?>
<?php echo CHtml::endForm(); ?>

Nanti hasilnya akan seperti demikian.

Tampilan Sebelum Pengunggahan

Tampilan Sebelum Pengunggahan

Setelah melakukan pengunggahan, dia akan menampilkan URL yang telah disimpan oleh setFlash.

Tampilan Setelah Pengunggahan

Tampilan Setelah Pengunggahan

Dan di AWS S3 console, sudah bisa dilihat di dalam bucketnya kalau filenya sudah diunggah.

Isi Bucket Setelah Pengunggahan

Isi Bucket Setelah Pengunggahan

AWS SDK for PHP version 2 ini jauh lebih enak digunakan daripada versi sebelumnya karena sudah memenuhi standar PSR sehingga bisa digunakan dengan Composer serta dengan mudah diintegrasikan pada aplikasi Yii. Selain S3, SDK ini juga menyediakan banyak library untuk layanan AWS lainnya seperti EC2, DynamoDB, dll.

Kodenya dapat dilihat di link ini.

Failed

Setelah sekian lama terbengkalai, akhirnya saya melanjutkan postingan ini. Di postingan tersebut (dan postingan-postingan sebelumnya), saya menulis tentang bagaimana mengkustomisasi CJuiAutoComplete sesuai dengan kebutuhan. Tapi kelemahan dari implementasi sebelum-sebelumnya adalahautocompletetersebut terikat pada satucontroller dan agak repot untuk dipakai diview yang lain.

Agar dapat dengan mudah digunakan di view yang lain solusinya adalah dengan membungkus autocomplete tersebut menjadi sebuah Widget. Dengan demikian, untuk menggunakan autocomplete, kita cukup meletakkan kode widgetnya saja. Permasalahan dengan Widget ini adalah bagaimana cara mendapatkan data untuk autocomplete tersebut? Caranya mudah, yakni dengan menggunakan fitur ActionProvider pada Widget.

Read More »


Salah satu masalah yang dihadapi oleh orang saat menggunakan Yii adalah mengambil atribut dari tabel kedua (ketiga, keempat, dst) yang digunakan pada saat JOIN.

Katakanlah saya mempunya dua buah tabel ModelA dan ModelB seperti di bawah.

CREATE TABLE IF NOT EXISTS `ModelA` (
  `id` int(11) NOT NULL,
  `attribute2` int(11) NOT NULL,
  `attribute3` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `ModelB` (
  `id` int(11) NOT NULL,
  `aId` int(11) NOT NULL,
  `attribute3` int(11) NOT NULL,
  `attribute4` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Read More »


Sesuai dengan permintaan di postingan sebelumnya, sekarang saya akan mencoba menambahkan link di dropdown yang dihasilkan oleh autocomplete. Seperti autocomplete yang ada di Facebook, autocomplete yang akan saya modifikasi akan memindahkan halaman ke halaman profil userketika dropdownnya diklik.

Read More »


Melanjutkan postingan sebelumnya, sekarang tampilan dropdown dari CJuiAutoComplete yang hanya teks sederhana akan saya ubah menjadi lebih bagus. Dropdown ini akan kita buat agar bisa menampilkan data selain nama panjang, tetapi juga mungkin foto profil atau asal kota. Nantinya akan mirip dengan search autocomplete yang ada di Facebook seperti di bawah.

Autocomplete di Facebook search.

Read More »


Setelah di postingan sebelumnya menjelaskan tentang cara penggunaan CJuiAutoComplete secara sederhana, postingan ini akan mencoba menyambungkan autocomplete tersebut dengan database.

Read More »


Untuk memenuhi permintaan dari Jupri yang atas permintaan di bagian Request yang meminta tutorial bagaimana cara membuatautocomplete”seperti facebook”.

Autocomplete textfield adalah sebuah textfield yang ketika diberikan input sebuah string maka textfield itu akan menampilkan beberapa hasil rekomendasi. Contoh yang sering terlihat adalah autocomplete di Facebook search ataupunsearch suggestiondi Google Search.

Contoh penggunaan autocomplete untuk Facebook search.

Di Yii sendiri sudah ada komponen bawaan yang mendukung pembuatan fitur autocomplete seperti ini. Komponen ini adalah CJuiAutoComplete (sebelumnya sudah ada CAutoComplete yang kemudian dihentikan pengembangannya). Komponen CJuiAutoComplete tidak lain merupakan pembungkus dari widget jQuery UI – Autocomplete. Kematangan widget ini membuat pengembang Yii menghentikan komponen CAutoComplete dan beralih menggunakan jQuery UI.

Read More »


Salah satu trik penggunaan method scopes di CActiveRecord yang saya suka adalah untuk membatasi SELECT pada SQL Query. Di dalam dokumentasinya sendiri, Yii memberikan contoh penggunaan scopes untuk membatasi kondisi serta urutan dari serangkaian model, tapi ada beberapa trik yang sering saya gunakan pada scopes ini. Seperti yang kita ketahui, salah satu rule of thumbs penggunaan SQL adalah “Only Select What You Need”.
Read More »


Tadi ada yang menanyakan di forum Yii tentang bagaimana membuat file excel yang dapat didownload di Yii. Intinya di sini kita tinggal pakai HTTP Header Content-Disposition yang dapat menyatakan sebuah halaman dapat diunduh ke dalam sebuah file. Setelah itu kita tinggal menggunakan library PHPExcel.

Ini contoh kodenya. Belum saya coba, tapi harusnya jalan.

<?php

class DownloadController extends CController {

        public function actionIndex(){
                //Pertama-tama download phpexcel terus ditaruh di /protected/extension/

                //Load data ke dalam array sebelum dimasukkan ke file Excel
                //ActiveRecord dan kelas-kelas bawaan Yii kemungkinan tidak akan jalan setelah kita nyalakan PHPExcel

                $users = User::model()->findAll();

                $arrayUsers = array();
                foreach($users as $user){
                        $arrayUsers[] = array(
                                'nama' => $user->nama,
                                'email' => $user->email,
                        );
                }

                //Matikan autoloader bawaannya Yii
                $phpExcelPath = Yii::getPathOfAlias('ext.phpexcel.Classes');
                spl_autoload_unregister(array('YiiBase', 'autoload'));
                //Include PHPExcel
                include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');
                //Setelah ini kelas-kelas bawaan Yii kemungkinan besar tidak akan jalan

                //Buat object PHPExcel Baru
                $objPHPExcel = new PHPExcel();
                $objPHPExcel->getProperties()->setCreator("Petra Barus");
                $objPHPExcel->getProperties()->setLastModifiedBy("Petra Barus");
                $objPHPExcel->getProperties()->setTitle("Dokumen Saya");
                $objPHPExcel->getProperties()->setSubject("Dokumen Saya");
                $objPHPExcel->getProperties()->setDescription("Dokumen Saya");

                //Selecting sheets
                $objPHPExcel->setActiveSheetIndex(0);

                //Mengisi Excel
                foreach($arrayUsers as $k => $u){
                        $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $k, $u['nama']);
                        $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(2, $k, $u['email']);
                }

                //HTTP Header untuk download
                header('Content-type: application/ms-excel');
                header('Content-Disposition:  inline; attachment; filename=dokumen.xls');
                flush();

                //Dumping data to HTTP
                $writer = new PHPExcel_Writer($objPHPExcel);
                $writer->save('php://output');

		exit();

        }
}
%d blogger menyukai ini: