Advertisement
  1. Code
  2. Yii

Xây dựng Startup của bạn: Điều phối lời mời họp

Scroll to top
Read Time: 19 min
This post is part of a series called Building Your Startup With PHP.
Using the Mailgun Store(): A Temporary Mailbox for Your App's Incoming Email
Building Your Startup With PHP: Email Commands

Vietnamese (Tiếng Việt) translation by Andrea Ho (you can also view the original English article)

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

Giới thiệu

Hướng dẫn này là một phần của loạt bài Xây dựng Khởi nghiệp Với PHP trên Envato Tuts. Trong loạt bài này, tôi hướng dẫn bạn thông qua việc khởi chạy một khởi động từ khái niệm này sang thực tế bằng cách sử dụng ứng dụng Meeting Planner của tôi làm ví dụ thực tế. Trên mỗi giai đoạn, tôi sẽ phát hành code của Meeting Planner dưới những ví dụ nguồn mở để bạn có thể tham khảo. Tôi cũng sẽ giải quyết các vấn đề kinh doanh liên quan đến khởi nghiệp khi chúng phát sinh.

Phần này gồm có những gì?

Trong hướng dẫn này, chúng tôi sẽ đề cập phần gửi email lời mời đến người tham gia, triển khai hỉnh ảnh cơ bản của nội dung và xem xét cấu trúc của các liên kết cho người nhận để họ có thể hồi đáp.

Tất cả code cho Meeting Planner được viết bằng framework Yii2 của PHP. Nếu bạn muốn tìm hiểu thêm về Yii2, hãy xem loạt bài song song của tôi Programming With Yii2 tại Envato Tuts+.

Xin nhắc rằng, tôi tham gia vào các chủ đề bình luận dưới đây. Tôi đặc biệt quan tâm nếu bạn có các cách tiếp cận khác nhau, ý tưởng bổ sung hoặc muốn đề xuất các chủ đề cho hướng dẫn trong tương lai. Bạn cũng có thể liên hệ với tôi trên Twitter @reifman.

Những yêu cầu để gửi đi những lời mời

Thật thú vị tiến đến giai đoạn này trong việc chuyển tải các lời mời đầu tiên, nhưng nó vẫn đòi hỏi rất nhiều công việc. Trong phần gần nhất, tôi đã cập nhật các view cho cuộc họp để chúng có thể hỗ trợ cả người tổ chức lẫn người tham gia.

Hầu hết công việc trong phần này sẽ tập trung vào việc tạo email HTML trong Yii và phân phối các chương trình này theo lập trình. Tuy nhiên, khi tôi bắt đầu viết mã cho điều này, tôi đã chạy vào tất cả những phức tạp mà hệ thống phải sớm hỗ trợ. Ví dụ: tất cả các liên kết trong lời mời cần thiết để xác thực người tham gia một cách an toàn trong khi xem xét rằng họ chưa từng đăng ký Meeting Planner. Tôi sẽ để dành một vài điều này lại cho bài viết tiếp theo.

Về cơ bản, chúng ta phải làm cho ứng dụng nhận thức được ai đang xem trang họp và sau đó tùy chỉnh giao diện và các lệnh có sẵn. Yii giúp cho việc thực hiện những điều này khá dễ dàng, nhưng còn có rất nhiều chi tiết bị tác động.

Giới thiệu tóm tắt về trải nghiệm người dùng

Hãy để tôi nói trước, có rất nhiều trải nghiệm người dùng được làm lại và trau chuốt, chúng sẽ cần phải được hoàn thành nhiều lần theo thời gian trên hành trình tạo ra một đường để tạo ra sản phẩm MVP. Hầu hết những gì tôi đang xây dựng ngay bây giờ là chức năng nòng cốt để có bản alpha có thể vận hành trong thực tế. Tôi biết nó trông khá thô ráp ở những nhiều chỗ và không có vẻ bắt mắt như bạn muốn. Ngoài ra còn những phần thiếu hiệu quả trong coding cần phải được tối ưu trong tương lai.

Xin vui lòng đăng ý kiến ​​và bình luận của bạn ở bên dưới, và tôi sẽ xem xét chúng cho những công việc đang diễn ra.

