2010-08-25 29 views
5

Tôi mới dùng CakePHP nhưng gần như đang bỏ bằng cách sử dụng nó do không có khả năng nhận jQuery để làm việc với nó.Không may mắn khi cố gắng sử dụng JQuery với CakePHP 1.3

Tôi đang sử dụng CakePHP 1.3 và vì vậy, những người trợ giúp Html và Js đã tạo Javascript và Ajax thừa nhưng tôi không thể tìm thấy bất kỳ tài liệu trợ giúp/api nào về cách sử dụng Js là đủ.

Tất cả những gì tôi đang cố làm trước hết là gửi một số dữ liệu đến CakePHP với jQuery và sau đó lấy lại một số dữ liệu vào jQuery và cảnh báo() nó. Đối với một số lý do này chỉ là không làm việc. Đây là mã của tôi:

test.js

$('.social').click(function() 
{ 
    $.ajax({ 
     type: 'POST', 
     url: '/activities/add_activity', 
     data: 'type=social', 
     dataType: 'json', 
     success: function(data) 
     { 
      alert(data); 
     }, 
     error: function() 
     { 
      alert('wut'); 
     } 
    }); 
}); 

activities_controller.php

function add_activity() 
{ 
    if($this->RequestHandler->isAjax()) 
    { 
     $this->autoRender = false; 
     $this->autoLayout = false; 

     $this->header('Content-Type: application/json'); 

     echo json_encode(array('result'=>'hello'); 
     return; 
    } 
} 

Mỗi lần tôi nhấp vào nút với class = 'xã hội' tôi nhận được cảnh báo "wut" có nghĩa là lỗi.

Tôi có thành phần RequestHandler và các trình trợ giúp Javascript, Js và Ajax được bao gồm trong activity_controller.php của mình.

Ngoài ra, test.js và jquery.js được liên kết bằng cách sử dụng html-> script(); trong default.ctp và tất cả các công cụ jQuery khác đang hoạt động nên không phải vậy.

Tôi cũng đã có này trong beforeFilter của tôi() cho activities_controller.php:

if($this->RequestHandler->isAjax()) 
{ 
    Configure::write('debug',0); 
} 
parent::beforeFilter(); 

Bất cứ ý tưởng gì là sai? Nó là một điều jQuery hoặc một điều cakePHP? Hoặc cả hai?

Cảm ơn trước,

Infinitifizz

T.B.

Tôi chưa bao giờ thực hiện AJAX trong jQuery trước đây vì vậy có thể đó là điều gì đó liên quan đến điều đó đang rối tung lên, tôi đã từng thực hiện AJAX javascript đơn giản.

+2

Đây là một trong những thời điểm thực sự hữu ích khi gỡ lỗi được bật - cụ thể ở mức "1" trong trường hợp có lỗi PHP. Hãy thử kích hoạt mức đó cho các yêu cầu ajax và xem liệu có bất cứ điều gì được báo cáo trong bản ghi Bánh của bạn ('/ app/tmp/logs/*') hay không. –

+0

Hãy thử bao gồm điều này trong phương pháp bánh của bạn: $ this-> log ('Một thông báo gỡ lỗi.', LOG_DEBUG); để xem liệu phương pháp có đang được gọi hay không. Kiểm tra đầu ra trong app/tmp/logs/debug.log Lưu ý rằng bạn có thể chuyển các biến - ngay cả các mảng thay cho chuỗi tin nhắn. – Leo

+1

Ngoài ra, hãy sử dụng Firebug trong Firefox để theo dõi hoạt động mạng (trên tab mạng). – Leo

Trả lời

3

Đừng bỏ qua CakePHP. Có một đường cong học tập, nhưng nó đáng giá.

tôi sẽ chỉ định url như thế này:

<?php $Url = Router::url(array('controller'=>'activities','action'=>'addActivity'),true); ?> 
$('.social').click(function() 
{ 
    $.ajax({ 
     type: 'POST', 
     url: '<?php echo $Url ?>'; 
     ... 

Về phía CakePHP, phương pháp của tôi sẽ là như thế này:

function addActivity() 
{ 
    $this->autoRender = false; 
    $this->autoLayout = false; 

    App::import('Helper', 'Javascript'); 
    $javascript = new JavascriptHelper(); 

    echo($javascript->object(array('result'=>'hello'))); 
    exit(1); 
} 

tôi không bao giờ sử dụng if($this->RequestHandler->isAjax()) mặc dù tôi chắc chắn rằng một số loại linh hồn sẽ cho tôi biết lý do tại sao tôi nên.

Tôi thích sử dụng camelCách tên phương thức phù hợp với quy ước CakePHP.

Lưu ý rằng dòng này trong mã của bạn: echo json_encode(array('result'=>'hello'); thiếu khung đóng.

Ngoài ra, tôi sẽ không sử dụng jQuery để làm AJAX đơn giản như thế này - nó có thể làm cho nó khó khăn để gỡ lỗi, nhưng đó chỉ là sở thích cá nhân.

1

Điều này có thể là ngoại tuyến, nhưng ...

Những gì tôi làm để có mục gốc của ứng dụng trong javascript của tôi:

Trong /app/views/layout/default.ctp Tôi đã mã sau

<?php 
echo $javascript->codeBlock("var root = '".$html->url('/')."';"); 
?> 

url tham số của bạn sẽ trông như:

url: root+'activities/add_activity', 

theo cách này ngay cả khi bạn đang ở trong thư mục con hoặc miền tld, tập lệnh sẽ hoạt động bình thường.

Trả lại "wut" cho tôi có nghĩa là tập lệnh không thể truy cập trang trong thông số url của bạn. Đặc biệt là nếu bạn làm việc trong một thư mục con, nó sẽ nhìn vào http://server.com/activities/add_activity. Tôi 99% chắc chắn rằng đây là vấn đề :)

Một giả thuyết khác: Tháo Ajax trong khi it was meant to work with Prototype khá với jQuery

+0

Ah! Cảm ơn! Xin lỗi vì đã trả lời trễ tất cả mọi người, tôi đã đi vắng trong tuần qua, nhưng cảm ơn Nik Tôi ít nhất cũng đến đó vì điều này! Nó bây giờ gọi hàm sau khi tôi thêm dòng đó vào default.ctp nhưng tôi luôn lấy lại 'wut' mặc dù vậy có nghĩa là ít nhất jQuery đang chạy nhưng luôn gặp lỗi ... bất kỳ lời khuyên nào cần làm tiếp theo? –

+0

Ồ, gần như quên mất, tôi cũng đã thay đổi chức năng add_activity để sử dụng $ this-> javascript ... như Leo đã nói trước đây vì vậy có lẽ điều đó cũng đã giúp. –

+0

Ah, chỉ cần sử dụng firebug và có vẻ như cakephp đang gửi lại một lỗi có vẻ chứa "Cảnh báo: DbAcl :: check() - Tra cứu nút ARO/ACO không thành công trong kiểm tra quyền. Tham chiếu nút" và sau đó nó hiển thị mảng Người dùng với bản ghi của người dùng đã đăng nhập từ bảng người dùng. Vì vậy, tôi nghĩ rằng đó là một vấn đề ACL, bây giờ tôi đã thêm add_activity() cho phép() cho phép và vì vậy bây giờ tôi có được thành công trở lại từ jQuery! Nhưng ... cảnh báo (dữ liệu) chỉ cho tôi "[đối tượng]" là bởi vì phản ứng không phải là json? Tôi rất mới với JSON và chỉ thử nó bởi vì nó đã được trong một hướng dẫn ... –

3

Tôi ghét Helper Ajax trong CakePHP ... đó là cho đến khi tôi thấy điều này: http://blog.loadsys.com/2009/05/01/cakephp-jquery-ajax-helper-easy-scriptaculous-replacement/

Bây giờ tôi có thể sử dụng các lệnh gọi CakePHP Ajax gốc với jQuery! Nhìn vào đây. Tôi đã có thể giải quyết tất cả các vấn đề ajax "đơn giản" của tôi với sự thay thế helper darg-n-drop ajax này. Tôi chỉ cần thả nó vào thư mục trợ giúp trong ứng dụng của tôi và thay thế ajax.php đó là có và viola! jQuery đang hoạt động. Bạn cần bao gồm tập lệnh jQuery trong bố cục của khóa học. Hãy thử nó, bạn sẽ yêu thích CakePHP một lần nữa!

2

Tôi khuyên bạn nên sử dụng bố cục john của CakePHP để xuất dữ liệu từ chế độ xem thay vì dữ liệu tiếng vang json từ bộ điều khiển của bạn.

Các vấn đề liên quan