1. Trang chủ
  2. » Giáo Dục - Đào Tạo

PHÁT TRIỂN ỨNG DỤNG DỊCH vụ HƯỚNG vị TRÍ TRÊN nền DRUPAL

58 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 58
Dung lượng 1,25 MB

Nội dung

TRƯỜNG ………………… KHOA……………………… -[\ [\ - Báo cáo tốt nghiệp Đề tài: PHÁT TRIỂN ỨNG DỤNG DỊCH VỤ HƯỚNG VỊ TRÍ TRÊN NỀN DRUPAL LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Lời cảm ơn Trước tiên, muốn gửi lời cảm ơn sâu sắc đến T.S Nguyễn Hải Châu, người hết lịng hướng dẫn tơi suốt q trình thực khóa luận tốt nghiệp Tơi xin chân thành cảm ơn thầy, cô trường đại học Công Nghệ cung cấp cho tảng kiến thức quý báu giúp đỡ tận tình để tơi hồn thành khóa luận Tơi muốn cảm ơn bạn tơi, người giúp đỡ đưa giải pháp lập trình hiệu thực thử nghiệm liên quan đến khóa luận Cuối cùng, tơi xin gửi lời cảm ơn đến gia đình người thân tôi, người động viên giúp đỡ tơi suốt q trình học tập thực khóa luận Hà Nội, ngày 20 tháng năm 2010 Sinh viên Đặng Vĩnh Thiêm i LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Tóm tắt khóa luận Drupal hệ quản trị nội dung sử dụng phổ biến Internet thời gian gần Với thiết kế mang tính module, Drupal cho phép mở rộng tính cách linh hoạt thơng qua module thêm vào mà thay đổi mã nguồn hệ thống Trong khoá luận này, chúng tơi tập trung tìm hiểu kiến thức liên quan đến việc xây dựng module cho Drupal bao gồm triển khai hook, làm việc với sở liệu, thực thi mã JavaScript, xử lý form v v Đi vào thực nghiệm, đã thiết kế và cài đặt thành cơng module có chức tích hợp đồ số Google Maps vào trang web cách sử dụng API Google cung cấp Module hướng tới đối tượng website liên quan đến địa danh, địa điểm website du lịch, tra cứu địa điểm đồ ii LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Mục lục Lời cảm ơn i Tóm tắt khóa luận .ii Mục lục iii Mở đầu Chương 1: Tổng quan Drupal 1.1 Giới thiệu Drupal .2 1.2 Kiến trúc Drupal .2 1.2.1 Kiến trúc module 1.2.2 Các module lõi 1.2.3 Hook 1.2.4 Giao diện 1.3 Các khái niệm Drupal 1.3.1 Node 1.3.2 Người dùng (User) 1.3.3 Khối cách thể trang .9 1.3.4 Thực đơn – Menu 10 1.3.5 Form .10 1.3.6 API sở liệu lược đồ 11 1.4 Hệ thống tệp tin thư mục Drupal .11 1.5 Drupal xử lý yêu cầu nào? 13 1.5.1 Vai trò Web server 13 1.5.2 Quá trình khởi động .13 1.5.3 Xử lý yêu cầu 14 1.5.4 Giao diện hoá nội dung 15 1.6 Công cụ dành cho người phát triển .15 1.6.1 Module Devel 15 1.6.2 Module Coder 15 iii LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Chương - Xây dựng module cho Drupal 17 2.1 File info module .17 2.1.1 File info 17 2.1.2 File module 19 2.2 Chú thích mã nguồn .19 2.3 Một số hook .20 2.4 Định nghĩa hook .24 2.4.1 Cách tạo hook 24 2.4.2 Sử dụng hook vào module khác .26 2.5 Một số hàm quan trọng thư viện hàm Drupal .26 2.6 Sử dụng Javascript AJAX/JSON 28 2.6.1 Giới thiệu jQuery 28 2.6.2 jQuery hoạt động 28 2.6.2.1 Sử dụng lọc ID CSS 29 2.6.2.2 Sử dụng XPath 29 2.6.3 jQuery Drupal .30 2.7 Form API 30 2.7.1 Quá trình thao tác với form 31 2.7.2 Một số thao tác 34 2.7.2.1 Tạo form 34 2.7.2.2 Giao diện hoá form 35 2.7.2.3 Kiểm tra liệu 35 2.7.2.4 Gửi form lên trang web 36 2.8 Làm việc với sở liệu 36 2.8.1 Định nghĩa tham số CSDL .36 2.8.2 Một số truy vấn đơn giản .37 2.8.3 Lấy kết truy vấn 38 Chương 3: Xây dựng module tích hợp .40 Google Maps vào Drupal 40 iv LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 3.1 Giới thiệu Google Maps 40 3.2 Nhúng đồ vào trang web 40 3.2.1 Tạo đồ đơn giản .41 3.2.2 Dịch vụ Geocoder - Chuyển đổi địa toạ độ 42 3.3 Xây dựng module Google Maps cho Drupal 42 3.3.1 Module Google Maps 42 3.3.1.1 File info 42 3.3.1.2 File module 43 3.3.1.3 Tạo thêm trường thông tin cho viết 43 45 Kết luận 46 Tài liệu tham khảo 47 Phụ lục A 48 A.1 Cài đặt module Google Maps .48 A.2 Chạy thử chương trình 50 v LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bảng từ viết tắt Từ viết tắt Cụm từ đầy đủ URI Uniform Resource Identifier CVS Concurrent Version System API Application Programming Interface CSDL Cơ sở liệu CMS Content Management System vi LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Mở đầu Trong thời đại Công nghệ thông tin ngày nay, các dịch vụ và ứng dụng web ngày càng phát triển Việc một cá nhân hay tổ chức sở hữu một website, một cổng thông tin là điều dễ thấy Internet Để thiết kế một trang web phục vụ mục đích riêng, người dùng có nhiều lựa chọn Một số đó là sử dụng hệ quản trị nội dung sẵn có để tổ chức xây dựng các trang thông tin Với mục đích đó, chúng tơi chọn Drupal, CMS phổ biến nhất, để thực nghiên cứu Sở dĩ chúng tơi chọn CMS hệ mã nguồn mở miễn phí, sử dụng rộng rãi cộng đồng mạng phát triển ngày hồn thiện Drupal sử dụng nhiều mục đích xây dựng cổng thơng tin trực tuyến, website cá nhân, tổ chức, website thương mại, báo điện tử, thư viện hình ảnh Hệ thống Drupal thiết kế để tuỳ biến theo mong muốn người dùng việc tuỳ biến thực cách thêm module để làm tăng khả hệ thống mà không thay đổi nhân Do đó, khố luận chúng tơi trọng tìm hiểu cách xây dựng module cho Drupal vấn đề liên quan Chúng hi vọng phần kiến thức tìm hiểu khóa luận mạng lại ý nghĩa tích cực thực tiễn Ngồi phần mở đầu, bố cục khóa luận gồm chương sau: • Chương 1: Trình bày kiến thức hệ thống Drupal cách hoạt động • Chương 2: Tìm hiểu cách viết module Drupal • Chương 3: Đưa lý thuyết trình bày vào thực tế để thiết kế module cụ thể • Cuối phần kết luận hướng phát triển tương lai LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Chương 1: Tổng quan Drupal 1.1 Giới thiệu Drupal Drupal framework dùng cho phát triển phần mềm hướng module, hệ thống quản trị nội dung miễn phí mã nguồn mở Cũng giống hệ thống quản trị nội dung đại khác, Drupal cho phép người quản trị hệ thống tạo tổ chức liệu, tùy chỉnh cách trình bày, tự động hóa tác vụ điều hành quản lý hệ thống Drupal có cấu trúc lập trình tinh vi, dựa đó, hầu hết tác vụ phức tạp giải với đoạn mã viết, chí khơng cần Đôi khi, Drupal gọi "Framework cho ứng dụng Web" kiến trúc thơng minh uyển chuyển Drupal chạy nhiều mơi trường khác nhau, bao gồm Windows, Mac OS X, Linux, FreeBSD, OpenBSD môi trường hỗ trợ máy phục vụ web Apache (phiên 1.3+) IIS (phiên 5+) có hỗ trợ ngơn ngữ PHP (phiên 4.3.3+) Drupal kết nối với sở liệu MySQL PostgreSQL để lưu nội dung thiết lập Hình 1.1 Các dịch vụ sử dụng Drupal 1.2 Kiến trúc Drupal Nói cách ngắn gọn Drupal hệ quản trị nội dung viết ngôn ngữ PHP sử dụng sở liệu quan hệ để lưu trữ (thông thường MySQL) Mặc dù Drupal viết PHP lại không sử dụng hướng đối tượng mà sử dụng kiểu lập trình thủ tục truyền thống Một số lý Drupal đời PHP chưa hỗ trợ mạnh hướng đối tượng Tuy nhiên, nhìn cách tổng quát LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Drupal áp dụng nguyên lý lập trình hướng đối tượng: tính đóng gói, kế thừa, đa hình Kiến trúc Drupal mơ tả biểu đồ đây: Hình 1.2 Kiến trúc Drupal Ở trung tâm kiến trúc phần nhân gồm tập file chứa đoạn mã nạp chương trình thư viện quan trọng Thư viện nhân Drupal đóng vai trị lớp kết nối modules Phần cung cấp dịch vụ kết nối quản lý sở liệu, quản lý khung hook, thư viện trừu tượng phục vụ mail hình ảnh, hỗ trợ Unicode Mặc dù thư viện cung cấp tính quan trọng sức mạnh thực Drupal nằm kiến trúc kiểu module 1.2.1 Kiến trúc module Module gồm mã PHP file hỗ trợ sử dụng API kiến trúc Drupal tích hợp thành phần vào framework Drupal Cơ chế module Drupal thiết kế để cung cấp cách thức đồng giúp người phát triển mở rộng khả hệ thống Những file tạo nên module gộp vào ví trí định cấu trúc thư mục Drupal Khi Drupal cần thông tin module đó, tìm thư mục Mỗi module nằm thư mục riêng có file - file cung cấp thông tin module hay nhiều file khác chứa mã PHP thực chức LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Hình 2.8.1 Quá trình thao tác với CSDL Một đoạn mã bên ngồi muốn truy cập vào CSDL Drupal phải gọi include_once(‘includes/bootstrap.inc’) sau gọi drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE) để tạo kết nối, sau thực truy vấn hàm db_query() 2.8.2 Một số truy vấn đơn giản Drupal cung cấp hàm db_query() để thực thi truy vấn tới kết nối hoạt động Những truy vấn hỗ trợ bao gồm SELECT, INSERT, UPDATE DELETE Dưới số ví dụ Lấy tất hàng trường từ bảng joke có vid số nguyên, có giá trị $node->vid: 37 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com db_query('SELECT * FROM {joke} WHERE vid = %d', $node->vid); Chèn hàng vào bảng joke Hàng chứa giá trị nguyên xâu ký tự: db_query("INSERT INTO {joke} (nid, vid, punchline) VALUES (%d, %d, '%s')",$node->nid, $node->vid, $node->punchline); Cập nhật tất hàng bảng joke có trường vid số nguyên có giá trị $node->vid Các hàng thoả mãn điều kiện thay đổi cách đặt trường punchline giá trị xâu chứa $node->punchline: db_query("UPDATE {joke} SET punchline $node->punchline,$node->vid); Xố hàng bảng joke có cột nid = '%s' WHERE vid = chứa giá trị nguyên với %d", $node- >nid: db_query('DELETE FROM {joke} WHERE nid = %d', $node->nid); Drupal đặt số quy tắc cú pháp phát biểu SQL Đầu tiên, tên bảng phải đặt dấu {} Quy ước cho phép người dùng bị giới hạn số lượng CSDL tạo cài đặt Drupal CSDL có sẵn mà không bị xung đột Tiếp theo cờ giữ chỗ truy vấn Ở ví dụ trên, giá trị $node->nid %d tự động thay tương ứng Dưới bảng ký hiệu giữ chỗ kiểu liệu thay thế: Hình 2.8.2 Bảng ký hiệu giữ chỗ truy vấn CSDL 2.8.3 Lấy kết truy vấn Có nhiều cách khác để lấy kết truy vấn Lấy giá trị: Nếu muốn kết trả giá trị sử dụng hàm db_result() 38 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com $sql = "SELECT COUNT(*) FROM {node} WHERE type = 'blog' AND 1"; status = $total = db_result(db_query($sql)); Trả nhiều hàng: Với kết tập gồm nhiều hàm, hàm db_fetch_object() giúp chọn hàng để xử lý $sql = "SELECT * FROM {node} WHERE type = 'blog' AND status = 1"; $result = db_query(db_rewrite_sql($sql)); while ($data = db_fetch_object($result)) { //code goes here } Để nhận kết mảng, sử dụng hàm db_fetch_array() thay cho db_fetch_object() Giới hạn phạm vi kết quả: Với truy vấn cho nhiều hàng, giới hạn phạm số lượng sau: $sql = "SELECT * FROM {node} n WHERE type = 'blog' AND status = ORDER BY n.created DESC"; $result = db_query_range(db_rewrite_sql($sql), 0, 10); Trong trường hợp này, hàm LIMIT db_query_range() sử dụng thay cho điều kiện khơng phải tất CSDL hỗ trợ cú pháp LIMIT 39 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Chương 3: Xây dựng module tích hợp Google Maps vào Drupal Với lý thuyết nêu phần khố luận, chúng tơi ứng dụng vào thực tế cách xây dựng module cho Drupal Module có tên Google Maps, có chức hiển thị đồ trang web Trước hết, giới thiệu sơ lược dịch vụ Google Maps 3.1 Giới thiệu Google Maps Google Maps (trước gọi Google Local) ứng dụng dịch vụ đồ web công nghệ miễn phí cung cấp Google, dùng để nhúng vào trang web bên thứ ba thơng qua Google Maps API Nó cho phép hiển thị đồ đường xá, đường cho xe đạp, cho người xe hơi, địa điểm kinh doanh khu vực khắp nơi giới (Theo wikipedia.org) Địa thức Google Maps: http://maps.google.com Google Maps cung cấp cách thể đồ khác gồm có đồ ranh giới, đồ vệ tinh đồ dạng chiều Giao diện chương trình thân thiện với người dùng 3.2 Nhúng đồ vào trang web Việc nhúng đồ vào trang web thực Google Maps API Người dùng khơng cần phải tìm kiếm quản lý liệu hay thiết lập máy chủ mà cần viết đoạn mã JavaScript Với người phát triển, Google cung cấp khoá API riêng Khoá đăng ký miễn phí http://code.google.com/apis/maps/signup.html Mỗi muốn nhúng đồ Google vào trang web, thẻ phải khai báo chèn file JavaScript: Trong đó, xyz thay khố API Lúc này, trang web sử dụng hàm đối tượng cung cấp API Google Maps 40 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 3.2.1 Tạo đồ đơn giản Thông thường, việc nhúng đồ trang web thực cách sử dụng thẻ giữ chỗ dùng JavaScript hiển thị đồ vào vị trí Ví dụ: var map = new GMap2(document.getElementById("map")); //zoom levels 0-17+, == world map.setCenter(new GLatLng(39.754286, -104.994637), 16); Ví dụ cho kết sau: Hình 3.2.1 Minh họa trang web tích hợp đồ Google Maps Phần đồ hiển thị gán vào đối tượng map dựa vào toạ độ điểm trung tâm Tài liệu chi tiết dịch vụ Google Maps API tính cao cấp tham khảo địa chỉ: http://code.google.com/apis/maps/documentation 41 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 3.2.2 Dịch vụ Geocoder - Chuyển đổi địa toạ độ Google Maps API cung cấp dịch vụ hữu ích Geocoder, giúp xác định toạ độ tương đối biết địa trên giới ngược lại Toạ độ phân tích gồm Kinh độ (longitude) Vĩ độ (latitude) Từ đó, tạo đối tượng điểm hiển thị lên đồ 3.3 Xây dựng module Google Maps cho Drupal Module mà xây dựng có chức hiển thị đồ số khối viết dạng Blog Mỗi viết tương ứng với mảnh đồ riêng dựa vào thơng tin địa chứa Trong quá trình xây dựng module này, chúng đã sử dụng lại module cộng đồng Drupal phát triển là module Content có gói CCK (Content Construction Kit) [5] và module Example fields [6] Module Content cho phép người quản trị tạo các kiểu nội dung mới Module Example fields được dùng để thêm các trường thông tin cho bài viết Cả hai module phấn phối miễn phí Ý tưởng xây dựng module: • Lấy node id viết • Truy vấn CSDL để lấy trường thơng tin thêm vào • Sử dụng giá trị ẩn form truyền liệu vào JavaScript • Tạo đối tượng đồ GMap2 hiển thị vào thẻ khai báo • Tạo đối tượng chuyển đổi địa sang tọa độ GClientGeocoder • Truyền tọa độ nhận vào hàm tạo điểm đồ • Hiển thị đồ cách đặt điểm vừa tạo làm trung tâm • Sử dụng chức đánh dấu địa điểm marker để thích điểm đồ Phần mơ tả đoạn mã mà tác giả khóa luận viết trình xây dựng module 3.3.1 Module Google Maps 3.3.1.1 File info Nội dung file info gồm có: ;$Id$ 42 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com name = "Google Maps" description = "Displays a Google Maps form in a block" core = 6.x php = 5.1 dependencies[] = content Khai báo dependencies cho biết module Google Maps phụ thuộc vào module Content Muốn module hoạt động người quản trị phải bật module Content gói CCK 3.3.1.2 File module File triển khai hook_block() có sẵn Drupal để hiển thị đồ khối function googlemaps_block($op='list', $delta=0, $edit=array()) { return $block; } Giá trị trả hàm mảng $block chứa tiêu đề (subject) nội dung (content) khối Để hiển thị đồ khối này, gán giá trị cho $block[‘content’] thẻ có ID map_canvas để xác định vị trí đặt đồ $block['content'] = "" $hAddr $hTitle $hInfo; Khi JavaScript tìm kiếm thành phần HTML thơng qua ID thay nội dung: var map = new GMap2(document.getElementById("map_canvas")); Để đồ hiển thị viết, module thực q trình phân tích kiểm tra địa URL trang Nếu địa có chứa node/x đoạn mã hiển thị đồ thực thi 3.3.1.3 Tạo thêm trường thông tin cho viết Để hiển thị mảnh đồ khác cho viết, sử dụng xây dựng nội dung CCK để thêm trường thông tin address vào kiểu nội dung Blog Thực tạo mục có dạng Blog entry xuất thêm trường hình: 43 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Hình 3.3.1.3.a Giao diện tạo Block entry Giá trị lưu CSDL lấy thông qua node ID $nid = (arg(0)=='node' && is_numeric(arg(1)))?arg(1):0; $sql = "SELECT field_addr_value FROM content_type_blog WHERE = $nid"; nid Khi lấy giá trị trường này, module truyền qua JavaScript sử dụng dịch vụ Geocoder Google Maps API để phân tích tọa độ hiển thị khung đồ 44 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Hình 3.3.1.3.b Giao diện viết với Block hiển thị đồ 45 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Kết luận Trong khố luận này, chúng tơi tìm hiểu trình bày số vấn đề lý thuyết liên quan đến việc xây dựng module cho hệ quản trị nội dung Drupal Dựa vào đó, chúng tơi thiết kế thành công module dùng để nhúng đồ từ Google Maps vào mỗi bài viết kết hợp với hai module miễn phí CCK [5] Example fields [6] Tuy nhiên, bước đầu kế hoạch xây dựng hệ thống tích hợp dịch vụ hướng vị trí vào website cách hồn thiện, đầy đủ tính Sau hồn thành khố luận, chúng tơi có ý định tiếp tục nghiên cứu phát triển module trình bày thêm tính nâng cao kết hợp với sở liệu ảnh chụp để để hiển thị đường phố, phong cảnh hay sử dụng hình ảnh chiều tạo không gian ảo cho địa điểm, địa danh Chúng tơi hy vọng khố luận đúc kết lượng kiến thức đủ để phục vụ cho việc tìm hiểu Drupal xây dựng module cách dễ dàng 46 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Tài liệu tham khảo [1] David Mercer Building powerful and robust websites with Drupal PACKT Publishing, 2008 [2] John K VanDyk Matt Westgate Pro Drupal Development Apress, 2007 [3] Matt Butcher Learning Drupal Module Development PACKT Publishing, 2008 [4] Scott Davis Google Maps API v2 - Adding Where to your applications The Pragmatic Bookshelf, 2006 [5] Module CCK, Drupal Community, http://drupal.org/project/cck [6] Module Example, Karen Stevenson, http://www.lullabot.com/articles/creatingcustom-cck-fields [7] Google Maps API Documentation, http://code.google.com/apis/maps/documentation Google Inc, 47 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Phụ lục A A.1 Cài đặt module Google Maps Bước 1: Copy thư mục googlemaps vào thư mục modules cài đặt Drupal Bước 2: Bật module liên quan gồm Content, Example fields Google Maps trang quản trị Hình A.1.a Bật module trang quản trị Bước 3: Thêm trường thông tin Địa cho loại nội dung Blog entry Vào Administer | Content management | Content types Trong mục Blog entry chọn manage fields Thêm trường với thông tin sau: • Label: Địa • Field name: field_addr 48 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com • Type of data to store: Example field • Form element to edit the data: Example widget Sau thêm trường vào, cấu trúc Blog entry có trường sau: Hình A.1.b Các trường thơng tin Blog entry Đến đây, module sẵn sàng để sử dụng 49 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com A.2 Chạy thử chương trình Mơi trường mà chúng tơi dùng để chạy thử module viết sau: • Hệ điều hành: Windows Ultimate • Server: localhost • Web server: Apache • SQL server: MySQL • Trình duyệt: Mozilla Firefox 3.6.3 Tạo Blog entry sau: Hình A.2.a Tạo Blog entry để chạy thử chương trình Những thơng số lại giữ nguyên Nhấn Save Kết nhận viết với đồ hình 50 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Hình A.2.b Kết chạy thử chương trình 51 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com ... quan Drupal 1.1 Giới thiệu Drupal Drupal framework dùng cho phát triển phần mềm hướng module, hệ thống quản trị nội dung miễn phí mã nguồn mở Cũng giống hệ thống quản trị nội dung đại khác, Drupal. .. ngữ PHP (phiên 4.3.3+) Drupal kết nối với sở liệu MySQL PostgreSQL để lưu nội dung thiết lập Hình 1.1 Các dịch vụ sử dụng Drupal 1.2 Kiến trúc Drupal Nói cách ngắn gọn Drupal hệ quản trị nội... 1.6 Công cụ dành cho người phát triển Drupal đưa số công cụ đặc thù dành cho người phát triển module Drupal Những công cụ cung cấp module chủ yếu, lấy từ trang web Drupal, module Devel module

Ngày đăng: 01/11/2022, 19:36

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w