Dưới đây là một số thách thức công việc phát sinh trong phần này:

  • Thiết kế cơ bản và nội dung email mời
  • Lời mời sẽ được gửi như thế nào? ví dụ: nền tảng email hoặc nhà cung cấp nào?
  • Các lệnh liên kết nào sẽ được cung cấp trong email? Và người tổ chức có thể giới hạn một số quyền hạn được trao cho người tham gia không?
  • Trả lời theo chức năng cho các lệnh được liên kết trong email gửi lời mời
  • Quản lý các lượt truy cập từ những người dùng được mời chưa đăng ký, ví dụ: những gì họ có thể và không thể truy cập?
  • Xử lý trải nghiệm người dùng cho việc thu thập những cái tên thân thiện từ những người tham dự
  • Ghi lại câu trả lời cho lời mời họp và sau đó xây dựng khả năng giám sát và thông báo để thông báo cho người tổ chức
  • Lập kế hoạch cho cơ sở hạ tầng cho các email trong tương lai hiển thị cập nhật khi cấu hình cuộc họp thay đổi và thời gian gần đến (và trôi qua), ví dụ: thay đổi thông báo, lời nhắc cuộc họp, chấp nhận trả lời ở dạng ghi chú mới, v.v.

Khi tôi code cho phần này, tôi đã xây dựng một số cơ sở hạ tầng cho một số mục ở trên và để dànhi một vài cái trong số chúng cho việc thảo luận trong các phần sau. Để bắt đầu, chúng ta hãy đi sâu vào phần thiết kế lời mời.

Thiết kế và các nội dung của lời mời

Ban đầu, tôi phải hỏi, những điều gì nên được kèm theo trong email? Rõ ràng sẽ có các field chuẩn mực:

  • Đến
  • Từ
  • Chủ đề (bạn được mời tham dự một cuộc họp!)
  • Nội dung thư
  • Footer

Nội dung chính sẽ cần có

  • Thông tin chi tiết cuộc họp
  • Các địa điểm được đề xuất
  • Ngày và giờ được đề xuất

Và, tùy thuộc vào thiết lập của người tổ chức, các liên kết lệnh nào nên được hiển thị? Dưới đây là một số câu hỏi phát sinh. Chúng tôi có nên cho phép người nhận:

  • Chấp nhận mọi tùy chọn, ví dụ tất cả địa điểm, ngày và giờ đều được chấp nhận
  • Chấp nhận tất cả các địa điểm hoặc tất cả các ngày và thời gian một cách riêng biệt
  • Chấp nhận các địa điểm cụ thể và ngày và giờ cụ thể một cách riêng lẻ
  • Xem bản đồ cho các địa điểm tiềm năng và cuối cùng là các website và những liên kết Yelp
  • Đăng tải một ghi chú trả về cho người tổ chức cho chế độ xem cuộc họp
  • Đề xuất địa điểm hoặc ngày và giờ mới
  • Chọn một địa điểm hoặc ngày và giờ
  • Chốt cuộc họp

Cuối cùng, footer sẽ cần hỗ trợ:

  • Thông báo alpha với yêu cầu cho phần phản hồi
  • Một tùy chọn để chặn người gửi
  • Tùy chọn dừng đăng ký những lời mời từ Meeting Planner trong tương lai
  • Chi tiết công ty và thông tin liên hệ

Tôi biết rất khó để hình ảnh hoá tất cả điều này - xây dựng chúng không hề dễ dàng. Dưới đây là ví dụ về lời mời mà cuối cùng tôi đã xây dựng được:

Meeting Planner Invitation ExampleMeeting Planner Invitation ExampleMeeting Planner Invitation Example

Hiện tại, tôi đã sử dụng các lệnh acceptablereject để cho người tham gia hiểu họ đơn giản chỉ là cho biết địa điểm hoặc ngày và giờ có thích hợp cho họ hay không. Tuy nhiên, để đơn giản, tôi đề nghị accept all places and times, accept all placesaccept all times để quản trị điều này với các bước nhanh hơn.

