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.

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.

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.

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 2Phầ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 đó.


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 độ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, rankDownfetchRank. 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',
                        {
                            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.

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: executeReadexecuteWrite. 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 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')); ?>

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.


Tải về

Mô tảTênKích thước
Mã ví dụ phần 4os-php-fwk4.zip30KB

Tài nguyên

Học tập

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.
  • Đổ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

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=418388
ArticleTitle=Khung công tác PHP, Phần 4: Hỗ trợ Ajax
publish-date=08072009