Advertisement
  1. Code
  2. Startups

Membangun Startup Anda: Menyelesaikan Penjadwalan Kelompok

Scroll to top
Read Time: 15 min
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Meetings With Multiple Participants
Building Your Startup: Importing With the Google Contacts API

Indonesian (Bahasa Indonesia) translation by Ilham Saputra (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 pada Envato Tuts. Dalam seri ini, saya memandu Anda melalui peluncuran startup dari konsep ke realitas menggunakan aplikasi Meeting Planner saya sebagai contoh kehidupan nyata. Setiap langkah di sepanjang jalan, saya akan merilis kode Perencana Pertemuan sebagai contoh open-source yang dapat Anda pelajari. Saya juga akan membahas masalah bisnis terkait startup saat muncul.

Pengembangan Berkelanjutan Pertemuan Kelompok

Selamat Datang! Ini adalah episode lanjutan untuk Membangun Startup Anda: Pertemuan dengan Beberapa Peserta. Hari ini, saya akan menyelesaikan pekerjaan yang kami mulai di episode itu: menjadwalkan beberapa pertemuan peserta.

Penyegaran Singkat

Menjadwalkan pertemuan dengan beberapa peserta selalu menjadi tujuan utama untuk Meeting Planner, yang diluncurkan hanya dengan penjadwalan 1:1. Beberapa pertemuan peserta adalah yang paling menantang bagi orang untuk mencoba menjadwalkan satu sama lain dan oleh karena itu salah satu fitur yang paling berharga untuk layanan Perencana Pertemuan untuk menyediakan.

Dalam tutorial hari ini, saya akan mengulas semua area situs yang dipengaruhi oleh beberapa pertemuan peserta, menangani dan menampilkan daftar penerima berbagai status secara cerdas, mengelola pemberitahuan dengan benar dan penyaringan pemberitahuan untuk grup, dan akhirnya meningkatkan permintaan yang baru saja diluncurkan fitur perubahan pertemuan.

Jadwalkan Pertemuan Grup Pertama Anda

Harap jadwalkan pertemuan kelompok Anda sendiri hari ini! Undang beberapa teman untuk bertemu dengan Anda untuk kombucha atau kava. Bagikan pendapat dan masukan Anda tentang pengalaman semua orang di komentar di bawah ini. Saya berpartisipasi dalam diskusi, tetapi Anda juga dapat menghubungi saya @reifman di Twitter. Saya selalu terbuka untuk ide-ide fitur baru untuk Meeting Planner serta saran untuk episode seri mendatang.

Sebagai pengingat, semua kode untuk Perencana Pertemuan diberikan sumber terbuka dan ditulis dalam Kerangka Yii2 untuk PHP. Jika Anda ingin mempelajari lebih lanjut tentang Yii2, periksa seri pararel saya Pemrograman dengan Yii2.

Meninjau Kode

Seperti yang Anda bayangkan, mengubah Perencana Pertemuan dari 1:1 pertemuan ke rapat kelompok menyentuh hampir semua kode. Saya harus memikirkan semua area, meninjau kode, dan membuat perubahan kecil hingga sedang di banyak tempat. Di area lain, saya membuat arsip untuk beberapa peserta, dan perubahan tidak diperlukan atau kecil.

Misalnya, penjadwalan grup menyentuh:

Sebagian besar, di mana saya sebelumnya hanya mengirim ke peserta[0], peserta pertama dan satu-satunya, saya sekarang perlu memproses berbagai peserta. Dan, dalam melakukan itu, saya perlu memeriksa:

  • Apakah peserta ini seorang penyelenggara?
  • Apakah orang ini telah dihapus atau ditolak sendiri?
  • Di masa depan, apakah orang ini memilih keluar dari pemberitahuan untuk rapat ini?

Tantangan Pengujian

Dengan lebih banyak sumber daya, saya bisa mengatur ini secara lebih komprehensif dengan pengujian otomatis. Namun, bekerja solo dengan pengiriman sebagai tujuan, saya secara manual menguji semuanya secara mendalam.

Saya menggunakan email domain catchall sehingga saya dapat mengundang n1, n2, n3, n4, dan n5 @mytestdomain.com ke rapat grup sampel saya. Untungnya, undangan Perencana Pertemuan memudahkan untuk masuk dengan cepat dengan akun apa pun dengan mengklik dalam setiap undangan rapat; ini membantu pengujian saya.

Itu penting untuk meninjau hampir semua kode perencanaan rapat.

Tapi mari kita kembali ke tantangan pengkodean yang lebih spesifik dari paruh kedua fitur penjadwalan grup.

Menampilkan Daftar Peserta yang Cerdas

Beberapa waktu yang lalu, saya membangun metode MiscHelpers untuk menampilkan daftar secara gramatikal dengan benar dalam bahasa Inggris dengan "dan" sebelum nama belakang, seperti yang ditunjukkan dalam indeks pertemuan di bawah:

Startup Series Group Scheduling - The Meeting IndexStartup Series Group Scheduling - The Meeting IndexStartup Series Group Scheduling - The Meeting Index

Namun, saya ingin menyederhanakan tampilan waktu tanggal dan ketersediaan tempat. Misalnya, daripada mendaftar lima nama orang yang menerima pertemuan di Herkimer Coffee, saya memperbarui MiscHelpers::listNames untuk mengatakan, "orang lain":

1
public static function listNames($items,$everyoneElse=false,$total_count=0,$anyoneElse=false) {
2
  $temp ='';
3
  $x=1;
4
  $cnt = count($items);
5
  if ($everyoneElse && $cnt >= ($total_count-1)) {
6
    if (!$anyoneElse) {
7
        $temp = Yii::t('frontend','everyone else');
8
    } else {
9
      $temp = Yii::t('frontend','anyone else');
10
    }
11
  } else {
12
    foreach ($items as $i) {
13
        $temp.= MiscHelpers::getDisplayName($i);
14
        if ($x == ($cnt-1)) {
15
          $temp.=' and ';
16
        } else if ($x < ($cnt-1)) {
17
          $temp.=', ';
18
        }
19
        $x+=1;
20
    }
21
  }
22
  return $temp;
23
}

Anda dapat melihat ini dalam aksi di bawah ini:

Startup Series Group Scheduling - Time and Place Availability ListsStartup Series Group Scheduling - Time and Place Availability ListsStartup Series Group Scheduling - Time and Place Availability Lists

Tetapi daripada mengatakan "Tidak ada respon dari orang lain," lebih tepat untuk mengatakan "Tidak ada respon dari orang lain," yang kode lakukan.

Di bawah ini, Anda dapat melihat MeetingPlace::getWhereStatus() menyiapkan string ini untuk setiap tempat di panel tempat rapat:

1
public static function getWhereStatus($meeting,$viewer_id) {
2
  // get an array of textual status of meeting places for $viewer_id

3
  // Acceptable / Rejected / No response:

4
  $whereStatus['style'] = [];
5
  $whereStatus['text'] = [];
6
  foreach ($meeting->meetingPlaces as $mp) {
7
    // build status for each place

8
    $acceptableChoice=[];
9
    $rejectedChoice=[];
10
    $unknownChoice=[];
11
    // to do - add meeting_id to MeetingPlaceChoice for sortable queries

12
    foreach ($mp->meetingPlaceChoices as $mpc) {
13
      if ($mpc->user_id == $viewer_id) continue;
14
      switch ($mpc->status) {
15
        case MeetingPlaceChoice::STATUS_UNKNOWN:
16
          $unknownChoice[]=$mpc->user_id;
17
        break;
18
        case MeetingPlaceChoice::STATUS_YES:
19
          $acceptableChoice[]=$mpc->user_id;
20
        break;
21
        case MeetingPlaceChoice::STATUS_NO:
22
          $rejectedChoice[]=$mpc->user_id;
23
        break;
24
      }
25
    }
26
    // to do - integrate current setting for this user in style setting

27
    $temp ='';
28
    // count those still in attendance

29
    $cntP = Participant::find()
30
      ->where(['meeting_id'=>$meeting->id])
31
      ->andWhere(['status'=>Participant::STATUS_DEFAULT])
32
      ->count()+1;
33
    if (count($acceptableChoice)>0) {
34
      $temp.='Acceptable to '.MiscHelpers::listNames($acceptableChoice,true,$cntP).'. ';
35
      $whereStatus['style'][$mp->place_id]='success';
36
    }
37
    if (count($rejectedChoice)>0) {
38
      $temp.='Rejected by '.MiscHelpers::listNames($rejectedChoice,true,$cntP).'. ';
39
      $whereStatus['style'][$mp->place_id]='danger';
40
    }
41
    if (count($unknownChoice)>0) {
42
      $temp.='No response from '.MiscHelpers::listNames($unknownChoice,true,$cntP,true).'.';
43
      $whereStatus['style'][$mp->place_id]='warning';
44
    }
45
    $whereStatus['text'][$mp->place_id]=$temp;
46
  }
47
  return $whereStatus;
48
}

Setiap pengguna memiliki baris MeetingPlaceChoice yang terkait dengan MeetingPlace yang mencatat apakah suatu tempat dapat diterima, tidak diterima atau belum ditanggapi. MeetingTimeChoice juga ada. Informasi ini diteruskan ke listNames().

Menurun dan Mundur dari Rapat

Grup juga membutuhkan lebih banyak kerumitan dengan menolak undangan rapat. Sebelumnya, jika satu peserta menolak, pertemuan itu secara efektif dibatalkan. Sekarang, seseorang mungkin menolak, meninggalkan tiga orang lainnya untuk melanjutkan.

Jadi, jika seorang peserta menerima undangan ke pertemuan, mereka dapat Menolaknya. Tetapi jika pertemuan telah dikonfirmasi dan diselesaikan, maka mereka pada dasarnya Mundur seperti yang Anda lihat di bawah ini:

Startup Series Group Scheduling - Withdraw button in a Meeting ViewStartup Series Group Scheduling - Withdraw button in a Meeting ViewStartup Series Group Scheduling - Withdraw button in a Meeting View

Catatan: Pada gambar di atas, itu Sarah Smithers melihat tombol Batalkan; Robert McSmith telah dipindahkan oleh organisator lain, entah Jeff atau Alex.

Namun, jika itu adalah organisator (pemilik rapat atau penyelenggara peserta yang diurapi), mereka dapat Membatalkan saja rapat. Di bawah ini adalah dari _command_bar_confirmed.php. Ini menentukan tombol mana yang akan ditampilkan:

1
if (!$isPast) {
2
  if ($model->isOrganizer()) {
3
    echo Html::a('<i class="glyphicon glyphicon-remove-circle"></i>&nbsp;'.Yii::t('frontend', 'Cancel'), ['cancel', 'id' => $model->id],
4
   ['class' => 'btn btn-primary btn-danger',
5
   'title'=>Yii::t('frontend','Cancel'),
6
   'data-confirm' => Yii::t('frontend', 'Are you sure you want to cancel this meeting?')
7
   ]) ;
8
  }
9
  else {                
10
    if ($model->getParticipantStatus(Yii::$app->user->getId())==Participant::STATUS_DEFAULT) {
11
      echo Html::a('<i class="glyphicon glyphicon-remove-circle"></i>&nbsp;'.Yii::t('frontend', 'Withdraw'), ['decline', 'id' => $model->id],
12
     ['class' => 'btn btn-primary btn-danger',
13
     'title'=>Yii::t('frontend','Withdraw from the meeting'),
14
     'data-confirm' => Yii::t('frontend', 'Are you sure you want to decline attendance to this meeting?')
15
     ]) ;
16
   } else {
17
     // to do - offer rejoin meeting option

18
   }

Prioritisasi adalah elemen kunci dalam membangun startup. Jadi sementara saya ingin menawarkan cara bagi pengguna yang telah mengundurkan diri untuk bergabung kembali dalam rapat, saya memutuskan untuk menambahkan ini ke daftar tugas Asana untuk nanti. Pengguna yang bergabung akan membutuhkan pemberitahuan yang diperbarui dan mungkin beberapa pembaruan untuk struktur data penjadwalan mereka.

Berpikir Melalui Pemberitahuan

Sementara dengan 1:1 pertemuan, setiap perubahan perlu dikirim ke pihak lain, ini tidak selalu masuk akal untuk pertemuan 12 orang—atau apakah itu? Tergantung.

Awalnya, saya membuat panduan umum. Jika seorang peserta memperbarui preferensi mereka untuk waktu atau tempat tanggal tertentu, hanya pemilik dan penyelenggara lain yang perlu diperbarui tentang hal ini.

Saya membuat array $groupSkip di MeetingLog yang menentukan acara yang seharusnya tidak dikirim ke peserta lain:

1
public static $groupSkip=[
2
  MeetingLog::ACTION_ACCEPT_ALL_PLACES,
3
  MeetingLog::ACTION_ACCEPT_PLACE,
4
  MeetingLog::ACTION_REJECT_PLACE,
5
  MeetingLog::ACTION_ACCEPT_ALL_TIMES,
6
  MeetingLog::ACTION_ACCEPT_TIME,
7
  MeetingLog::ACTION_REJECT_TIME
8
];

Di MeetingLog::getHistory, kami lewati memberi tahu peserta untuk acara ini tetapi selalu memberi tahu penyelenggara:

1
if (
2
...
3
// skip over availability response events in multi participant meetings

4
  ($isGroup && !$isOrganizer && in_array($e->action,MeetingLog::$groupSkip))
5
  ) {
6
    $num_events-=1; // skip event, reduce number of events

7
    continue;
8
  }

Dalam satu contoh yang tidak biasa, kode itu sebenarnya dibuat lebih sederhana dengan beberapa peserta: Meeting::findFresh(), yang mencari pembaruan dari perubahan rapat untuk dibagikan melalui email.

Sebelumnya, kami harus mengidentifikasi mana dari dua pengguna yang melakukan tindakan dan apakah akan memberi tahu atau tidak. Sekarang, kami hanya memberi tahu pemilik dan kemudian memberi tahu peserta:

1
if ((time()-$m->logged_at) > MeetingLog::TIMELAPSE && $m->status>=Meeting::STATUS_SENT) { //

2
  // get logged items which occured after last cleared_at

3
   $m->notify($m->id,$m->owner_id);
4
    // notify the participants

5
    foreach ($m->participants as $p) {
6
      // don't update removed and declined participants

7
      if ($p->status!=Participant::STATUS_DEFAULT) {
8
         continue;
9
       }
10
       //echo 'Notify P-id: '.$p->participant_id.'<br />';

11
       $m->notify($m->id,$p->participant_id);
12
    }

Setiap penyaringan dilakukan lebih dalam dalam log tekstualisasi acara.

Pemberitahuan yang Ditingkatkan: "Semua Orang Tersedia!"

Saya juga membuat pemberitahuan baru untuk mengingatkan penyelenggara ketika semua orang setuju dengan setidaknya satu tempat dan waktu tertentu, MeetingLog::ACTION_SEND_EVERYONE_AVAILABLE:

1
// check if meeting has place and time for everyone now

2
if (count($m->participants)>1 && !MeetingLog::hasEventOccurred($m->id,MeetingLog::ACTION_SEND_EVERYONE_AVAILABLE) && Meeting::isEveryoneAvailable($m->id)) {
3
  Meeting::notifyOrganizers($m->id,MeetingLog::ACTION_SEND_EVERYONE_AVAILABLE);
4
  MeetingLog::add($m->id,MeetingLog::ACTION_SEND_EVERYONE_AVAILABLE,0);
5
}

Ini memberi tahu penyelenggara ketika rapat siap untuk menyelesaikan/mengonfirmasi.

Berikut kode yang melihat semua tempat pertemuan dan waktu rapat untuk melihat apakah semua orang setuju dengan setidaknya satu tempat:

1
public static function isEveryoneAvailable($meeting_id) {
2
  // check that one place works for everyone attending

3
  $m = Meeting::findOne($meeting_id);
4
  $cntAll = $m->countAttendingParticipants(true);
5
  // count organizer + attending participants

6
  $mpExists=false;
7
  $mtExists=true;
8
  $mps = \frontend\models\MeetingPlace::find()->where(['meeting_id'=>$meeting_id])->all();
9
  foreach ($mps as $mp) {
10
    $cnt=0;
11
    foreach ($mp->meetingPlaceChoices as $mpc) {
12
      if ($m->getParticipantStatus($mpc->user_id)!=Participant::STATUS_DEFAULT) {
13
        // skip withdrawn, declined, removed participants

14
        continue;
15
      }
16
      if ($mpc->status == \frontend\models\MeetingPlaceChoice::STATUS_YES) {
17
        $cnt+=1;
18
      }
19
    }
20
    if ($cnt >=$cntAll) {
21
      $mpExists = true;
22
    }
23
  }
24
  $mts = \frontend\models\MeetingTime::find()->where(['meeting_id'=>$meeting_id])->all();
25
  foreach ($mts as $mt) {
26
    $cnt=0;
27
    foreach ($mt->meetingTimeChoices as $mtc) {
28
      if ($m->getParticipantStatus($mtc->user_id)!=Participant::STATUS_DEFAULT) {
29
        // skip withdrawn, declined, removed participants

30
        continue;
31
      }
32
      if ($mtc->status == \frontend\models\MeetingTimeChoice::STATUS_YES) {
33
        $cnt+=1;
34
      }
35
    }
36
    if ($cnt >=$cntAll) {
37
      $mtExists = true;
38
    }
39
  }
40
  // at least one time and one place works for everyone attending

41
  if ($mpExists && $mtExists) {
42
    return true;
43
  } else {
44
    return false;
45
  }
46
}

Demikian pula, saya membuat suatu fungsi untuk mengirimkan pemberitahuan kepada penyelenggara bahwa tidak ada tanggal dan tempat tanggal yang dapat diterima oleh siapa saja, Meeting::isSomeoneAvailable():

1
if ($model->status <= Meeting::STATUS_SENT) {
2
  if ($model->isOrganizer()
3
    && ($model->status == Meeting::STATUS_SENT) 
4
    && !$model->isSomeoneAvailable()) {
5
    Yii::$app->getSession()->setFlash('danger', 
6
    Yii::t('frontend',
7
    'None of the participants are available for the meeting\'s current options.'));
8
  }

Hal ini menunjukkan bahwa mereka seharusnya menyarankan tambahan tanggal kali dan/atau tempat.

Memperbarui Pengingat Rapat

Segala sesuatu tentang pengingat pertemuan berfungsi dengan baik untuk beberapa peserta, tetapi saya perlu mematikan pengingat jika peserta telah menolak atau menarik diri dari rapat atau telah dihapus:

1
$cnt =1;
2
foreach ($mtg->participants as $p) {
3
if ($p->status ==Participant::STATUS_DEFAULT) {
4
 $attendees[$cnt]=$p->participant_id;
5
 $cnt+=1;
6
 }
7

STATUS_DEFAULT menunjukkan peserta yang harus ditambahkan ke larik pengguna ke pengingat email juga.

Meninjau File Kalender

Saya juga meninjau karya menghasilkan file kalender untuk undangan untuk memastikan bahwa semua peserta disertakan. Di Meeting::prepareDownloadIcs(), saya mengumpulkan array peserta dengan pemilik dan peserta secara aktif menghadiri:

1
$attendees = array();
2
foreach ($m->participants as $p) {
3
  if ($p->status ==Participant::STATUS_DEFAULT) {
4
    $auth_key=\common\models\User::find()->where(['id'=>$p->participant_id])->one()->auth_key;
5
    $attendees[$cnt]=['user_id'=>$p->participant_id,'auth_key'=>$auth_key,
6
    'email'=>$p->participant->email,
7
    'username'=>$p->participant->username];
8
    $cnt+=1;
9
    // reciprocate friendship to organizer

10
    \frontend\models\Friend::add($p->participant_id,$p->invited_by);
11
    // to do - reciprocate friendship in multi participant meetings

12
  }
13
}
14
$auth_key=\common\models\User::find()->where(['id'=>$m->owner_id])->one()->auth_key;
15
$attendees[$cnt]=['user_id'=>$m->owner_id,
16
  'auth_key'=>$auth_key,
17
  'email'=>$m->owner->email,
18
  'username'=>$m->owner->username];
19
foreach ($attendees as $cnt=>$a) {
20
  if ($a['user_id']==$actor_id) {
21
    $icsPath = Meeting::buildCalendar($m->id,$chosenPlace,$chosenTime,$a,$attendees);

Selama waktu ini, saya juga belajar bagaimana menunjukkan bahwa file kalender dari pertemuan yang dibatalkan harus memicu penghapusan acara dari kalender seseorang. Standar ics sangat kuat meskipun tidak mudah dipelajari.

Memperbarui Perubahan Permintaan untuk Grup

Seperti yang saya tulis baru-baru ini, fitur Perubahan Pertemuan yang Diminta membutuhkan banyak pekerjaan dan UX baru.

Startup Series Group Scheduling - Request a Change to Your MeetingStartup Series Group Scheduling - Request a Change to Your MeetingStartup Series Group Scheduling - Request a Change to Your Meeting

Untuk beberapa pertemuan peserta, rekayasa sosial perlu diubah lagi. Misalnya, penyelenggara dapat menerima atau menolak permintaan dan mengubah jadwal rapat. Namun, peserta hanya dapat mengekspresikan Suka, Tidak Suka, atau Tidak Peduli tentang permintaan perubahan. Dan penyelenggara harus melihat semua tanggapan peserta untuk membantu mereka dalam pengambilan keputusan mereka.

Inilah yang dilihat oleh peserta setelah mereka mengajukan permintaan perubahan:

Startup Series Group Scheduling - Confirming Your RequestStartup Series Group Scheduling - Confirming Your RequestStartup Series Group Scheduling - Confirming Your Request

Permintaan perubahan baru perlu dikirim ke semua peserta. Ini ditangani secara transparan oleh pemberitahuan log aktivitas. Saat permintaan dibuat, event ini dibuat di RequestController::actionCreate() submit:

1
MeetingLog::add($model->meeting_id,MeetingLog::ACTION_REQUEST_CREATE,Yii::$app->user->getId(),$model->id);

Inilah yang pemberitahuan perubahan yang diminta terlihat seperti untuk peserta lain:

Startup Series Group Scheduling - Email Notification of Requested Changes to ParticipantsStartup Series Group Scheduling - Email Notification of Requested Changes to ParticipantsStartup Series Group Scheduling - Email Notification of Requested Changes to Participants

Setiap orang diminta untuk menanggapi. Mengklik Menanggapi Permintaan melompat tepat ke permintaan. Atau Anda dapat menemukannya melalui daftar permintaan dari tautan peringatan flash pada pertemuan yang ditunjukkan di atas.

Startup Series Group Scheduling - List of RequestsStartup Series Group Scheduling - List of RequestsStartup Series Group Scheduling - List of Requests

UX Baru untuk Peserta yang Menanggapi Permintaan

Inilah formulir yang peserta lihat ketika mereka menanggapi permintaan:

Startup Series Group Scheduling - Participants View of Responding to a RequestStartup Series Group Scheduling - Participants View of Responding to a RequestStartup Series Group Scheduling - Participants View of Responding to a Request

Jika sudah ada tanggapan peserta lain, mereka akan melihatnya:

Startup Series Group Scheduling - Startup Series Group Scheduling - Participants View of Responding to a Request with Others ResponsesStartup Series Group Scheduling - Startup Series Group Scheduling - Participants View of Responding to a Request with Others ResponsesStartup Series Group Scheduling - Startup Series Group Scheduling - Participants View of Responding to a Request with Others Responses

Berikut adalah bagian atas formulir itu di /frontend/views/request-response/_form.php:

1
<p><em>
2
<?= $subject ?>
3
</em>
4
</p>
5
6
<?= GridView::widget([
7
    'dataProvider' => $responseProvider,
8
    'columns' => [
9
      [
10
      'label'=>'Responses from Other Participants',
11
        'attribute' => 'responder_id',
12
        'format' => 'raw',
13
        'value' => function ($model) {
14
                $note='';
15
                if (!empty($model->note)) {
16
                  $note = ' said, "'.$model->note.'"';
17
                }
18
                return '<div>'.MiscHelpers::getDisplayName($model->responder_id).' '.$model->lookupOpinion().$note.'</div>';                
19
            },
20
    ],
21
  ],
22
]); ?>
23
<div class="request-response-form">
24
    <?php $form = ActiveForm::begin(); ?>
25
      <?= BaseHtml::activeHiddenInput($model, 'responder_id'); ?>
26
        <?= BaseHtml::activeHiddenInput($model, 'request_id'); ?>
27
    <?= $form->field($model, 'note')->label(Yii::t('frontend','Include a note'))->textarea(['rows' => 6])->hint(Yii::t('frontend','optional')) ?>

GridView mencantumkan tanggapan yang ada, misalnya. Seperti, Tidak Suka, Netral, dan semua catatan pribadi terlampir.

Kemudian, inilah kode untuk bagian bawah formulir, yang akan menampilkan Suka, Tidak Suka, Tidak Peduli kepada peserta tetapi Terima dan Buat Perubahan atau Tolak Permintaan kepada pemilik.

1
<?php
2
  if (!$isOwner && $isOrganizer) {
3
?>
4
  <p><em><?= Yii::t('frontend','Since you are an organizer, you can accept the request and make the changes or reject it.');?></em></p>
5
<?php
6
  }
7
?>
8
<?php
9
  if ($isOrganizer) {
10
?>
11
<div class="form-group">
12
  <?= Html::submitButton(Yii::t('frontend', 'Accept and Make Changes'), ['class' => 'btn btn-success','name'=>'accept',]) ?>
13
  <?= Html::submitButton(Yii::t('frontend', 'Decline Request'),['class' => 'btn btn-danger','name'=>'reject',
14
      'data' => [
15
          'confirm' => Yii::t('frontend', 'Are you sure you want to decline this request?'),
16
          'method' => 'post',
17
      ],]) ?>
18
</div>
19
<?php
20
  }
21
?>
22
<?php
23
  if (!$isOwner && $isOrganizer) {
24
?>
25
  <p><em><?= Yii::t('frontend','Or, you can just express your opinion and defer to other organizers.');?></em></p>
26
<?php
27
  }
28
?>
29
<?php
30
  if (!$isOwner) {
31
?>
32
<?php
33
  if (!$isOrganizer) {
34
?>
35
<p><em><?= Yii::t('frontend','Please share your opinion of this request for the organizers to consider.');?></em></p>
36
<?php
37
 }
38
 ?>
39
<div class="form-group">
40
  <?= Html::submitButton(Yii::t('frontend', 'Like'), ['class' => 'btn btn-success','name'=>'like',]) ?>
41
  <?= Html::submitButton(Yii::t('frontend', 'Don\'t Care'), ['class' => 'btn btn-info','name'=>'neutral',]) ?>
42
  <?= Html::submitButton(Yii::t('frontend', 'Dislike'),['class' => 'btn btn-danger','name'=>'dislike',]) ?>
43
44
</div>
45
<?php
46
  }
47
?>
48
    <?php ActiveForm::end(); ?>
Startup Series Group Scheduling - Organizers View of Responding to a RequestStartup Series Group Scheduling - Organizers View of Responding to a RequestStartup Series Group Scheduling - Organizers View of Responding to a Request

Peserta yang ditunjuk sebagai penyelenggara ditunjukkan kedua set tombol dan dapat mengekspresikan pendapat mereka atau membuat atau menolak perubahan.

Berikut pemberitahuan email bahwa perubahan telah diterima:

Startup Series Group Scheduling - Email Notification that Change was AcceptedStartup Series Group Scheduling - Email Notification that Change was AcceptedStartup Series Group Scheduling - Email Notification that Change was Accepted

Tentu saja, undangan yang diperbarui dan file kalender akan dikirimkan kepada semua orang jika ada perubahan.

Selalu Lebih Banyak Perbaikan untuk Dilakukan

Saya harap Anda menikmati dua episode ini (hari ini dan Membangun Startup Anda: Pertemuan Dengan Beberapa Peserta). Dalam mode startup dengan fitur baru yang sangat besar, selalu ada upaya peluncuran yang terfokus dan efisien, yang membuat banyak bagian yang lepas dilonggarkan dan cacat menjadi kasar.

Beberapa contoh ini meliputi:

  • Bergabung kembali dengan rapat yang Anda tolak atau mundur.
  • Peningkatan presentasi daftar peserta dalam undangan.
  • Pilihan untuk menjaga daftar peserta dan/atau status mereka individu pribadi dari peserta lain.
  • Peningkatan penanganan dan penyajian informasi kontak grup dan detail konferensi virtual, misalnya. garis konferensi dan kode partisipasi.
  • URL aman untuk berbagi undangan rapat. Ini akan memungkinkan penyelenggara untuk membagikan URL di Facebook atau melalui email untuk mengundang peserta baru.

Terlepas dari kekurangan-kekurangan ini, saya telah bekerja sangat keras untuk mencapai tingkat fungsi dan kegunaan ini untuk Meeting Planner. Saya sangat gembira dengan perkembangannya dan mendengar umpan balik yang baik tentang hal itu dari teman dan kolega.

Saya akan membuka dua tutorial ini hari ini dan mengambil beberapa hari offline di hutan untuk beberapa waktu henti. Istirahat itu penting. Berhubungan dengan alam membantu mengingatkan Anda tentang apa yang penting dalam kehidupan—startups tidak selalu, sebenarnya. Mereka mungkin menjadi pengejaran kreatif, penting bagi pendapatan dan karier kita, mereka mungkin dalam beberapa kasus membantu orang hidup lebih efisien dan produktif—tetapi mereka sering menjauh dari bumi, dari persahabatan, dan dari membantu orang lain yang kurang beruntung. Ini semua hal yang saya pikirkan setiap hari dan akan saya lakukan lagi ketika saya pergi.

Saya akan bertanya pada diri sendiri berulang kali bahwa saya melakukan semua yang ingin saya lakukan dengan waktu saya—terutama mengingat operasi otak saya.

Saya juga akan mengambil hati dari kenyataan bahwa saya bangga dengan Perencana Pertemuan, terutama pekerjaan hingga saat ini dan kegunaannya yang terus meningkat. Secara keseluruhan, beta layanan hampir selesai.

Beberapa pertemuan peserta telah menjadi item pekerjaan yang paling menakutkan dan rumit. Ke depan, fitur dan tugas lebih moderat, lebih kecil, dan lebih mudah dikelola. Saya senang dengan prospek masa depannya!

Jika belum, jadwalkan pertemuan pertama Anda dengan Perencana Pertemuan sekarang!

Sebuah tutorial tentang crowdfunding juga sedang dikerjakan, jadi silakan ikuti halaman Wefunder Meeting Planner kami.

Anda juga dapat menghubungi saya @reifman. Saya selalu terbuka untuk ide-ide fitur baru dan saran topik untuk tutorial selanjutnya.

Ikuti terus semua ini dan lebih banyak lagi tutorial yang akan datang dengan melihat seri Membangun Startup Anda Dengan PHP.

Tautan yang Berhubungan

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.