Tất cả các việc này dựa trên form thực tế của lời mời họp từ phần trước đó. Bên dưới, bạn có thể xem một phần lời mời, nó cung cấp thiết lập các địa điểm và thời gian:

Meeting Planner Invitation - View of Places and TimesMeeting Planner Invitation - View of Places and TimesMeeting Planner Invitation - View of Places and Times

Lưu ý rằng email cung cấp một số chức năng nâng cao được xây dựng trong tập cuối để cho phép các nhà tổ chức cung cấp các mức kiểm soát nâng cao cho người tham gia như đề xuất địa điểm và thời gian mới, chọn địa điểm và thời gian cuối cùng, v.v.

Meeting Planner Invitation - Updating Your Meeting SettingsMeeting Planner Invitation - Updating Your Meeting SettingsMeeting Planner Invitation - Updating Your Meeting Settings

Điều đó nhanh chóng trở nên rõ ràng rằng việc đầu tư nhiều hơn cho việc thiết kế email và đề xuất các cấu hình đơn giản hơn của lời mời sẽ trở thành nhu cầu trong tương lai. Một lần nữa, tôi sẽ phải lưu ý tưởng này cho các phần tiếp theo.

Ví dụ, một trong những người bạn thử nghiệm bản alpha đầu tiên của tôi đề nghị rằng họ muốn họ có thể mô tả rằng một số địa điểm chỉ hoạt động vào những ngày và giờ nhất định và ngược lại. Cuối cùng, tôi có thể cần phải nhất quán các địa điểm và ngày tháng vào một mô hình các chọn lựa.

Giờ hãy xem xét tôi đã gửi lời mời ở trên ra nào.

Chuyển phát lời mời

Meeting Planner Invitation - The Command Bar with SendMeeting Planner Invitation - The Command Bar with SendMeeting Planner Invitation - The Command Bar with Send

Điều gì xảy ra khi người tổ chức click vào Send? Ban đầu, tôi hy vọng rằng tôi sẽ phải viết trực tiếp vào API Mailgun, điều này tôi đã tiết lộ trong các hướng dẫn trước đó của Envato Tuts. Tuy nhiên, sự hỗ trợ của Yii2 cho email khá phong phú và tôi có thể tận dụng sự hỗ trợ chế độ xem thuần tuý cho các bố cục email (cả HTML và văn bản) và chỉ cần gửi chúng bằng cách sử dụng phần xác thực tài khoản SMTP Mailgun của tôi. Nó thậm chí còn hỗ trợ đính kèm các file sự kiện trong tương lai (.ics) để nhập các cuộc họp vào lịch.

Lưu ý: Tôi là một fan hâm mộ lớn của Mailgun, nhưng tôi cũng đã phát triển cho họ với vai trò một nhà tư vấn và viết cho blog của họEnvato Tuts+.

Trước khi tiếp tục, tôi khuyến khích bạn lướt nhanh tài liệu Yii2's Mailing documentation. Nó đem lại cái nhìn tổng quan tuyệt vời.

Đầu tiên, tôi đã thêm các thiết lập cấu hình SwiftMailer chi tiết hơn vào /common/config/main-local.php:

1
<?php
2
return [
3
    'components' => [
4
        'db' => [
5
            'class' => 'yii\db\Connection',
6
            'dsn' => 'mysql:host=localhost;dbname=mp',
7
            'username' => 'xxxxxxxxxxxx',
8
            'password' => 'xxxxxxxxxxxx',
9
            'charset' => 'utf8',
10
        ],
11
        'mailer' => [
12
            'class' => 'yii\swiftmailer\Mailer',
13
            'viewPath' => '@common/mail',
14
            //comment the following array to send mail using php's mail function

15
            'transport' => [
16
                'class' => 'Swift_SmtpTransport',
17
                'host' => 'smtp.mailgun.org',
18
                'username' => 'xxxxxxxxxxxxxxxxxx@meetingplanner.io',
19
                'password' => 'axxxxxxxxxxxxxxxxxxxxxxxx2',
20
                'port' => '587',
21
                'encryption' => 'tls',
22
                            ],
23
            // send all mails to a file by default. You have to set

24
            // 'useFileTransport' to false and configure a transport

25
            // for the mailer to send real emails.

26
            'useFileTransport' => false,
27
        ],
28
    ],
29
];

