Khung công tác PHP, Phần 4: Hỗ trợ Ajax Các khung công tác Zend, CakePHP và symfony xử lý mã nguyên sinh và các thư viện của bên thứ ba như thế nào. Duane O'Brien Phát triển PHP, Java 自由职业者 07 08 2009 Lời chỉ trích phổ biến đối với các phiên bản ban đầu của khung công tác PHP là chúng không hỗ trợ các kiến trúc theo phong cách Model-View-Controller (MVC). Ngày nay, các nhà phát triển có thể chọn từ nhiều khung công tác PHP. Loạt bài viết "Khung công tác PHP" này sẽ xem xét ba khung công tác PHP được sử dụng rộng rãi — Zend, symfony và CakePHP — khảo sát sự tương đồng và khác biệt giữa chúng khi ta xây dựng và mở rộng một ví dụ ứng dụng trong mỗi khung trong ba khung công tác đó. Phần 1 phác ra phạm vi đề cập và giải quyết xong các yêu cầu cần có trước của loạt bài đăng này. Trong Phần 2, bạn xây dựng các ứng dụng mẫu trong mỗi khung công tác. Tại Phần 3, bạn sẽ mở rộng ứng dụng và xem xét các trường hợp ngoại lệ bất quy tắc. Ở đây, ta hãy xem Ajax được hỗ trợ như thế nào trong mỗi khung công tác. Xem thêm bài trong loạt bài này Về loạt bài viết này Loạt bài này được viết dành cho các nhà phát triển PHP, những người muốn bắt đầu sử dụng một khung công tác, nhưng chưa khảo sát chi tiết các khung công tác có sẵn. Loạt bài này sẽ xem xét tại sao ba khung công tác đang nói đến lại được lựa chọn, làm thế nào để cài đặt các khung công tác đó và bạn sẽ xử lý tốt các ứng dụng kiểm thử mà bạn sẽ mở rộng trong mỗi khung công tác. Có vẻ bạn sẽ có nhiều việc phải làm, nhưng bạn đừng lo — chúng tôi chia nhỏ chúng thành các phần dễ sử dụng. Phần 1 của loạt bài này trình bày phạm vi của bài viết, giới thiệu các khung công tác sẽ được nghiên cứu, trình bày cách cài đặt chúng và phác ra ứng dụng thử nghiệm đầu tiên mà bạn sẽ xây dựng. (Phù!) Phần 2 hướng dẫn bạn cách xây dựng ứng dụng mẫu tại mỗi khung công tác, nêu bật sự tương đồng và những sự khác biệt của chúng. © Copyright IBM Corporation 2009 Khung công tác PHP, Phần 4: Hỗ trợ Ajax Nhẫn hiệu đăng ký Trang 1 của 12 developerWorks® ibm.com/developerWorks/vn/ Phần 3 bắt đầu với việc mở rộng ứng dụng thử nghiệm, sau đó xử lý các ngoại lệ bất quy tắc. Tất cả các khung công tác làm việc tốt khi chúng thực hiện những công việc mà chúng đã được thiết kế để làm. Nhưng phải làm một việc gì đó mà khung công tác không được xây dựng để làm việc này cũng là điều thường xảy ra trong mọi dự án. Bài viết này xem xét các trường hợp như vậy. Part 4 tập trung chủ yếu vào hỗ trợ Ajax. Việc sử dụng Ajax, bằng cách sử dụng các mã bản ngữ và các thư viện của bên thứ ba, sẽ được khảo sát — cụ thể là cách mỗi khung công tác hành xử và chấp nhận các thư viện phổ biến cụ thể như thế nào. Phần 5 đề cập đến đến các công việc bên ngoài khung công tác. Một tác vụ duy nhất được xác định (tập kịch bản lệnh cập nhật hàng đêm) và quá trình hoàn thành tác vụ này được khảo sát tại mỗi khung công tác. Về bài viết này Bài viết này xem xét việc mỗi khung công tác hỗ trợ Ajax như thế nào. Chúng ta mở rộng Blahg để bổ xung việc xếp hạng thô sơ các bài đã đăng bằng cách sử dụng hỗ trợ Ajax của mỗi khung công tác, để cho chúng ta có một số trải nghiệm thực tế. Bạn cần phải đọc xong các Phần 1, Phần 2 và Phần 3, các phần này nói về cách cài đặt, các điều kiện cần có trước, việc xây dựng các ứng dụng ban đầu và việc mở rộng nó trong mỗi khung công tác. Nếu bạn chưa đọc các phần đó, bạn nên làm ngay bây giờ. Ajax trong khung công tác Zend Khung công tác Zend không có bất kỳ hình thức hỗ trợ Ajax đã tích hợp nào tại thời điểm này. Có một số thư viện trong khung công tác Zend có thể được sử dụng khi thêm Ajax vào ứng dụng của bạn, chẳng hạn như Zend_Json và Zend_XmlRpc. Ngoài ra còn có một số thư viện trong khung công tác Zend có thể trợ giúp cho việc tận dụng lợi thế của các API web hiện có cho các ứng dụng phổ biến, ví dụ như Flickr. Nhưng nếu bạn muốn thêm một số Ajax vào ứng dụng của bạn trong khung công tác Zend, bạn phải tự làm điều đó. Tin xấu là bạn cần phải viết thêm mã để đạt được điều mà bạn muốn.Tin tốt là, do nó không tích hợp với một thư viện liên quan đến Ajax cụ thể nào, bạn có thể chọn thư viện ưa thích của mình (hoặc không chọn thư viện nào cả) và xây dựng các chức năng Ajax bằng bất cứ cách nào mà bạn thấy phù hợp. Ajax trong khung công tác symfony Khung công tác symfony được phân phối kèm với Prototype và các thư viện script.aculo.us. Trong Phần 2, khi chúng ta khởi tạo dự án và sao chép nội dung của thư mục Web vào thư mục /column/ protected/symfony, chúng ta đã di chuyển một bản sao của các thư viện này vào một nơi mà chúng có thể được sử dụng trong ứng dụng. (Bạn nên kiểm tra lại; các thư viện đó phải ở trong thư mục / column/htdocs/symfony/sf/prototype/js/ directory.) Bằng cách cung cấp tích hợp với Prototype, symfony có thể cung cấp một số trình trợ giúp để giảm bớt số lượng mã cần phải viết để đưa một số Ajax vào Blahg. Nhưng có một mặt trái của sự việc, đó là: Nếu bạn muốn sử dụng cái gì đó ngoài Prototype, bạn sẽ phải tự làm điều đó. Khung công tác PHP, Phần 4: Hỗ trợ Ajax Trang 2 của 12 ibm.com/developerWorks/vn/ developerWorks® Ajax trong khung công tác CakePHP Khung công tác CakePHP cung cấp tích hợp cho Prototype và các thư viện script.aculo.us. Chúng ta cần phải tải về bất kỳ thư viện nào mà chúng ta muốn sử dụng (bạn đặt các thư viện này vào thư mục /column/htdocs/cakephp/js). Chúng ta thực sự chỉ cần thư viện Prototype để có thể sử dụng trình trợ giúp Ajax. Thư viện script.aculo.us là để làm cho mọi thứ trở nên ưa nhìn. Cũng giống như symfony, bằng cách cung cấp tích hợp với Prototype, khung công tác CakePHP đã làm cuộc sống trở nên dễ dàng hơn một chút khi xây dựng các chức năng Ajax của Blahg. Tuy nhiên, mặt trái của vấn đề vẫn như vậy: Nếu bạn muốn sử dụng cái gì đó ngoài Prototype, bạn phải tự làm điều đó. Các trình trợ giúp của Ajax sẽ không giúp đỡ được gì. Lưu ý: Nếu thư viện ưa thích của bạn là JQuery, thì bạn hãy sử dụng các trình trợ giúp Javascript của CakePHP. Điều này có thể dẫn đến một số mã đẹp, thú vị, nếu ta thực hiện đúng, nhưng chủ đề này nằm ngoài phạm vi của bài viết này. Thiết lập cơ sở dữ liệu Bắt đầu bằng cách tạo ra một bảng để chứa các xếp hạng. Bạn hãy sử dụng cùng một SQL để tạo bảng này trong mỗi một trong ba cơ sở dữ liệu LIệt kê 1. Tạo một bảng để chứa các xếp hạng CREATE TABLE 'ranks' ( 'id' INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , 'post_id' INT( 10 ) NOT NULL , 'rank' INT( 10 ) NOT NULL ) ENGINE = MYISAM ; Lưu ý: Chúng ta không cần phải có cả một bảng để chỉ chứa các xếp hạng của các bài gửi đăng. Chúng ta có thể chỉ cần tạo thêm một cột rank trong bảng posts, nếu chúng ta thay đổi, các cột bị thay đổi sẽ được cập nhật. Chúng ta không muốn các dữ liệu bài gửi đăng bị sửa đổi mỗi khi có ai đó xếp hạng một bài đăng, và như Blahg đã được thiết kế, cả MySQL lẫn khung công tác sẽ làm chính thao tác này. Bên cạnh đó, nếu chúng ta muốn làm thêm một số thứ với việc xếp hạng, chẳng hạn lưu lại số đếm bao nhiêu lần xếp hạng được gửi lên hay lần cuối cùng một bài đã đăng được xếp hạng là khi nào thì việc tạo một bảng riêng cho các xếp hạng trở nên bắt đầu có ý nghĩa Thêm xếp hạng các bài đã đăng vào Blahg tại khung công tác Zend Chúng ta cần phải quyết định sử dụng cái gì để xử lý các yêu cầu Ajax. Chúng ta có thể sử dụng giải pháp của chúng ta mà không gặp nhiều khó khăn, nhưng vì mục tiêu của bài viết này, mỗi khung công tác sẽ sử dụng thư viện Prototype (xem phần Tài nguyên). Chúng ta cần phải tạo ra một thư mục để chứa thư viện này – một thư mục có thể được truy cập qua trình duyệt, chẳng hạn như thư mục /column/htdocs/zend/scripts/ (đây cũng là thư mục được sử dụng trong kho lưu trữ mã). Chúng ta cần phải tạo ra một mô hình xếp hạng cơ bản có tên là là Ranks.php. Nó phải là một vỏ của mô hình như chúng ta đã làm cho bài gửi đăng và các lời bình luận. Và dĩ nhiên, chúng ta phải tạo ra trình điều khiển xếp hạng. Chúng ta sẽ không tạo ra bất kỳ khung nhìn nào cho nó — trình điều khiển sẽ chỉ lặp lại các kết quả của bất kỳ yêu cầu xếp hạng nào. Chúng ta cần có hai hành Khung công tác PHP, Phần 4: Hỗ trợ Ajax Trang 3 của 12 developerWorks® ibm.com/developerWorks/vn/ động: hành động readAction sẽ tìm xếp hạng của bài đã đăng, và hành động writeAction sẽ lấy một đệ trình xếp hạng và kiểm tra xem có hay không một hàng trong bảng ứng với bài đã đăng đó. Nếu có hàng đó rồi thì hàng đó sẽ được cập nhật với một giá trị mới; nếu chưa có, một hàng mới sẽ được chèn vào. Dù bằng cách nào đi nữa, hàng mới sẽ được xuất ra, do đó chúng ta có thể cập nhật xếp hạng trong khung nhìn. Tất cả những điều này khá đơn giản và có thể được tìm thấy trong kho lưu trữ mã. Bây giờ chúng ta cần phải đưa một số Ajax vào khung nhìn. Hãy nhớ rằng chúng ta sẽ không thêm bất cứ khung nhìn nào đặc thù cho xếp hạng ở đây. Nhưng chúng ta sẽ cần phải sửa đổi khung nhìn đọc các bài đăng, nhập thêm mã Ajax vào. Bạn mở tập tin / column/protected/zend/views/scripts/post/read.php. Đây là nơi mà chúng ta sẽ làm tất cả các công việc của mình. Đối với trình khởi động, chúng ta cần phải nhập thư viện Prototype ngay từ dòng đầu tiên: <script type="text/javascript" src="/zend/scripts/prototype.js"></script>. Trước khi chúng ta viết bất kỳ mã JavaScript nào, ta hãy thêm sẵn trước một số phần tử khác mà chúng ta cần. Chúng ta cần thứ gì đó để hiển thị xếp hạng hiện tại. Trong phần tử xếp hạng đó, chúng ta muốn có một thẻ span với một ID để có thể cập nhật các giá trị của xếp hạng khi có yêu cầu. Có thể thêm như sau, bên dưới nội dung bài đăng: <h4>Rank: <span id="rank"></span></ h4>. Tiếp theo, chúng ta cần một cặp nút (các liên kết cũng được) mà người sử dụng có thể nhấp vào để cho biết rằng họ thích hoặc không thích một bài đăng. Ta hãy cung cấp cho chúng những các tên thông minh và độc đáo. Bạn cần thêm các dòng mã sau bên trong phần tử rank: <input type='button' onclick='rankUp();' value='Hot' /> or <input type='button' onclick='rankDown()' value='Not' />. Để làm cho trường đầu vào ẩn post_id sẵn sàng hơn cho Prototype sử dụng, bạn hãy gán cho trường này một ID của post_id. Và cuối cùng, bạn thêm sự kiện onLoad vào phần tử body để lấy được xếp hạng hiện tại: <body onload='fetchRank();'>. Không đáng ngạc nhiên khi chúng ta cần phải viết ba hàm JavaScript: rankUp, rankDown và fetchRank. Các hàm này sẽ thực hiện các yêu cầu Ajax thực tế. Chúng khá đơn giản và trông cũng gần giống như trong các khung công tác khác. Ta hãy đặt các hàm này trong đoạn <script> thuộc phần tiêu đê. Liệt kê 2. Ba hàm JavaScript function fetchRank() { var ajax = new Ajax.Request( '/zend/rank/read', { method : 'get', parameters : {'post_id' : $('post_id').value}, onComplete: parseRank } ); } function rankUp() { var ajax = new Ajax.Request( '/zend/rank/write', Khung công tác PHP, Phần 4: Hỗ trợ Ajax Trang 4 của 12 ibm.com/developerWorks/vn/ developerWorks® { method : 'get', parameters : {'post_id' : $('post_id').value, 'rank' : '1'}, onComplete: parseRank } ); } function rankDown() { var ajax = new Ajax.Request( '/zend/rank/write', { method : 'get', parameters : {'post_id' : $('post_id').value, 'rank' : '-1'}, onComplete: parseRank } ); } Bạn sẽ nhận thấy rằng mỗi hàm gọi hàm parseRank khi hoàn thành. Hàm parseRank này chỉ đơn giản lấy bất cứ cái gì là đáp ứng của một yêu cầu Ajax và đặt nó vào trong thẻ span của xếp hạng mà bạn tạo ra trước đó. Liệt kê 3. Gọi hàm parseRank function parseRank(trans) { $('rank').innerHTML = trans.responseText; } Khi chúng ta thực hiện tất cả những thay đổi này hoặc nhập khẩu chúng từ kho lưu trữ mã, chúng ta sẽ có thể đọc một bài đăng trong Blahg và xếp hạng cho bài đăng đó. Thậm chí bạn có thể gian dối, xếp hạng bài đăng rất nhiều lần. Vậy đó là cách mà chúng ta có thể làm trong khung công tác Zend. Nhưng chúng ta sẽ làm điều tương tự như thế nào trong khung công tác symfony? Lưu ý: Có thể sẽ hay hơn nếu ta thực hiện các thao tác với tệp Ajax.Updater hơn là với tệp Ajax.Request. Bạn hãy thử làm bằng cách tái cấu trúc mã nguồn (refactoring), nếu bạn mới làm quen với Ajax. Thêm các xếp hạng bài đăng vào Blahg trong khung công tác symfony Để thêm các xếp hạng bài đăng trong khung công tác symfony, ta hãy bắt đầu tại tệp tin schema.yml (tệp tin này phải nằm tại thư mục /column/protected/sf_column/config) và định nghĩa bảng ranks. Liệt kê 4. Thêm các xếp hạng bài đăng trong symfony ranks : _attributes: {phpName: Rank } id: post_id: rank: integer Hãy nhớ lại: Thụt lùi đầu dòng hai ký tự khoảng trống đối với các xếp hạng và bốn ký tự khoảng trống đối với định nghĩa trường. Khung công tác PHP, Phần 4: Hỗ trợ Ajax Trang 5 của 12 developerWorks® ibm.com/developerWorks/vn/ Tiếp theo ta sẽ làm gì? Là xây dựng mô hình propel và làm sạch bộ nhớ cache. Hãy nhớ lại dòng lệnh của symfony tại thư mục /column/protected /sf_column (đây là thư mục gốc của ứng dụng của bạn). Liệt kê 5. Xây dựng mô hình propel và làm sạch bộ nhớ cache php /column/src/symfony/data/bin/symfony propel-build-model php /column/src/symfony/data/bin/symfony clear-cache Khi chúng ta chạy những dòng lệnh này, chúng ta sẽ thấy các tệp tin Rank.php và RankPeer.php tại thư mục /column/protected/sf_column /lib/model. Bây giờ bạn tiếp tục và khởi tởo mô-đun ranks: php /column/src/symfony/data/bin/symfony init-module blahg rank. Lớp các hành động xếp hạng (/column/protected/sf_column/apps/blahg/modules/rank/actions/ actions.class.php) sẽ chứa hai hành động: executeRead và executeWrite. Khi xếp hạng được đọc hoặc được cập nhật, chúng ta xuất in ra xếp hạng, gọi hàm exit khi kết thúc mỗi hành động (điều này sẽ ngăn không cho symfony tìm kiếm các các khuôn mẫu khung nhìn kết hợp kèm theo mà chúng ta không cần phải xây dựng.) Hãy xem các hành động đã được viết như thế nào tại kho lưu trữ mã. Cuối cùng chúng ta cần phải cập nhật khuôn mẫu readSuccess của post (/column/protected/ sf_column/apps/blahg/modules /post/templates/readSuccess.php) để sử dụng trình trợ giúp JavaScript của symfony và bao gồm thêm một số liên kết Ajax. Bạn hãy bắt đầu bằng cách thêm dòng lệnh này vào đỉnh đầu của tệp tin: <?php use_helper('Javascript') ?>. Dòng lệnh này sẽ bao gồm thêm thư viện Prototype và cung cấp cho chúng ta khả năng truy cập vào một loạt các trình trợ giúp Ajax. Chúng ta có thể sử dụng một trình trợ giúp để tạo ra lệnh gọi để nạp xếp hạng ban đầu và một vài liên kết để đệ trình các xếp hạng. Bạn đừng quên là phải thêm một thẻ span để hiển thị xếp hạng hiện tại. Liệt kê 6. Tạo một lệnh gọi để nạp xếp hạng ban đầu <h4>Rank: <span id="rank"></span></h4> <?php echo javascript_tag(remote_function(array('update' => 'rank', 'url' => 'rank/read?post_id=' . $id))) ?> <?php echo link_to_remote('Hot', array('update' => 'rank', 'url' => 'rank/write?post_id=' . $id . '&rank=1')) ?> or <?php echo link_to_remote('Not', array('update' => 'rank', 'url' => 'rank/write?post_id=' . $id . '&rank=-1')) ?> Đây là tất cả những gì mà chúng ta cần phải làm. Hay nói theo cách khác, chúng ta thực sự không cần phải viết bất kỳ mã JavaScript nào. Các trình trợ giúp của khung công tác symfony đã làm các điều đó cho chúng ta. Bạn không tin tôi ư? Bạn hãy làm mọi thứ (hoặc cài đặt các mã từ kho lưu trữ mã) và đọc một bài đăng tại phiên bản symfony của Blahg. Sau đó bạn xem mã nguồn. Bạn có nhớ rằng là mình đã viết bất kỳ mã JavaScript nào không? Thêm các xếp hạng bài đăng trong khung công tác CakePHP Trước khi bạn bắt đầu thêm việc xếp hạng các bài đăng vào phiên bản CakePHP của Blahg, bạn phải tải về Prototype và đặt nó vào thư mục /column/htdocs/cakephp/js. Bạn cần phải sửa đổi khuôn mẫu trình bày mặc định để đưa thư viện Prototype vào phần tiêu đề. Đó là tệp tin Default.ctp trong Khung công tác PHP, Phần 4: Hỗ trợ Ajax Trang 6 của 12 ibm.com/developerWorks/vn/ developerWorks® thư mục /column/protected/cakephp/app/views/layouts/. Bạn thêm dòng lệnh sau vào tiêu đê: <? php echo $javascript->link('prototype') ?>. Trước khi bạn có thể sử dụng nó, bạn cần phải tạo ra tệp tin AppController cơ bản bao gồm các trình trợ giúp JavaScript và Ajax mà bạn sẽ cần sau này. Hãy tạo tệp tin app_controller.php tại thư mục /column/protected/cakephp/app. Tệp tin này giống như liệt kê 7. Liệt kê 7. Tạo tệp tin app_controller.php <?php class AppController extends Controller { var $helpers = array('Html', 'Form', 'Javascript', 'Ajax'); } ?> Lưu ý : Về mặt kỹ thuật, điều này không đúng. Chúng ta có thể sử dụng ngay những trình trợ giúp này trong các trình điều khiển gửi lên và trình điều khiển xếp hạng, nhưng việc tạo ra trình điều khiển ứng dụng cơ bản AppController cho phép chúng ta sử dụng chúng trong bất kỳ trình điều khiển nào mà không cần phải thêm chúng vào danh sách các trình trợ giúp. Đây là cách đúng đắn để chất tải công việc cho đối tượng AppController cơ sở. Bây giờ chúng ta cần phải tạo ra một mô hình xếp hạng và trình điều khiển xếp hạng cơ bản. Các mô hình và trình điều khiển này ít nhiều trông giống các mô hình và trình điều khiển mà chúng ta đã xây dựng. Khi chúng ta tạo ra mô hình xếp hạng, chúng ta phải thiết lập các quan hệ kết hợp mô hình giữa các mô hình xếp hạng và mô hình gửi lên. Không thực sự cần phải thêm quan hệ kết hợp mô hình đến mô hình xếp hạng, trừ khi sau này chúng ta quyết định thêm các chức năng xếp hạng mạnh hơn. Tại kho lưu trữ mã, cả hai loại quan hệ kết hợp này đã được thiết lập vì vấn đề hình thức. Trong trình điều khiển xếp hạng, chúng ta muốn có một vài điều mới để giúp giữ cho chúng ta lành mạnh đúng mức. Chúng ta muốn thêm việc sử dụng thành phần RequestHandler và thêm hàm beforeFilter. Tại hàm beforeFilter chúng ta kiểm tra thành phần RequestHandler và nếu yêu cầu là thông qua Ajax, ta hãy tắt các mã gỡ lỗi. Trừ điều này ra, trình điều khiển trông giống như cái mà bạn mong đợi lúc này. Hai phương thức, đọc và viết, tìm kiếm một post_id và xuất ra xếp hạng. Lưu ý: Mã của trình điều khiển trong kho lưu trữ mã đơn giản chỉ trả về xếp hạng, nhưng nếu chúng ta đã tạo ra các lệnh Ajax phức tạp hơn, thì chúng ta có thể tạo ra một khuôn mẫu (chẳng hạn như tệp views/ranks/viewrank.ctp) và biểu hiện khung nhìn bằng cách sử dụng $this>render('viewrank', 'ajax');. Nhưng vì tất cả những gì mà chúng ta cần là xếp hạng hiện tại, thì điều đó là quá thừa. Bây giờ tất cả những gì mà chúng ta cần làm là thêm hiệu ứng bằng thẻ span cho xếp hạng và một vài liên kết Ajax tới khung nhìn đọc các bài đăng, và như thế là xong. Liệt kê 8. Thêm phần tử span cho xếp hạng <h4>Rank: <span id="rank"><?php echo (int) $post['Rank']['rank'] ?></span></h4> <?php echo $ajax->link('Hot', '/ranks/write/' . $post['Post']['id'] . '/1', array ('update' => 'rank')); ?> or <?php echo $ajax->link('Not', '/ranks/write/' . $post['Post']['id'] . '/-1', array ('update' => 'rank')); ?> Khung công tác PHP, Phần 4: Hỗ trợ Ajax Trang 7 của 12 developerWorks® ibm.com/developerWorks/vn/ Cái mà các liên kết Ajax này làm về cơ bản là "gọi địa chỉ URL thông qua Ajax và cập nhật phần tử rank (xếp hạng) trong mô hình tài liệu (DOM) bằng bất cứ cái gì nhận được" (Thật hay là chúng ta đã tắt các thông điệp báo lỗi). Khi chúng ta đã làm tất cả mọi thứ, bạn hãy tiếp tục gửi lên một bài đăng và thử. Bạn hãy xem lại mã nguồn và suy nghĩ về tất cả các mã JavaScript mà chúng ta đã không hề viết ra. Phương pháp này không tiện lợi sao ? Tóm tắt Bạn cần phải có một hiểu biết cơ bản về cách thức mà mỗi khung cung cấp (hoặc không cung cấp) các hỗ trợ cho Ajax. Bạn hãy thử nghiệm với các liên kết Ajax phức tạp hơn và việc này sẽ giúp bạn tiến lên. Khung công tác PHP, Phần 4: Hỗ trợ Ajax Trang 8 của 12 ibm.com/developerWorks/vn/ developerWorks® Các tải về Mô tả Mã ví dụ phần 4 Khung công tác PHP, Phần 4: Hỗ trợ Ajax Tên Kích thước os-php-fwk4.zip 30KB Trang 9 của 12 developerWorks® ibm.com/developerWorks/vn/ Tài nguyên Học tập • Đọc blog của William Graham để xem ví dụ sử dụng Ajax và Zend: Ajax 101: Một ví dụ đơn giản về việc sử dụng Ajax với khung công tác Zend. • Để có một hướng dẫn chỉ cho bạn từng bước làm thế nào để tạo nhanh một ứng dụng symfony được trang bị các Ajax, xem trang "Các Ajax dễ thao tác tại khung công tác symfony." • Đọc sổ tay Khung công tác Zend. • Đọc các tranh luận của Diễn đàn DevNetwork tại trang Khung công tác Zend và Ajax. • Để có những bài hướng dẫn tốt về cách sử dụng khung công tác Zend, hãy đọc "Hiểu khung công tác Zend, Phần 1" • Một hướng dẫn tốt nữa về khung công tác Zend là "Bắt đầu với khung công tác Zend" • Tải về Tài liệu hướng dẫn về khung công tác symfony. • Xem hướng dẫn "Dự án khung công tác symfony đầu tiên của tôi". • Xem sổ tay Khung công tác CakePHP (Lưu ý: tài liệu này được viết cho CakePHP phiên bản V1.1. Có thể có một số khác biệt vì bạn đang sử dụng CakePHP phiên bản V1.2). • Đọc loạt bài gồm năm phần "Chế biến trang web nhanh với CakePHP." • Xem trang Wikipedia để có cái nhìn khái quát về các khung công tác phần mềm. • Xem tổng quan về Các kiến trúc MVC tại Wikipedia. • PHP.net là tài nguyên chủ yếu cho các nhà phát triển PHP. • Xem mục "Danh sách các bài nên đọc về PHP." • Duyệt qua tất cả các nội dung về PHP trên developerWorks. • Phát triển các kỹ năng PHP của bạn bằng cách tham khảo các tài nguyên của dự án PHP trên trang developerWorks của IBM. • Để nghe các phỏng vấn và các cuộc thảo luận thú vị cho các nhà phát triển phần mềm, hãy xem developerWorks podcasts. • Bạn sử dụng cơ sở dữ liệu với PHP? Hãy thử Zend Core for IBM, đó là một môi trường phát triển và chạy sản suất PHP liền khối, sẵn để dùng ngay, dễ dàng cài đặt và có hỗ trợ DB2 V9 của IBM. • Theo dõi sát các sự kiện kỹ thuật và phát tin trên Web của developerWorks. • Xem thông tin về các hội nghị sắp tới, các triển lãm thương mại, các tin phát trên web, và Các sự kiện khác trên thế giới đang là mối quan tâm của các nhà phát triển mã nguồn mở của IBM. • Xem trang Vùng mã nguồn mở của developerWorks để có nhiều thông tin về các mục “làm thế nào”, các công cụ và các dự án được cập nhật để giúp bạn phát triển với các công nghệ mã nguồn mở và sử dụng chúng với các sản phẩm của IBM. • Theo dõi và tìm hiểu về IBM và các công nghệ mã nguồn mở và các chức năng sản phẩm trên trang web miễn phí: Trình chiếu theo yêu cầu của developerWorks. Lấy sản phẩm và công nghệ • Prototype là một khung công tác JavaScript, nó làm cho việc phát triển các ứng dụng Web năng động trở nên dễ dàng. • Tải về khung công tác PHP V5.2.3. Khung công tác PHP, Phần 4: Hỗ trợ Ajax Trang 10 của 12 ibm.com/developerWorks/vn/ developerWorks® • Đổi mới dự án phát triển mã nguồn mở tiếp theo của bạn với các phần mềm dùng thử của IBM, có sẵn để tải về hoặc trên đĩa DVD. • Tải về phiên bản đánh giá sản phẩm của IBM, và thực hành các công cụ phát triển ứng dụng và sản phẩm phần mềm nằm giữa (Middleware) từ DB2®, Lotus®, Rational®, Tivoli® và WebSphere®. Thảo luận • Tham gia vào developerWorks blogs và dành tâm trí cho cộng đồng developerWorks. • Tham dự Diễn đàn PHP trên developerWorks: Phát triển các ứng dụng PHP với các sản phẩm quản lý thông tin của IBM (DB2, IDS).. Khung công tác PHP, Phần 4: Hỗ trợ Ajax Trang 11 của 12 developerWorks® ibm.com/developerWorks/vn/ Đôi nét về tác giả Duane O'Brien Duane O'Brien là một nhà khoa học máy tính. Ông đã có nhiều bài viết về phát triển ứng dụng web và về các framework PHP khác nhau. Để tìm hiểu thêm về Duane, bạn xem trang blogtwitter của ông. © Copyright IBM Corporation 2009 (www.ibm.com/legal/copytrade.shtml) Nhẫn hiệu đăng ký (www.ibm.com/developerworks/vn/ibm/trademarks/) Khung công tác PHP, Phần 4: Hỗ trợ Ajax Trang 12 của 12