以下是我的视图的一部分(在按钮点击时执行的javascript方法):
function assign()
{
var links_list1 = [];
var links1 = document.getElementById('moderatorUsers').getElementsByTagName('a');
for(var a in links1) {
if(typeof links1[a] == undefined) continue;
links_list1.push(links1[a].innerHTML);} var str1 =links_list1.toString();
var moderators = str1.split(',');
var links_list2 = [];
var links2 = document.getElementById('editorUsers').getElementsByTagName('a');
for(var a in links2) {
if(typeof links2[a] == undefined) continue;
links_list2.push(links2[a].innerHTML);} var str2 =links_list2.toString();
var editors = str2.split(',');
var links_list3 = [];
var links3 = document.getElementById('jEditorUsers').getElementsByTagName('a');
for(var a in links3) {
if(typeof links3[a] == undefined) continue;
links_list3.push(links3[a].innerHTML);} var str3 =links_list3.toString();
var jEditors = str3.split(',');
}
这是我需要使用javascript(版主,编辑,jEditors)中的3个数组调用的控制器方法:
function insertPos($moderators,$editors,$jEditors){
$account = new Account();
$account->insertPos($moderators,$editors,$jEditors);
}
我需要知道如何使用javascript方法中的3个数组执行控制器方法insertPos($ moderators,$ editors,$ jEditors)...
我用它在javascript中发送数组,就像你告诉我的那样:
$.post('http://localhost/cakephp/Accounts/insertPos', {
data: {
'moderators': moderators,
'editors': editors,
'jEditors': jEditors
}
});
在控制器中我试图像这样访问我的数组:
public function insertPos() {
if (!empty($this->request->data)){
print_r($this->request->data);
$moderators = $this->request->data['moderators'];
$editors = $this->request->data['editors'];
$jEditors = $this->request->data['jEditors'];
$account = new Account();
$account->assignPos($moderators,$editors,$jEditors);
}
}
if(!empty($this->request->data))
内部的部分永远不会执行,这意味着数组尚未发送到控制器....问题出在哪里?
答案 0 :(得分:0)
看起来您正在尝试直接访问控制器类。这不是CakePHP的工作方式。您必须完成调度过程。请阅读:http://book.cakephp.org/2.0/en/getting-started/a-typical-cakephp-request.html
那就是说,你发布到CakePHP网址的方式是:
// POST to the AccountsController's insertPos method
$.post('/accounts/insertPos');
要传递数据,请在jQuery指定的data
选项中传递,前缀为'data',如data[moderators]
,因此最终会在Cake的数据变量中传递。
$.post('/accounts/insertPos', {
data: {
'data[moderators]': moderators,
'data[editors]': editors,
'data[jEditors]': jEditors
}
});
现在数据将以Cake中的$this->request->data
结尾。
但是,看看你的insertPost()
方法,你只是将它们作为参数传递,所以你可以像这样编写你的ajax
// POST is unnecessary here, since you aren't POSTing data
$.get('/accounts/insertPos/'+moderators+'/'+editors+'/'+jEditors);
你可能需要stringify
你的JavaScript数组并使用inserPos
方法中的json_decode
将它们转换为PHP对象,因为你不能只是将数组从JavaScript传递给PHP
答案 1 :(得分:0)
不要在数据参数中使用数组表示法;只需使用这样的键:
$.post('/accounts/insertPos', {
data: {
'moderators': moderators,
'editors': editors,
'jEditors': jEditors
}
});
并在您的控制器中将其访问为$this->request->data[key]
而不是$this->request->data->data[key]
用以下内容替换您的assign函数:
var moderators, editors, jEditors;
function assign()
{
var links_list1 = [];
var links1 = document.getElementById('moderatorUsers').getElementsByTagName('a');
for(var a in links1) {
if(typeof links1[a] == undefined) continue;
links_list1.push(links1[a].innerHTML);} var str1 =links_list1.toString();
moderators = str1.split(',');
var links_list2 = [];
var links2 = document.getElementById('editorUsers').getElementsByTagName('a');
for(var a in links2) {
if(typeof links2[a] == undefined) continue;
links_list2.push(links2[a].innerHTML);} var str2 =links_list2.toString();
editors = str2.split(',');
var links_list3 = [];
var links3 = document.getElementById('jEditorUsers').getElementsByTagName('a');
for(var a in links3) {
if(typeof links3[a] == undefined) continue;
links_list3.push(links3[a].innerHTML);} var str3 =links_list3.toString();
jEditors = str3.split(',');
}
祝你好运