Điều này cho phép thành phần SwiftMailer của Yii gửi email của tôi qua dịch vụ SMTP cơ bản của Mailgun.

Bạn sẽ cần phải nhận thiết lập của SMTP Mailgun từ bảng điều khiển của domain của bạn:

Meeting Planner Invitation - Mailgun SMTP SettingsMeeting Planner Invitation - Mailgun SMTP SettingsMeeting Planner Invitation - Mailgun SMTP Settings

Tất nhiên, bạn cũng phải đảm bảo SwiftMailer có trong cấu hình của file composer.json trước khi chạy composer update:

1
"minimum-stability": "stable",
2
    "require": {
3
        "php": ">=5.4.0",
4
        "yiisoft/yii2": ">=2.0.7",
5
        "yiisoft/yii2-bootstrap": "*",
6
        "yiisoft/yii2-swiftmailer": "*",

Tiếp theo, tôi đã tạo view file cấu hình cho SwiftMailer để sử dụng. Đầu tiên, phải có bố cục chính cho HTML và cả nội dung chữ. Sau đó, cũng phải có các file nội dung riêng lẻ cho mỗi phần:

Meeting Planner Invitation - The Folder and Files in Mail LayoutsMeeting Planner Invitation - The Folder and Files in Mail LayoutsMeeting Planner Invitation - The Folder and Files in Mail Layouts

Không phải tất cả điều này đều có tài liệu đầy đủ cho Yii, vì vậy hy vọng ví dụ này sẽ đề xuất được một số chỉ dẫn. Lưu ý rằng các file finalize-html và -text view được bổ sung vào sau này cho phần tiếp theo.

Thông thường, file layout/html.php rất đơn giản:

1
<?php
2
use yii\helpers\Html;
3
4
/* @var $this \yii\web\View view component instance */
5
/* @var $message \yii\mail\MessageInterface the message being composed */
6
/* @var $content string main view render result */
7
?>
8
<?php $this->beginPage() ?>
9
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
10
<html xmlns="http://www.w3.org/1999/xhtml">
11
<head>
12
    <meta http-equiv="Content-Type" content="text/html; charset=<?= Yii::$app->charset ?>" />
13
    <style type="text/css">
14
        .heading {...}
15
        .list {...}
16
        .footer {...}
17
    </style>
18
    <?php $this->head() ?>
19
</head>
20
<body>
21
    <?php $this->beginBody() ?>
22
    <?= $content ?>
23
    <div class="footer">With kind regards, <?= Yii::$app->name ?> team</div>
24
    <?php $this->endBody() ?>
25
</body>
26
</html>
27
<?php $this->endPage() ?>

Tuy nhiên, tôi đã bổ sung vào nó rất nhiều thứ để bắt đầu tạo style và định dạng của các email HTML được cung cấp cho cộng đồng nguồn mở từ Mailchimp.

Nói chung SwiftMailer của Yii sẽ tự động chuyển chế độ xem HTML của bạn thành chế độ xem tương thích với văn bản cho bạn. Nhiều khả năng, tôi sẽ muốn có một chế độ xem văn bản ngắn hơn, đơn giản hơn cho lời mời, nhưng hiện tại, tôi sẽ trì hoãn xem lại các kết quả email dựa trên văn bản của mã của tôi.

Trong model Meeting.php, tôi đã viết một hàm gửi để tập hợp tất cả các dữ liệu cần thiết để xây dựng khung nhìn lời mời của tôi được hiển thị ở trên. Bây giờ, tôi sẽ bỏ các phần liên quan đến tập tiếp theo để xây dựng các liên kết lệnh. Về cơ bản, tôi sử dụng Yii::$app->mailer compose()send():

1
public function send($user_id) {
2
    ...
3
  foreach ($this->participants as $p) {
4
    ...
5
    // send the message

6
    $message = Yii::$app->mailer->compose([
7
      'html' => 'invitation-html',
8
      'text' => 'invitation-text'
9
    ],
10
    [
11
      'meeting_id' => $this->id,
12
      'noPlaces' => $noPlaces,
13
      'participant_id' => 0,
14
      'owner' => $this->owner->username,
15
      'user_id' => $p->participant_id,
16
      'auth_key' => $auth_key,
17
      'intro' => $this->message,
18
      'links' => $links,
19
      'header' => $header,
20
      'places' => $places,
21
      'times' => $times,
22
      'notes' => $notes,
23
      'meetingSettings' => $this->meetingSettings,
24
  ]);
25
    // to do - add full name

26
    $message->setFrom(array('support@meetingplanner.com'=>$this->owner->email));
27
    $message->setTo($p->participant->email)
28
        ->setSubject(Yii::t('frontend','Meeting Request: ').$this->subject)
29
        ->send();
30
  }
31
  ...

Các hàm này xây dựng một thông báo bằng cách sử dụng HTML layout và view của chúng ta và sau đó truyền các kết quả thông báo với dữ liệu được cá nhân hóa sang dịch vụ SMTP của Mailgun. Chúng ta có thể sử dụng việc triển khai mô hình MVC của Yii để gửi email.

Những vấn đề với Composer

Khi tôi đã sử dụng Composer với Yii, tôi thường gặp phải rất nhiều vấn đề với về việc khó theo dõi. Thường gặp nhất là liên quan đến lỗi "yiisoft/yii2-composer" plugin requires composer-plugin-api 1.0.0, nhưng lần này, tôi gặp phải vấn đề khi cập nhật Mailgun. Các phiên bản gần đây của Mailgun API yêu cầu bản cập nhật hiện tại sang guzzle. Một plugin Yii được dùng trước đó trong MeetingPlanner yêu cầu phiên một phiên bản guzzle đã lỗi thời. Vì vậy, tôi đã phải cấu hình composer để sử dụng một alias.

Về cơ bản, tôi đã hướng dẫn composer đồng bộ phiên bản mới nhất của guzzle nhưng thông báo với ứng dụng biết đang sử dụng phiên bản cũ hơn. Trong composer.json, một alias trông như sau:

1
"yiisoft/yii2-authclient": "~2.0.0",
2
"mailgun/mailgun-php": "~2.0",
3
"guzzlehttp/guzzle":"6.2.0 as 4.2.3",
4
"php-http/guzzle6-adapter":"1.0.0"
5
},

Tôi chỉ dẫn nó cài đặt "guzzlehttp/guzzle":"6.2.0 as 4.2.3" và điều này khiến mọi thứ hoạt động tốt, ít nhất là trong tình huống này. Đôi khi, các nhà phát triển plugin yêu cầu phiên bản cụ thể cho các thư viện để hoạt động trơn tru. Composer phần lớn là hữu ích, nhưng thỉnh thoảng nó cũng thú vị.

Cập nhật phần tạo cuộc họp

Khi tôi trải nghiệm với các lời mời, tôi quyết định tùy chỉnh view cho phần tạo cuộc họp thành hỗ trợ rõ ràng hơn cho một chủ đề. Điều này cho phép người dùng viết một dòng chủ đề giống như họ đang gửi một email để mời ai đó tham gia một cuộc họp mà không cần Meeting Planner. UX cho việc này sẽ cần phải được lặp lại và đơn giản hóa theo thời gian.

Meeting Planner Invitation - Create a MeetingMeeting Planner Invitation - Create a MeetingMeeting Planner Invitation - Create a Meeting

Điều này mang đến một dòng chủ đề lý tưởng trong email cho lời mời họp. Tất nhiên, để làm điều này, tôi đã phải mở rộng model Meeting.

Tôi tạo một migration mới extend_meeting_table_add_subject, để thêm một field cho subject:

1
<?php
2
3
use yii\db\Schema;
4
use yii\db\Migration;
5
6
class m160409_204159_extend_meeting_table_add_subject 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->addColumn('{{%meeting}}','subject','string NOT NULL');
16
  }
