Advertisement
  1. Code
  2. Yii

Membangun Startup Anda dengan PHP: Pengaturan Pengguna, Gambar Profil, dan Detail Kontak

Scroll to top
Read Time: 13 min
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Access Control, Active Record Relations and Slugs
Building Your Startup With PHP: Scheduling a Meeting

Indonesian (Bahasa Indonesia) translation by ⚡ Rova Rindrata (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Tutorial ini adalah bagian dari serial Membangun Startup Anda dengan PHP di Tuts+. Dalam seri ini, saya membimbing Anda melalui peluncuran startup dari konsep ke kenyataan menggunakan aplikasi Meeting Planner saya sebagai contoh nyata. Setiap langkah di sepanjang jalan, kami akan merilis kode Meeting Planner sebagai contoh sumber terbuka yang bisa Anda pelajari. Kami juga akan mengatasi masalah bisnis terkait startup saat muncul.

Dalam tutorial ini, kita akan membangun area utama di sekitar data pengguna sendiri untuk penggunaan yang lebih luas melalui aplikasinya:

  1. Contact Details: nomor telepon pengguna dan alamat konferensi video untuk rapat virtual
  2. User Settings: untuk melacak preferensi pengguna dalam aplikasi
  3. Profile Images: untuk memungkinkan pengguna mengunggah foto yang dapat kita gunakan pada halaman rapat

Semua kode untuk Meeting Planner ditulis dalam Kerangka Yii2 untuk PHP, yang memiliki dukungan bawaan untuk I18n. Jika Anda ingin mempelajari lebih lanjut tentang Yii2, lihat seri paralel kami Pemrograman dengan Yii2 di Tuts+.

Sekadar mengingatkan, saya ikut dalam thread komentar di bawah ini. Saya terutama tertarik jika Anda memiliki pendekatan yang berbeda, ide tambahan, atau ingin menyarankan topik untuk tutorial selanjutnya.

Rincian Kontak

Tujuan rincian kontak adalah untuk memungkinkan pengguna memberikan nomor telepon dan alamat konferensi video untuk rapat virtual. Nomor telepon juga berguna pada sebelum dan sesudah pertemuan.

Membangun fitur ini relatif mudah. Seperti yang kita lakukan di tutorial sebelumnya, kita menggunakan generator kode Yii, Gii, untuk membuat model untuk file UserContact dan CRUD.

Kita juga memperbarui bar navigasi untuk menyertakan tautan ke fitur User Contact. Di frontend/views/layouts/main.php:

1
$menuItems[] = [              
2
    'label' => 'Account',
3
    'items' => [
4
       [
5
          'label' => Yii::t('frontend','Friends'),
6
          'url' => ['/friend'],
7
      ],
8
         [
9
            'label' => Yii::t('frontend','Contact information'),
10
            'url' => ['/user-contact'],
11
        ],
12
         [
13
            'label' => Yii::t('frontend','Settings'),
14
            'url' => ['/user-setting'],
15
        ],
16
         [
17
            'label' => Yii::t('frontend','Logout').' (' . Yii::$app->user->identity->username . ')',
18
            'url' => ['/site/logout'],
19
            'linkOptions' => ['data-method' => 'post']
20
        ],
21
    ],
22
];      		
23
echo Nav::widget([
24
    'options' => ['class' => 'navbar-nav navbar-right'],
25
    'items' => $menuItems,
26
]);

Anda juga dapat melihat tautan di atas ke fitur User Settings yang akan dijelaskan lebih lanjut di bawah.

Menambahkan pilihan dropdown untuk jenis adalah ekstensi model umum yang kita gunakan untuk membuat formulir lebih ramah. Lihat dropdown Type of Contact di bawah ini:

Add Your Contact Form with Type DropdownAdd Your Contact Form with Type DropdownAdd Your Contact Form with Type Dropdown

Berikut adalah definisi jenis model dan metode helper untuk memungkinkan dropdown yang ramah untuk layanan jenis kontak:

1
class UserContact extends \yii\db\ActiveRecord
2
{
3
    const TYPE_OTHER = 0;
4
    const TYPE_PHONE = 10;
5
    const TYPE_SKYPE = 20;
6
    const TYPE_FACEBOOK = 30;
7
    const TYPE_GOOGLE = 40;
8
    const TYPE_MSN = 50;
9
    const TYPE_AIM = 60;
10
    const TYPE_YAHOO = 70;
11
    const TYPE_ICQ = 80;
12
    const TYPE_JABBER = 90;
13
    const TYPE_QQ = 100;
14
    const TYPE_GADU = 110;
15
    
16
    ...
17
    
18
    public function getUserContactType($data) {
19
      $options = $this->getUserContactTypeOptions();
20
      return $options[$data];
21
    }
22
23
    public function getUserContactTypeOptions()
24
    {
25
      return array(
26
          self::TYPE_PHONE => 'Phone',
27
          self::TYPE_SKYPE => 'Skype',
28
          self::TYPE_OTHER => 'Other',
29
          self::TYPE_FACEBOOK => 'Facebook Messenger',
30
          self::TYPE_GOOGLE => 'Google Talk',
31
          self::TYPE_MSN => 'MSN Messenger',
32
          self::TYPE_AIM => 'AIM',
33
          self::TYPE_YAHOO => 'Yahoo! Messenger',
34
          self::TYPE_ICQ => 'ICQ',
35
          self::TYPE_JABBER => 'Jabber',
36
          self::TYPE_QQ => 'QQ',
37
          self::TYPE_GADU => 'Gadu-Gadu',
38
         );
39
     }

Berikut ini dropdown yang diimplementasikan dalam formulir:

1
<div class="user-contact-form">
2
3
    <?php $form = ActiveForm::begin(); ?>
4
5
    <?= $form->field($model, 'contact_type')
6
            ->dropDownList(
7
                $model->getUserContactTypeOptions(),   
8
                    ['prompt'=>Yii::t('frontend','What type of contact is this?')] 
9
	            )->label(Yii::t('frontend','Type of Contact')) ?>

Helper jenis ini adalah konstruksi umum di seluruh Meeting Planner.

Sekarang, mari kita lanjutkan ke pengaturan pengguna.

Pengaturan Pengguna

Seiring berkembangnya fungsionalitas Meeting Planner, penting untuk memungkinkan pengguna menyesuaikan fungsionalitas dengan sekumpulan preferensi. Kita membangun sub-sistem pengaturan pengguna untuk mengelola preferensi ini dalam aplikasi.

Tabel UserSetting sedikit berbeda dari model lain karena setiap pengguna hanya memiliki satu record, dan setiap record memiliki banyak kolom yang mewakili pengaturan pengguna tertentu. Ini berbeda dengan ketika pengguna menambahkan entri kontak, di mana setiap pengguna memiliki banyak record yang masing-masing mewakili entri kontak.

Ketika pengguna memodifikasi pengaturannya, kita memperbarui record pengaturan masing-masing. Kita juga dapat memperpanjang kolom tabel dari waktu ke waktu untuk mendukung opsi tambahan.

Kita perlu membuat fungsi helper yang memuat pengaturan pengguna dan membuat record default untuk mereka jika tidak ada.

Kita juga perlu membuat formulir untuk mempermudah pengaturan konfigurasi. Kita dapat menggunakan tata letak Bootstrap dan ekstensi widget Yii2.

Memilih Pengaturan Pengguna Pertama Kita

Meskipun jumlah pengaturan akan meningkat dari waktu ke waktu, mari tinjau beberapa yang ingin kita mulai dengan:

  • Foto profil pengguna (path ke file yang akan diunggah)
  • Menerima pengingat sehari sebelum pertemuan
  • Menerima pengingat di hari-hari menjelang pertemuan
  • Berbagi detail kontak dengan peserta pertemuan
  • Memblokir semua email dari sistem

Kita dapat membuat tabel User Setting dengan Active Record Migration dan memperpanjangnya dengan migrasi yang diperbarui nantinya.

1
./yii migrate/create create_user_setting_table

Berikut migrasi dengan kolom untuk pengaturan kita—perhatikan relasinya ke tabel User:

1
<?php
2
3
use yii\db\Schema;
4
use yii\db\Migration;
5
6
class m150124_003721_create_user_setting_table extends Migration
7
{
8
  public function up()
9
  {
10
      $tableOptions = null;
11
      if ($this->db->driverName === 'mysql') {
12
          $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
13
      }
14
15
      $this->createTable('{{%user_setting}}', [
16
          'id' => Schema::TYPE_PK,
17
          'user_id' => Schema::TYPE_BIGINT.' NOT NULL',
18
          'filename' => Schema::TYPE_STRING.' NOT NULL',
19
          'avatar' => Schema::TYPE_STRING.' NOT NULL',
20
          'reminder_eve' => Schema::TYPE_SMALLINT.' NOT NULL',
21
          'reminder_hours' => Schema::TYPE_INTEGER.' NOT NULL',
22
          'contact_share' => Schema::TYPE_SMALLINT.' NOT NULL',
23
          'no_email' => Schema::TYPE_SMALLINT.' NOT NULL',
24
          'created_at' => Schema::TYPE_INTEGER . ' NOT NULL',
25
          'updated_at' => Schema::TYPE_INTEGER . ' NOT NULL',
26
      ], $tableOptions);
27
      $this->addForeignKey('fk_user_setting_user_id', '{{%user_setting}}', 'user_id', '{{%user}}', 'id', 'CASCADE', 'CASCADE');
28
  }
29
30
  public function down()
31
  {
32
      $this->dropForeignKey('fk_user_setting_user_id', '{{%user_setting}}');    
33
      $this->dropTable('{{%user_setting}}');
34
  }
35
}

Menjalankan migrasinya:

1
./yii migrate/up
2
Yii Migration Tool (based on Yii v2.0.2)
3
4
Total 1 new migration to be applied:
5
    m150124_003721_create_user_setting_table
6
7
Apply the above migration? (yes|no) [no]:yes
8
*** applying m150124_003721_create_user_setting_table
9
    > create table {{%user_setting}} ... done (time: 0.017s)
10
    > add foreign key fk_user_setting_user_id: {{%user_setting}} (user_id) references {{%user}} (id) ... done (time: 0.009s)
11
*** applied m150124_003721_create_user_setting_table (time: 0.031s)
12
13
14
Migrated up successfully.

Menulis Kode

Kita bisa menggunakan Gii untuk menghasilkan file model dan CRUD untuk kita. Tentu saja, kita harus memodifikasi CRUD untuk hanya menampilkan record pengguna saat ini.

Berikut pengaturan untuk Model Generator:

Yii Code Generator Gii with Model UserSettingYii Code Generator Gii with Model UserSettingYii Code Generator Gii with Model UserSetting

Berikut pengaturan untuk controller CRUD:

Yii Gii Code Generator CRUD for User SettingsYii Gii Code Generator CRUD for User SettingsYii Gii Code Generator CRUD for User Settings

Ketika pengguna mengklik Settings di bar navigasi, kita ingin benar-benar menampilkan halaman pembaruan pengaturan. Mari buat beberapa helper untuk memeriksa record pengaturan pengguna dan membuatnya jika tidak ada.

Berikut pengalihan indeks ke tindakan pembaruan:

1
/**

2
     * Default path - redirect to update

3
     * @return mixed

4
     */
5
    public function actionIndex()
6
    {
7
      // returns record id not user_id

8
      $id = UserSetting::initialize(Yii::$app->user->getId());
9
      return $this->redirect(['update', 'id' => $id]);
10
    }

Metode Initialize membuat record untuk pengguna aktif dan menetapkan semua pengaturan default:

1
 public static function initialize($user_id) {
2
      $us = UserSetting::find()->where(['user_id'=>$user_id])->one();
3
      if (is_null($us)) {
4
        $us=new UserSetting;
5
        $us->user_id = $user_id;
6
        $us->filename='';
7
        $us->avatar='';
8
        $us->reminder_eve = self::SETTING_YES;
9
        $us->no_email = self::SETTING_NO;
10
        $us->contact_share = self::SETTING_YES;
11
        $us->reminder_hours = 48;
12
        $us->save();
13
      }
14
      return $us->id;
15
    }

Menyesuaikan Formulir Pengaturan

Kita harus mengganti beberapa kode formulir yang dihasilkan secara otomatis untuk menyertakan kotak centang dan daftar dropdown lain (seperti yang kita lakukan dengan Jenis UserContact di atas). Saya suka fungsi kotak centang Yii menyertakan kemampuan untuk menentukan nilai set dan unset. Biasanya, kotak centang formulir web mengembalikan elemen kosong (ada) untuk true atau tidak mengembalikan (tidak ada) untuk false.

1
<?= $form->field($model, 'reminder_eve')->checkBox(['label' => Yii::t('frontend','Send final reminder the day before a meeting'), 'uncheck' =>  $model::SETTING_NO, 'checked' => $model::SETTING_YES]); ?> 
2
3
         <?= $form->field($model, 'reminder_hours')
4
                 ->dropDownList(
5
                     $model->getEarlyReminderOptions(),   
6
                         ['prompt'=>Yii::t('frontend','When would you like your early reminder?')] 
7
     	            )->label(Yii::t('frontend','Early reminders')) ?>
8
9
            <?= $form->field($model, 'contact_share')->checkbox(['label' =>Yii::t('frontend','Share my contact information with meeting participants'),'uncheck' =>  $model::SETTING_NO, 'checked' => $model::SETTING_YES]); ?> 
10
11
            <?= $form->field($model, 'no_email')->checkbox(['label' =>Yii::t('frontend','Turn off all email'),'uncheck' =>  $model::SETTING_NO, 'checked' => $model::SETTING_YES]); ?>

Inilah hasil akhirnya:

Meeting Planner Update Your SettingsMeeting Planner Update Your SettingsMeeting Planner Update Your Settings

Mari lanjutkan dan memperpanjang UserSetting untuk mendukung foto profil.

Gambar Profil

Untuk menampilkan foto pengguna di halaman pertemuan, kita perlu mendukung pengguna yang mengunggah foto (dalam banyak kasus). Atau, setidaknya untuk default, kita dapat menggunakan layanan Gravatar yang mengaitkan foto profil dengan alamat email pengguna. Mengunggah dan menyimpan file di server selalu merupakan tugas pengembangan web yang terperinci dan rumit yang akan kita lewati dalam waktu dekat.

Mengkonfigurasi Tab Bootstrap

Pertama, mari kita mulai dengan menambahkan tab ke formulir pengaturan pengguna yang akan memisahkan pengaturan umum dari gambar profil. Dengan menggunakan definisi gaya nav-tab Bootstrap, kita mendapatkan ini:

1
<!-- Nav tabs -->
2
<ul class="nav nav-tabs" role="tablist">
3
  <li class="active"><a href="#general" role="tab" data-toggle="tab">Settings</a></li>
4
  <li><a href="#photo" role="tab" data-toggle="tab">Upload Photo</a></li>
5
</ul>
6
<!-- Tab panes -->
7
<div class="tab-content">
8
  <div class="tab-pane active vertical-pad" id="general">
9
      <?= $form->field($model, 'reminder_eve')->checkBox(['label' => Yii::t('frontend','Send final reminder the day before a meeting'), 'uncheck' =>  $model::SETTING_NO, 'checked' => $model::SETTING_YES]); ?> 
10
11
      <?= $form->field($model, 'reminder_hours')
12
              ->dropDownList(
13
                  $model->getEarlyReminderOptions(),   
14
                      ['prompt'=>Yii::t('frontend','When would you like your early reminder?')] 
15
  	            )->label(Yii::t('frontend','Early reminders')) ?>
16
17
         <?= $form->field($model, 'contact_share')->checkbox(['label' =>Yii::t('frontend','Share my contact information with meeting participants'),'uncheck' =>  $model::SETTING_NO, 'checked' => $model::SETTING_YES]); ?> 
18
19
         <?= $form->field($model, 'no_email')->checkbox(['label' =>Yii::t('frontend','Turn off all email'),'uncheck' =>  $model::SETTING_NO, 'checked' => $model::SETTING_YES]); ?>
20
       </div>
21
  <div class="tab-pane vertical-pad" id="photo">
22
23
    <?= $form->field($model, 'image')->widget(FileInput::classname(), [
24
        'options' => ['accept' => 'image/*'],
25
         'pluginOptions'=>['allowedFileExtensions'=>['jpg','gif','png']],
26
    ]);   ?>
27
  </div> <!-- end of upload photo tab -->
28
</div>

Yang tampak seperti ini:

User Settings with Bootstrap TabsUser Settings with Bootstrap TabsUser Settings with Bootstrap Tabs

Secara default, jika tidak ada gambar yang diunggah, kita akan mencoba untuk menampilkan Gravatar pengguna.

Ekstensi Yii2 yang Berguna untuk Gambar Profil

Ada empat ekstensi Yii2 yang ingin saya sertakan untuk dukungan gambar profil:

  1. Gravatar dari Carsten Brandt untuk menampilkan gravatars
  2. File Input dari Kartik Visweswaran untuk mendukung pengunggahan file gambar
  3. Yii Imagine untuk skala gambar ke ukuran yang berbeda-beda
  4. 2Amigos Resource Manager untuk dukungan penyimpanan Amazon S3 nantinya

Visweswaran dan 2Amigos telah menghasilkan sejumlah ekstensi Yii2 yang sangat berguna dan umumnya menyediakan dokumentasi yang solid juga.

Jadi, tambahkan ekstensi ini ke file composer.json Anda:

1
        "cebe/yii2-gravatar": "*",
2
        "kartik-v/yii2-widget-fileinput": "*",
3
        "yiisoft/yii2-imagine": "*",
4
        "2amigos/yii2-switch-widget": "0.1.*",
5
        "2amigos/yii2-resource-manager-component": "0.1.*"

Dan perbarui composer:

1
composer update

Menggunakan Gambar Gravatar

Jika tidak ada gambar profil yang dikonfigurasi, kita akan menampilkan gravatar pengguna. Layanan Gravatar merujuk alamat email pengguna terdaftar. Berikut kode untuk menampilkan Gravatar:

1
echo \cebe\gravatar\Gravatar::widget([
2
     'email' => common\models\User::find()->where(['id'=>Yii::$app->user->getId()])->one()->email,
3
     'options' => [
4
         'class'=>'profile-image',
5
         'alt' => common\models\User::find()->where(['id'=>Yii::$app->user->getId()])->one()->username,
6
     ],
7
     'size' => 128,
8
 ]);              

Itu akan terlihat seperti ini. Jika pengguna telah mengonfigurasi Gravatar, Anda akan melihat gambar pilihan mereka.

Displaying a Gravatar with Yii2Displaying a Gravatar with Yii2Displaying a Gravatar with Yii2

Mengunggah Gambar Profil

Untuk mengunggah gambar, kita akan menggunakan widget file input dari Kartik yang luar biasa. Dia juga menawarkan penjelasan yang sangat bagus tentang cara menggunakannya.

Berikut kode untuk pembaruan formulir kita yang menampilkan widget di panel Upload Photo:

1
<div class="tab-pane vertical-pad" id="photo">
2
   <?= $form->field($model, 'image')->widget(FileInput::classname(), [
3
       'options' => ['accept' => 'image/*'],
4
        'pluginOptions'=>['allowedFileExtensions'=>['jpg','gif','png']],
5
   ]);   ?>
6
 </div> <!-- end of upload photo tab -->

Bagian atas formulir mencakup enctype untuk multi-part form data:

1
<div class="user-setting-form">
2
    <?php 
3
    $form = ActiveForm::begin([
4
        'options'=>['enctype'=>'multipart/form-data']]); // important         

5
         ?>

Formulirnya seperti ini:

Yii2 File Input Extension - Upload a Profile ImageYii2 File Input Extension - Upload a Profile ImageYii2 File Input Extension - Upload a Profile Image

Kami juga menambahkan aturan ke model UserSetting untuk membatasi unggahan ke jpg, gif dan png, dan untuk membatasi ukuran unggahan menjadi 100kb.

1
public function rules()
2
    {
3
        return [
4
            [['user_id', ], 'required'],
5
            [['user_id', ], 'unique'],
6
            [['image'], 'safe'],
7
            [['image'], 'file', 'extensions'=>'jpg, gif, png'],
8
            [['image'], 'file', 'maxSize'=>'100000'],
9
             [['filename', 'avatar'], 'string', 'max' => 255],
10
            [['user_id', 'reminder_eve', 'reminder_hours', 'contact_share', 'no_email', 'created_at', 'updated_at'], 'integer'],
11
        ];
12
    }

Ngomong-ngomong, validator Yii2 memiliki kemampuan yang luar biasa untuk banyak operasi umum yang pengembang web biasanya dapat membangun dengan manual. Saya akan mencoba untuk mengeksplorasi ini dalam tutorial Pemrograman dengan Yii2 mendatang.

Berikut kode yang menangani posting dari formulir pembaruan. Secara umum, mungkin lebih baik untuk mengolah lebih banyak kode ini ke dalam metode model dan mengurangi jumlah kerumitan dalam controller.

1
if ($model->load(Yii::$app->request->post())) {
2
           $image = UploadedFile::getInstance($model, 'image');
3
           if (!is_null($image)) {
4
             // save with image

5
              // store the source file name

6
             $model->filename = $image->name;
7
             $ext = end((explode(".", $image->name)));
8
             // generate a unique file name to prevent duplicate filenames

9
             $model->avatar = Yii::$app->security->generateRandomString().".{$ext}";
10
             // the path to save file, you can set an uploadPath

11
             // in Yii::$app->params (as used in example below)

12
             Yii::$app->params['uploadPath'] = Yii::$app->basePath . '/web/uploads/avatar/';
13
             $path = Yii::$app->params['uploadPath'] . $model->avatar;
14
             $model->user_id = Yii::$app->user->getId();
15
             if($model->update()){
16
               $image->saveAs($path); 

Gambar-gambar harus disimpan di mana mereka dapat dilihat oleh server web. Saya telah membuat direktori uploads/avatar di pohon /frontend/web.

Skala Gambar-gambar dengan Imagine

Kita sebenarnya ingin menyimpan gambar dalam tiga ukuran: ukuran penuh, satu kotak kecil untuk ditampilkan di bilah navigasi atau tampilan daftar, dan satu kotak berukuran sedang untuk halaman pertemuan.

Kita akan menggunakan ekstensi Imagine Yii2 untuk menskala gambar; itu memperluas perpustakaan manipulasi gambar Imagine untuk PHP.

Berikut kode yang menskala dan menyimpan ukuran gambar tambahan:

1
$image->saveAs($path);            
2
Image::thumbnail(Yii::$app->params['uploadPath'].$model->avatar, 120, 120)
3
    ->save(Yii::$app->params['uploadPath'].'sqr_'.$model->avatar, ['quality' => 50]);
4
Image::thumbnail(Yii::$app->params['uploadPath'].$model->avatar, 30, 30)
5
        ->save(Yii::$app->params['uploadPath'].'sm_'.$model->avatar, ['quality' => 50]);

Ini formulir yang selesai menampilkan gambar persegi di halaman profil pengguna:

Meeting Planner Update Your Settings with Tabs and Profile ImageMeeting Planner Update Your Settings with Tabs and Profile ImageMeeting Planner Update Your Settings with Tabs and Profile Image

Membersihkan Gambar yang Tidak Terpakai

Ketika pengguna mengunggah foto baru, kita perlu menghapus gambar lama dan salinan berskala yang menyertainya. Kita akan memperluas controller untuk memanggil metode penghapusan yang baru:

1
$image = UploadedFile::getInstance($model, 'image');
2
           if (!is_null($image)) {
3
             // path to existing image for post-delete

4
             $image_delete = $model->avatar;
5
             
6
             ...
7
             
8
             $model->deleteImage(Yii::$app->params['uploadPath'],$image_delete);

Inilah metode deleteImage di UserSetting:

1
public function deleteImage($path,$filename) {
2
           $file =array();           
3
           $file[] = $path.$filename;
4
           $file[] = $path.'sqr_'.$filename;
5
           $file[] = $path.'sm_'.$filename;
6
           foreach ($file as $f) {
7
             // check if file exists on server

8
             if (!empty($f) && file_exists($f)) {
9
               // delete file

10
               unlink($f);
11
             }             
12
           }
13
       }

Menggunakan Amazon S3 untuk Menyimpan Gambar

Menyimpan gambar yang diunggah pengguna di server web kita dapat menciptakan kerumitan. Ini berarti bahwa selain membuat cadangan MySQL, kita juga harus selalu membuat cadangan sebagian dari sistem file. Ini dapat mempersulit operasi pemulihan server dan migrasi. Ini juga menempatkan beban pada stack LAMP kita setiap kali gambar dimuat.

Menggunakan Amazon S3 memisahkan tugas ini dari server web utama Anda dan dapat meningkatkan kinerja serta menyederhanakan pengelolaan server dari waktu ke waktu, terutama di sekitar portabilitas, skalabilitas, dan peningkatan. Saya akan meninjau pengunggahan dan pengaksesan file dari Amazon S3 dalam tutorial mendatang.

Apa berikutnya?

Saya harap Anda telah belajar beberapa aspek terapan Yii, ActiveRecord, Bootstrap, formulir, pengunggahan file, dan manipulasi gambar. Saya senang bekerja dengan beberapa widget JQuery baru yang tersedia sebagai ekstensi Yii. Nantikan tutorial yang akan datang di serial Membangun Startup Anda dengan PHP—ada banyak fitur menyenangkan yang akan muncul. Bahkan, kita semakin dekat untuk dapat menjadwalkan pertemuan pertama kita!

Silakan tambahkan pertanyaan dan komentar Anda di bawah ini; Saya biasanya berpartisipasi dalam diskusi. Anda juga bisa menghubungi saya di Twitter @reifman atau email saya secara langsung.

Tautan Terkait

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.