Advertisement
  1. Code
  2. Startups

Membangun Startup Anda: Rapat dengan Banyak Peserta

Scroll to top
Read Time: 12 min
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Requesting Scheduling Changes
Building Your Startup: Completing Group Scheduling

Indonesian (Bahasa Indonesia) translation by Kurniawan Sugi Purwanto (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 seri Membangun Startup Anda dengan PHP di Envato Tuts+. Di seri ini, saya akan memandu Anda untuk meluncurkan suatu startup dari konsep menuju kenyataan dengan menggunakan aplikasi Meeting Planner saya sebagai contoh di kehidupan nyata. Di setiap tahap, akan saya rilis kode Meeting Planner sebagai contoh open-source yang bisa Anda pelajari. Saya juga akan menunjukkan isu-isu bisnis terkait startup yang muncul.

Perkenalan terhadap Rapat Grup

Penjadwalan rapat dengan banyak peserta selalu menjadi bagian rencana saya—tetapi bukan bagian paling awal Minimum Viable Product (MVP). Rilis alpha Meeting Planner hanya diluncurkan dengan penjadwalan 1:1. Tujuan dukungan terhadap penjadwalan grup terletak pada daftar tugas seperti Mount Everest bagi seorang pendaki yang membidik tujuh puncak (dan saya bahkan bukan seorang pendaki luar ruangan).

Rapat dengan banyak peserta adalah salah satu penjadwalan yang paling menantang, dan karenanya bernilai bagi produk Meeting Planner yang ditawarkan. Saya sangat senang ketika daftar tugas beta mencapai titik yang saya bisa mulai mengerjakan ini.

Saya telah merencanakan, membuat arsitek, dan menulis kode dengan memikirkan rapat grup sejak dari awal. Saya berharap bahwa memperbarui situs dengan fitur ini tidak akan membutuhkan perubahan UX yang signifikan atau perubahan kode. Ternyata dibutuhkan jalan tengah, 7-10 hari kerja dan pengjian yang sangat fokus tetapi tanpa pengaturan ulang arsitektur besar-besaran.

Kenyataannya, pengujian adalah salah satu aspek tersulit dalam membuat fitur ini. Selain juga membantu menyingkapkan sejumlah kekurangan di kode awal. Bukan hanya tak semudah itu... mengirim ke berbagai alamat email, memeriksa bahwa tiap orang menerima notifikasi yang tepat, bukan yang salah—dan melihat semua opsi-opsi menu yang benar di seluruh bagian situs.

Di tutorial hari ini, saya akan membahas tentang memungkinkan banyak partisipan, upgrade UX untuk grup, menunjuk pelaksana, menghapus peserta, dan menyortir opsi tanggal, waktu, dan tempat berdasarkan popularitasnya di kalangan peserta rapat.

Di tutorial berikutnya, saya akan menjelaskan apa lagi yang harus dikerjakan: meninjau ulang semua bagian situs yang terpengaruh oleh rapat dengan banyak peserta, menangani dan secara cerdas menampilkan daftar penerima dengan berbagai status, secara tepat mengelola notifikasi dan filter notifikasi untuk grup, dan akhinya upgrade fitur permintaan perubahan rapat yang baru diluncurkan.

Mencoba Penjadwalan Rapat Grup

Silakan lakukan penjadwalan rapat grup hari ini! Bagikan pemikiran dan umpan balik Anda di komentar di bawah ini.

Saya benar-benar akan berpartisipasi dalam diskusi, tetapi Anda juga bisa menjangkau saya @reifman di Twitter. Saya selalu terbuka terhadap ide-ide fitur baru untuk Meeting Planner sekaligus saran untuk episode selanjutnya di seri ini.

Sebagai pengingat, semua kode Meeting Planner disediakan open source dan ditulis dalam kerangkan kerja Yii2 untuk PHP: Jika Anda ingin belajar lebih jauh tentang Yii2, pelajari seri paralel saya Pemrograman dengan Yii2. Saya telah mendengar hal-hal yang sangat bagus tentang Laravel, tetapi Yii2 selalu memenuhi kebutuhan saya dengan cepat dan mudah.

Melihat ke Belakang

Ketika saya pertama kali mendesain antar muka penjadwalan Meeting Planner, website itu menampilkan kesiapan hadir saat itu bagi peserta lain di kolomnya sendiri. Dan itu agak membingungkan karena ada kontrol-kontrol tertentu yang dinonaktifkan.

Meeting Planner Startup Series - The old You Them Availability PanelMeeting Planner Startup Series - The old You Them Availability PanelMeeting Planner Startup Series - The old You Them Availability Panel

Saat itu, saya khawatir tentang bagaimana saya akan membuat ruang untuk menampilkan kesiapan hadir kelompok.

Untungnya, ketika saya membangun ulang UX agar mendapat pengalaman yang lebih responsif, saya mengganti kolom kesiapan hadir peserta dengan suatu teks ringkasan singkat.

Meeting Planner Startup Series - The newer built for mobile responsive planning viewMeeting Planner Startup Series - The newer built for mobile responsive planning viewMeeting Planner Startup Series - The newer built for mobile responsive planning view

Teks ringkasan kesiapan hadir itu untungnya bekerja dengan sangat baik untuk rapat-rapat grup.

Dengan mendesain ulang versi selularnya terlebih dahulu, saya memecahkan penghalang UX yang paling signifikan untuk rapat multi peserta.

Menulis Kode untuk Rapat Grup

Mari memulai dengan melihat semua kode dan pengujian yang diharuskan oleh rapat multi peserta.

Mengaktifkan Multi Peserta

Meeting Planner Startup Series - Who Panel - Enabled Button for More ParticipantsMeeting Planner Startup Series - Who Panel - Enabled Button for More ParticipantsMeeting Planner Startup Series - Who Panel - Enabled Button for More Participants

Aspek paling konyol dari rapat grup adalah bahwa mengaktifkannya bisa langsung dilakuan. Saya hanya perlu menonaktifkan tombol ikon plus di panel Who untuk rapat di tahap perencanaan:

1
<div class="col-lg-2 col-md-2 col-xs-2">
2
      <div style="float:right;">
3
        <?= Html::a(Yii::t('frontend', ''), ['/participant/create', 'meeting_id' => $model->id], ['class' => 'btn btn-primary '.($model->status>=$model::STATUS_CONFIRMED?'disabled':'').' glyphicon glyphicon-plus']) ?>
4
      </div>
5
    </div>

Lalu, saya memulai dengan membuat MEETING_LIMIT di model Partisipan:

1
class Participant extends \yii\db\ActiveRecord
2
{
3
    ...
4
5
    const MEETING_LIMIT = 15;

Ini digunakan di ParticipantController::actionCreate() ketika dikirimkan:

1
 public function actionCreate($meeting_id)
2
 {
3
    if (!Participant::withinLimit($meeting_id)) {
4
       Yii::$app->getSession()->setFlash('error', Yii::t('frontend','Sorry, you have reached the maximum number of participants per meeting. Contact support if you need additional help or want to offer feedback.'));
5
       return $this->redirect(['/meeting/view', 'id' => $meeting_id]);
6
    }

Meningkatkan UX dan Fitur-Fitur Terkait

Untuk waktu yang cukup lama, saya ingin mengizinkan para penyelenggara rapat untuk menghapus peserta, tempat, tanggal, dan waktu tanpa harus mengacaukan antar muka pengguna. Demikian pula saya menyadari bahwa mungkin ada beberapa perintah yang bisa dilakukan pada para peserta rapat.

Setelah menemukan begitu banyak kegunaan tombol dropdown Bootstrap compact di Advanced Commands tutorial, saya memutuskan untuk menggunakannya dalam menampilkan yang hadir di rapat:

Meeting Planner Startup Series - New Buttons and Dropdown Menu for Organizers Meeting Planner Startup Series - New Buttons and Dropdown Menu for Organizers Meeting Planner Startup Series - New Buttons and Dropdown Menu for Organizers

Para penyelenggara rapat ditandai dengan bintang. Mereka yang menolak hadir ditampilkan dengan warna jingga. Sedangkan yang dihapus oleh penyelenggara rapat ditampilkan dalam warna merah.

Berikut adalah kode di parsial saya yang baru /frontend/views/participant/_buttons.php:

1
<div class="btn-group btn-participant">
2
  <button type="button" class="btn btn-default btn-sm dropdown-toggle " data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
3
      <span class="glyphicon glyphicon-star red-star aria-hidden="true"></span>
4
    <?= MiscHelpers::getDisplayName($model->owner_id) ?>
5
    <span class="caret"></span>
6
  </button>
7
  <ul class="dropdown-menu">
8
      <li><?= Html::a(Yii::t('frontend','Send a message'),Url::to('mailto:'.$model->owner->email))?></li>
9
  </ul>
10
</div>

Sekarang siapa saja bisa mengirimkan pesaan ke tiap partisipan (fitur catatan rapat sekarang ini didistribusikan kepada semua partisipan rapat).

Para penyelenggara melihat dropdown yang lebih dalam yang memungkinkan mereka mengangkat penyelenggara tambahan, yakni Make organizer. Sekarang fitur inilah yang sangat keren. Para penyelenggara akan menerima notifikasi yang lebih lengkap dan memiliki lebih banyak wewenang sepanjang fase perencanaan. Mereka juga bisa menghapus peserta (Remove Participants).

Membangun Fitur AJAX ke Tombol Partisipan

Iseng-iseng saya memutuskan untuk mengAJAXkan semua opsi menu ini. Yang ternyata membutuhkan beberapa jam yang kompleks untuk menulis kode.

Berikut adalah kode yang mendefinisikan menu tombol awal dan menyiapkan JavaScriptnya:

1
<?php
2
if (count($model->participants)>0) {
3
  foreach ($model->participants as $p) {
4
    if ($p->participant->id==Yii::$app->user->getId()) {
5
      continue;
6
    }
7
    $btn_color = 'btn-default';
8
    if ($p->status == Participant::STATUS_DECLINED) {
9
      $btn_color = 'btn-warning';
10
    } else if ($p->status == Participant::STATUS_REMOVED || $p->status == Participant::STATUS_DECLINED_REMOVED) {
11
      $btn_color = 'btn-danger';
12
    }
13
  ?>
14
  <div class="btn-group btn-participant">
15
    <button id="btn_<?= $p->id ?>" type="button" class="btn <?= $btn_color ?> btn-sm dropdown-toggle " data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
16
        <span id="star_<?= $p->id ?>" class="glyphicon glyphicon-star red-star <?= (!$p->isOrganizer())?'hidden':''?>" aria-hidden="true"></span>
17
      <?= MiscHelpers::getDisplayName($p->participant->id) ?>
18
      <span class="caret"></span>
19
    </button>
20
    <ul class="dropdown-menu">
21
        <li><?= Html::a(Yii::t('frontend','Send a message'),Url::to('mailto:'.$p->participant->email))?></li>
22
        <?php if ($model->isOrganizer()) {
23
          ?>
24
          <li role="separator" class="divider"></li>
25
            <li id="mo_<?= $p->id ?>" class="<?= ($p->isOrganizer())?'hidden':''?>"><?= Html::a(Yii::t('frontend','Make organizer'),'javascript:void(0);',['onclick' => "toggleOrganizer($p->id,true);return false;"]); ?></li>
26
            <li id="ro_<?= $p->id ?>" class="<?= (!$p->isOrganizer())?'hidden':''?>"><?= Html::a(Yii::t('frontend','Revoke organizer role'),'javascript:void(0);',['onclick' => "toggleOrganizer($p->id,false);return false;"]); ?></li>
27
          <li id="rp_<?= $p->id ?>" class="<?= ($p->status == Participant::STATUS_REMOVED || $p->status == Participant::STATUS_DECLINED_REMOVED)?'hidden':''?>"><?= Html::a(Yii::t('frontend','Remove participant'),'javascript:void(0);',['onclick' => "toggleParticipant($p->id,false,$p->status);return false;"]); ?></li>
28
          <li id="rstp_<?= $p->id ?>" class="<?= ($p->status != Participant::STATUS_REMOVED && $p->status != Participant::STATUS_DECLINED_REMOVED)?'hidden':''?>"><?= Html::a(Yii::t('frontend','Restore participant'),'javascript:void(0);',['onclick' => "toggleParticipant($p->id,true,$p->status);return false;"]); ?></li>
29
          <?php
30
          }
31
          ?>
32
    </ul>
33
  </div>

Ada banyak kondisi, warna, dan bintang tombol untuk diperbarui karena perubahan dibuat interaktif di halaman yang kodenya jadi lumayan rumit. Saya menambahkan fungsi-fungsi ke file JavaScript meeting.js untuk toggleOrganizer() yakni menunjuk/memberhentikan penyelenggara, dan toggleParticipant(), untuk menghapus/mengembalikan partisipan sebagai undangan rapat.

1
function toggleOrganizer(id, val) {
2
  if (val === true) {
3
    arg2 = 1;
4
  } else {
5
    arg2 =0;
6
  }
7
  $.ajax({
8
     url: $('#url_prefix').val()+'/participant/toggleorganizer',
9
     data: {id: id, val: arg2},
10
     success: function(data) {
11
       if (data) {
12
         if (val===false) {
13
            $('#star_'+id).addClass("hidden");
14
            $('#ro_'+id).addClass("hidden");
15
            $('#mo_'+id).removeClass("hidden");
16
         } else {
17
           $('#star_'+id).removeClass("hidden");
18
           $('#ro_'+id).removeClass("hidden");
19
           $('#mo_'+id).addClass("hidden");
20
         }
21
       }
22
        return true;
23
     }
24
  });
25
}
26
27
function toggleParticipant(id, val, original_status) {
28
  if (val === true) {
29
    arg2 = 1;
30
  } else {
31
    arg2 =0;
32
  }
33
  $.ajax({
34
     url: $('#url_prefix').val()+'/participant/toggleparticipant',
35
     data: {id: id, val: arg2, original_status: original_status},
36
     success: function(data) {
37
       if (data) {
38
         if (val===false) {
39
            $('#rp_'+id).addClass("hidden");
40
            $('#rstp_'+id).removeClass("hidden");
41
            $('#btn_'+id).addClass("btn-danger");
42
            $('#btn_'+id).removeClass("btn-default");
43
         } else {
44
           $('#rp_'+id).removeClass("hidden");
45
           $('#rstp_'+id).addClass("hidden");
46
           if (original_status==100) {
47
             $('#btn_'+id).addClass("btn-warning");
48
             $('#btn_'+id).removeClass("btn-danger");
49
           } else {
50
             $('#btn_'+id).addClass("btn-default");
51
             $('#btn_'+id).removeClass("btn-danger");
52
           }
53
         }
54
       }
55
        return true;
56
     }
57
  });
58
}

Ini membutuhkan metode kontroler JSON yang menyertainya di ParticipantController.php untuk memroses permintaan untuk mengalihkan atau memperbarui database:

1
public function actionToggleorganizer($id,$val) {
2
  Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
3
  // change setting

4
  $p=Participant::findOne($id);
5
  if ($p->meeting->isOrganizer()) {
6
    $p->email = $p->participant->email;
7
    if ($val==1) {
8
      $p->participant_type=Participant::TYPE_ORGANIZER;
9
    } else {
10
      $p->participant_type=Participant::TYPE_DEFAULT;
11
    }
12
    $p->update();
13
    return true;
14
  } else {
15
    return false;
16
  }
17
18
}
19
20
public function actionToggleparticipant($id,$val) {
21
  Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
22
  // change setting

23
  $p=Participant::findOne($id);
24
  if ($p->meeting->isOrganizer()) {
25
    $p->email = $p->participant->email;
26
    if ($val==0) {
27
      if ($p->status == Participant::STATUS_DECLINED) {
28
          $p->status=Participant::STATUS_DECLINED_REMOVED;
29
      } else {
30
        $p->status=Participant::STATUS_REMOVED;
31
      }
32
    } else {
33
      if ($p->status == Participant::STATUS_DECLINED_REMOVED) {
34
          $p->status=Participant::STATUS_DECLINED;
35
      } else {
36
        $p->status=Participant::STATUS_DEFAULT;
37
      }
38
    }
39
    $p->update();
40
    return true;
41
  } else {
42
    return false;
43
  }
44
}

Mengaktifkan Fitur Accordion di Panel

Meeting Planner Startup Series - Open and Closed Panels with Bootstrap Accordion FeatureMeeting Planner Startup Series - Open and Closed Panels with Bootstrap Accordion FeatureMeeting Planner Startup Series - Open and Closed Panels with Bootstrap Accordion Feature

Saat ini, saya juga menyadari bahwa rencana rapat akan semakin kompleks dengan bertambahnya penerima dan opsi yang ada, akan ada semakin banyak scrolling. Saya memutuskan untuk mengimplementasikan fitur Bootstrap accordion untuk semua panel di tampilan rapat kita.

Dengan kata lain, sekarang Anda bisa mengklik judul untuk melipat atau membuka masing-masing dan/atau semua panel.

Berikut adalah perubahan untuk parsial tempat rapat_panel.php:

1
<div class="panel panel-default">
2
  <!-- Default panel contents -->
3
  <div class="panel-heading" role="tab" id="headingWhere">
4
    <div class="row">
5
      <div class="col-lg-10 col-md-10 col-xs-10" ><h4 class="meeting-place">
6
      <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseWhere" aria-expanded="true" aria-controls="collapseWhere"><?= Yii::t('frontend','Where') ?></a>
7
      </h4><p>
8
        <div class="hint-text heading-pad">
9
        <?php if ($placeProvider->count<=1) { ?>
10
          <?= Yii::t('frontend','add places for participants or switch to \'virtual\'') ?>
11
      <?php } elseif ($placeProvider->count>1) { ?>
12
          <?= Yii::t('frontend','are listed places okay?&nbsp;') ?>
13
        <?php
14
          }
15
        ?>
16
...
17
<div id="collapseWhere" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingWhere">
18
    <div class="panel-body">
19
      <?php
20
        $style = ($model->switchVirtual==$model::SWITCH_VIRTUAL?'none':'block');
21
       ?>
22
      <div id ="meeting-place-list" style="display:<?php echo $style; ?>">
23
      <?php
24
       if ($placeProvider->count>0):
25
      ?>
26
      <table class="table">
27
        <?= ListView::widget([
28
               'dataProvider' => $placeProvider,
29
               'itemOptions' => ['class' => 'item'],
30
               'layout' => '{items}',
31
               'itemView' => '_list',
32
               'viewParams' => ['placeCount'=>$placeProvider->count,'isOwner'=>$isOwner,'participant_choose_place'=>$model->meetingSettings['participant_choose_place'],'whereStatus'=>$whereStatus],
33
           ]) ?>
34
      </table>
35
  

Perhatikan bahwa pengaturan di atas pada panel-heading dan div di sekitarnya untuk panel-body. Ini akan mengontrol pembukaan dan pelipatan tiap panel.

Ini mengakibatkan sejumlah permasalahan penampilan seperti bertumpuknya sejumlah daftar item, yang harus saya bersihkan di kemudia hari.

Infrastruktur Model untuk Rapat Grup

Meskipun saya sudah merencanakan untuk multi partisipan sejak sangat awal, ada perubahan infrastruktur kecil sampai menengah yang dibutuhkan untuk mendukungnya.

Kendatipun model MeetingTimeChoice dan MeetingPlaceChoice tetap melacak apakah partisipan menginginkan tanggal, waktu, dan tempat tertentu, saya ingin melacak keseluruhan kesiapan hadir partisipan di tiap tanggal, waktu, dan tempat. Ini akan memungkinkan saya menyortir tempat dan waktu berdasarkan popularitasnya—dan menunjukkan pengaturan paling populer di ujung atas panel.

Pertama, saya membuat migrasi untuk menambahkan ini ke kedua model. Jarang-jarang migrasi saya mempengaruhi beberapa model, menjadikan yang satu spesial:

1
<?php
2
3
use yii\db\Schema;
4
use yii\db\Migration;
5
6
class m160824_235517_extend_meeting_place_and_time 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
    $this->addColumn('{{%meeting_time}}','availability',Schema::TYPE_SMALLINT.' NOT NULL DEFAULT 0');
15
    $this->addColumn('{{%meeting_place}}','availability',Schema::TYPE_SMALLINT.' NOT NULL DEFAULT 0');
16
  }
17
18
  public function down()
19
  {
20
    $this->dropColumn('{{%meeting_time}}','availability');
21
    $this->dropColumn('{{%meeting_place}}','availability');
22
  }
23
}

Dengan kapasitas ini, saya mampu mulai menampilkan kemungkinan tanggal, waktu, dan tempat yang telah diurutkan berdasarkan popularitasnya di kalangan partisipan dari MeetingController::actionView():

1
$timeProvider = new ActiveDataProvider([
2
            'query' => MeetingTime::find()->where(['meeting_id'=>$id]),
3
            'sort' => [
4
              'defaultOrder' => [
5
                'availability'=>SORT_DESC
6
              ]
7
            ],
8
        ]);
9
        $placeProvider = new ActiveDataProvider([
10
            'query' => MeetingPlace::find()->where(['meeting_id'=>$id]),
11
            'sort' => [
12
              'defaultOrder' => [
13
                'availability'=>SORT_DESC
14
              ]
15
            ],
16
        ]);

Anda bisa melihatnya aksinya di screenshot perencanaan di bawah ini:

Meeting Planner Startup Series - Sorted Date Times and Places By PopularityMeeting Planner Startup Series - Sorted Date Times and Places By PopularityMeeting Planner Startup Series - Sorted Date Times and Places By Popularity

Untuk melacak apakah partisipan adalah penyelenggara dan untuk memungkinkan opsi untuk di kemudian hari tidak menerima notifikasi rapat, saya tambahkan migrasi ini ke tabel Partisipan:

1
<?php
2
3
use yii\db\Schema;
4
use yii\db\Migration;
5
6
class m160825_074740_extend_participant_add_type 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
    $this->addColumn('{{%participant}}','participant_type',Schema::TYPE_SMALLINT.' NOT NULL DEFAULT 0');
15
    $this->addColumn('{{%participant}}','notify',Schema::TYPE_SMALLINT.' NOT NULL DEFAULT 0');
16
  }
17
18
  public function down()
19
  {
20
    $this->dropColumn('{{%participant}}','participant_type');
21
    $this->dropColumn('{{%participant}}','notify');
22
  }
23
}

Saya juga menambahkan sejumlah konstanta di Participant.php agar bisa bekerja dengan properti-properti ini:

1
class Participant extends \yii\db\ActiveRecord
2
{
3
    const TYPE_DEFAULT = 0;
4
    const TYPE_ORGANIZER = 10;
5
6
    const NOTIFY_ON = 0;
7
    const NOTIFY_OFF = 1;
8
9
    const STATUS_DEFAULT = 0;
10
    const STATUS_REMOVED = 90;
11
    const STATUS_DECLINED = 100;
12
    const STATUS_DECLINED_REMOVED = 110;

Dan saya tahu bahwa akan sangat membantu untuk menyediakan sejumlah fungsi bantuan dengan model Meeting yang masif. Sebagai contoh, IsOrganizer() memberitahukan apakah yang saat ini sedang melihat adalah penyelenggara rapat:

1
public function isOrganizer() {
2
      $user_id = Yii::$app->user->getId();
3
      if ($user_id == $this->owner_id) {
4
        return true;
5
      } else {
6
        foreach ($this->participants as $p) {
7
          if ($user_id == $p->participant_id) {
8
            if ($p->participant_type == Participant::TYPE_ORGANIZER) {
9
              return true;
10
            } else {
11
              return false;
12
            }
13
          }
14
      }
15
    }
16
    return false;
17
  }

Tunggu, Masih Ada Lagi?

Sebagaimana bisa Anda lihat, ada banyak hal yang bisa dibahas untuk membuat fitur ini. Di episode berikutnya, saya akan membahas paruh kedua pengembangan dan pengujian yang dibutuhkan untuk meluncurkan rapat multi peserta: string penerima, notifikasi, permintaan, dan merespon permintaan.

Jika Anda belum melakukannya, jadwalkan rapat pertama Anda dengan Meeting Planner dan coba semuanya. Silakan membagikan umpan balik Anda di komentar di bawah ini.

Suatu tutorial untuk crowdfunding juga sedang dikerjakan, jadi silakan mengikuti halaman WeFunder Meeting Planner kami.

Anda bisa menghubungi saya di @reifman. Saya selalu terbuka pada ide-ide fitur baru dan saran topik untuk tutorial-tutorial berikutnya.

Tetaplah bersama kami untuk mendapatkan ini semua dan tutorial-tutorial lain yang akan datang dengan mengecek seri Membangun Startup Anda dengan PHP.

Tautan-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.