17
18
  public function down()
19
  {
20
    $this->dropColumn('{{%meeting}}','subject');
21
  }
22
}

Và tôi phải bổ sung hỗ trợ cho field mới vào file meeting_form.php và model.

1
<div class="meeting-form">
2
3
    <?php $form = ActiveForm::begin(); ?>
4
5
    <?= $form->field($model, 'meeting_type')
6
            ->dropDownList(
7
                $model->getMeetingTypeOptions(),
8
                ['prompt'=>Yii::t('frontend','What type of meeting is this?')]
9
            )->label(Yii::t('frontend','Meeting Type')) ?>
10
11
    <?= $form->field($model, 'subject')->textInput(['maxlength' => 255])->label(Yii::t('frontend','Subject')) ?>
12
13
    <?= $form->field($model, 'message')->textarea(['rows' => 6])->label(Yii::t('frontend','Message'))->hint(Yii::t('frontend','Optional')) ?>
14
15
    <div class="form-group">
16
        <?= Html::submitButton($model->isNewRecord ? Yii::t('frontend', 'Create') : Yii::t('frontend', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
17
    </div>
18
19
    <?php ActiveForm::end(); ?>
20
21
</div>

Dưới đây là phần trích dẫn của phần thêm vào model Meeting.php:

1
public function rules()
2
    {
3
        return [
4
            [['owner_id', 'subject'], 'required'],
5
            [['owner_id', 'meeting_type', 'status', 'created_at', 'updated_at'], 'integer'],
6
            [['message','subject'], 'string']
7
        ];
8
    }
9
10
    /**

11
     * @inheritdoc

12
     */
13
    public function attributeLabels()
14
    {
15
        return [
16
            'id' => Yii::t('frontend', 'ID'),
17
            'owner_id' => Yii::t('frontend', 'Owner ID'),
18
            'meeting_type' => Yii::t('frontend', 'Meeting Type'),
19
            'subject' => Yii::t('frontend', 'Subject'),
20
            'message' => Yii::t('frontend', 'Message'),
21
            'status' => Yii::t('frontend', 'Status'),
22
            'created_at' => Yii::t('frontend', 'Created At'),
23
            'updated_at' => Yii::t('frontend', 'Updated At'),
24
        ];
25
    }

Trang bản đồ được cập nhật cho các địa điểm

Ban đầu, các liên kết bản đồ lời mời của tôi được gửi trực tiếp tới Google Maps, nhưng tôi nhận ra rằng sẽ tốt hơn khi liên kết chúng với chế độ xem bản đồ được nhúng tại Meeting Planner, một phần của lời mời cho Meeting. Trong tình huống này, tôi đã tạo một view để xem bản đồ với nút Return to Meeting:

Meeting Planner Invitation - Viewing a Place within a Meeting InvitationMeeting Planner Invitation - Viewing a Place within a Meeting InvitationMeeting Planner Invitation - Viewing a Place within a Meeting Invitation

Đối với việc này, tôi tạo ra một view mới được xây dựng trên /views/place/view.php. Đây là /views/meeting/viewplace.php:

1
<?php
2
3
use dosamigos\google\maps\Map;
4
use dosamigos\google\maps\LatLng;
5
use dosamigos\google\maps\overlays\Marker;
6
use yii\helpers\Html;
7
use yii\widgets\DetailView;
8
9
/* @var $this yii\web\View */
10
/* @var $model frontend\models\Place */
11
$this->title = $model->getMeetingHeader();
12
$this->params['breadcrumbs'][] = ['label' => Yii::t('frontend', 'Meetings'), 'url' => ['index']];
13
$this->params['breadcrumbs'][] = $this->title;
14
$this->params['breadcrumbs'][] = $place->name;
15
?>
16
<h1><?php echo Html::encode($this->title) ?></h1>
17
18
<p>
19
  <?php echo Html::a(Yii::t('frontend', 'Return to Meeting'), ['view', 'id' => $model->id], ['class' => 'btn btn-primary']) ?>
20
</p>
21
22
<div class="col-md-6">
23
<div class="place-view">
24
25
    <?php echo DetailView::widget([
26
        'model' => $place,
27
        'attributes' => [
28
            'name',
29
            ['label' => 'website',
30
     'value' => Html::a($place->website, $place->website),
31
     'format' => 'raw'],
32
            //'place_type',

33
            'full_address',
34
        ],
35
    ]) ?>
36
37
</div>
38
</div> <!-- end first col -->
39
<div class="col-md-6">
40
  <?php
41
  if ($gps!==false) {
42
    $coord = new LatLng(['lat' => $gps->lat, 'lng' => $gps->lng]);
43
    $map = new Map([
44
        'center' => $coord,
45
        'zoom' => 14,
46
        'width'=>300,
47
        'height'=>300,
48
    ]);
49
    $marker = new Marker([
50
        'position' => $coord,
51
        'title' => $place->name,
52
    ]);
53
    // Add marker to the map

54
    $map->addOverlay($marker);
55
    echo $map->display();
56
  } else {
57
    echo 'No location coordinates for this place could be found.';
58
  }
59
  ?>
60
61
</div> <!-- end second col -->

Tiếp theo là gì?

Như bạn có thể thấy, nhận được email lời mời đã sinh ra tất cả các loại vấn đề và yêu cầu nhiều bản cập nhật từ nhỏ đến vừa. Nhưng, với nền tảng cơ bản cho họ hoàn thành, chúng ta có thể chiêm ngưỡng sự phức tạp của những gì dã được tạo ra. Nói cách khác, những điề cần thiết tiếp theo:

  • Các liên kết lệnh được xác thực. Khi người tham gia nhấp vào liên kết lệnh trong email, chúng tôi sẽ xác thực chúng như thế nào, đặc biệt nếu họ chưa bao giờ đăng ký với ứng dụng của tôi?
  • Việc chốt cuộc họp tuỳ theo các hồi đáp. Khi những người tham gia đưa ra lựa chọn và người tổ chức sẵn sàng để chốt cuộc họp, những thay đổi và cập nhật cần thiết để hỗ trợ điều đó?
  • Việc giám sát quá trình thay đổi được thực hiện bởi những người tham gia vào lời mời. Chúng tôi sẽ làm thế nào để theo dõi các thay đổi với chi tiết cuộc họp và chọn thời điểm thông báo cho người tổ chức và người tham gia?
  • Thông báo cho người tổ chức và người tham gia thay đổi. Chúng ta nên nói gì với họ và lựa chọn nào sẽ được cung cấp khi chúng tôi thông báo cho họ?
  • Việc tạo các file Calendar (.ics) để nhập vào Google Calendar, Outlook và Apple Calendar với chi tiết lời mời. Khi cuộc họp được hoàn tất, chúng tôi có thể gửi một file .ics có hỗ trợ download.
  • Xây dựng một view để xem cuộc họp đã được chốt. Chi tiết cuộc họp nên trông ra sao khi nó không còn cần để cung cấp các lệnh để chọn địa điểm và thời gian? Nhưng, ngoài ra, cần có những lệnh nào để lên lịch lại, thay đổi thời gian, hủy, thay đổi vị trí hoặc ngày và giờ, v.v.?

Phần tiếp theo sẽ khám phá một vài trong số các câu hỏi này, tập trung vào các liên kết trong lời mời mà người nhận sẽ muốn trả lời dù họ chưa từng đăng ký với Meeting Planner lúc ban đầu. Các vấn đề khác sẽ phải chờ lâu hơn một chút.

Tôi cũng bắt đầu thử nghiệm với WeFunder dựa trên việc thực hiện các quy tắc mới để huy động vốn từ cộng đồng của SEC. Xin vui lòng xem xét theo dõi hồ sơ của chúng tôi. Tôi có thể viết về chuyện này nhiều hơn trong một phần của loạt bài này.

Đón xem các hướng dẫn sắp tới trong loạt bài Building Your Startup With PHP — Tôi hy vọng bạn đồng ý rằng điều này thật thú vị!

Vui lòng thoải mái thêm câu hỏi và bình luận của bạn bên dưới ; Tôi thường tham gia vào các cuộc thảo luận. Bạn cũng có thể liên hệ với tôi trên Twitter @reifman.

Liên kết liên quan

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.