Trang web mà bạn đang đọc đây là một trang theo chuẩn AMP
Trang web mà bạn đang đọc đây đã được nhúng Zalo OA Chatbox của Công Cụ TỐt, nếu bạn thấy cửa sổ chat thì tức là việc sửa đổi đã thành công.
Nếu không hoạt động(chủ yếu do cơ chế thông điệp của Zalo bị chặn bởi sanbox AMP trong virtual DOM) thì bạn tham khảo phương án biên dịch thông điệp trung gian, phương án này rườm rà hơn, cũng không sử dụng SDK.js của Zalo mà mình đã viết lại cái khác.
Chào các bạn !
Mình là Nguyễn Thái Hà, IT của Công Cụ Tốt.
Như các bạn đã biết, Zalo Widget Chat cho phép mọi người dễ dàng cá nhân hóa và nhúng cửa sổ chat với Official Account trên trang web của họ.
Khách truy cập của bạn có thể trò chuyện trực tiếp với Official Account.
Mã nhúng của Zalo sửa dụng SDK.js là dạng javascript nên không chạy với trang AMP. Để chạy được, ta dùng amp-script. Tuy nhiên ngay cả khi dùng amp-script để load https://sp.zalo.me/plugins/sdk.js thì vẫn không thể chạy vì bản code này được bên ZALO code không theo chuẩn AMP.
Sau khi mình đọc bản gốc của Zalo SDK cung cấp tại https://sp.zalo.me/plugins/sdk.js thì mình cho rằng giải pháp là sửa đổi nó, thay thế các đoạn mã cho hợp với định dạng AMP thành zaloamp.js, rồi nhúng vào trang AMP như mình sẽ trình bày sau đây. Zalo phát hành SDK để dùng vào nhiều việc, nhưng để cho đơn giản, SDK viết lại sẽ chỉ tập trung vào một vấn đề là có cửa sổ chat góc dưới bên phải màn hình bạn nhé. Các bạn hoàn toàn có thể viết lại SDK theo ý các bạn. Các ý chính của Zalo SDK là:
Để chạy Zalo Chat Box với website theo chuẩn AMP (như trang web bạn đang đọc đây) thì mình sẽ dùng đến 2 thành phần là <amp-script> để chạy javascript lắng nghe sự kiện từ cửa sổ chat trên trang AMP và <amp-iframe> để nhúng iframe vào trang AMP
Đừng quên chèn thành phần
<script async custom-element="amp-iframe" src="https://cdn.ampproject.org/v0/amp-iframe-0.1.js"></script> và
<script async custom-element="amp-script" src="https://cdn.ampproject.org/v0/amp-script-0.1.js"></script>
vào phần đầu head của trang AMP index.html
Thêm vào phần đầu head định dạng Style cho thẻ div bao bọc bên ngoài thông qua lớp zalo-chat-widget
<style amp-custom> .zalo-chat-widget { border: none; visibility: visible; position: fixed; bottom: 45px; right: 20px; height: 60px; width: 60px; max-width: 90vw; top: auto; z-index: 2147483644; } </style>
Thêm vào phần cuối cùng của thẻ body, (thẻ <amp-script> mình để kích thước 1x1 nên muốn dấu xuống dưới để tránh lộ).
<amp-script src="https://you.domain/zaloamp.js" width="1" height="1" layout="fixed" class="i-amphtml-hydrated"> <div class="zalo-chat-widget" > </div> </amp-script>
Chúng ta thấy có 4 phần tử bao bọc nhau:
Ngoài cùng là <amp-script> để gọi mã javascript zaloamp.js. Lớp i-amphtml-hydrated - một lớp được định nghĩa sẵn của AMP - được thêm vào cho <amp-script> để cửa sổ Zalo Chat không bị điều chỉnh độ trong suốt (chả hiểu sao dự án AMP lại làm mờ tất cả các Virtual DOM của <amp-script>)
Tiếp theo là thẻ div có lớp zalo-chat-widget mà ta đã định nghĩa ở bước 3 có tác dụng bao bọc iframe và neo nổi nó ở góc dưới bên phải màn hình.
Tiếp trong thẻ div là thẻ <amp-iframe> đã cấu hình layout và sanbox phù hợp.
Trong cùng là thẻ ảnh <amp-img>, để thay thế nội dung cho iframe khi iframe load nội dung
Chúc các bạn thành công và sáng tạo thêm để có cửa sổ Zalo Chat ưng ý trên website AMP nhé !