如何从不同控制器中的数组创建多个新用户,比如在一个循环中?
我有一个问题,尝试在表单提交中创建多个用户失败,但创建一个新用户按设计工作。看来问题可能出在保存新用户然后将新的 user_id 带回 return 语句时。虽然新的 id 回来了,但后续用户(2nd、3rd 等)都获得了相同的 id 值,并且看起来后续的 $this->save 调用修改了第一个创建的用户而不是创建 add'l 的用户。任何新用户都不会出现在数据库中。(同样,只有在创建多个新用户时才会出现问题。)
我的一个小线索是,如果我在 importPublicLDAPUser() 函数 (user.php) 中的 var_dump($user) 就在$user = $this->save(array('User' => array(
...)));
之后,那么对于第一个元素,我会看到“修改”和“创建”,而我只看到其余的“修改”。这使我相信缺少一个步骤,例如在创建下一个用户之前需要保存或提交用户(??)。
我之前尝试将其更改为$user = $this->User->save(array('group_id' => 3, ...
并添加“create”:$this->User->create();
但这些会产生错误“调用非对象上的成员函数 save()”和“调用非对象上的成员函数 create()”。
我的应用程序管理文档。每个文档可以有许多作者,因此它具有以下控制器:文档、文档类型、用户、组和作者。
输入新文档时,表单允许选择多个用户来创建“作者”记录。除了本地用户表之外,它还搜索我们的 LDAP 服务器(都通过自动建议)并允许输入文本字段。因此,作者选自
- 现有的用户表
- 通过 LDAP 助手
- 自由文本输入。
此结果是两个数组:$Authors(来自本地用户表)和 $badAuthors(LDAP 和文本输入),然后应用程序会在提交表单时尝试将其添加到本地用户表中。
如果满足以下条件,该表格就可以正常工作:
- 从本地用户表中添加一个或多个作者;
- 从 LDAP 添加单个作者(成功在用户表中创建新条目),以及零个或多个本地用户
- 从文本输入添加单个作者(也成功),以及零个或多个本地用户
但是,如果添加了两个或更多非本地用户($badAuthors 有多个元素),则表单将失败。“失败”意味着作者或用户保存例程失败,因此它跳过文档提交$this->Docu->commit();
,我通过 ajaxResponse 吐出一个错误。因此,应用程序按设计工作,但一次只能输入一个新用户条目,即使表单设计为允许作者/坏作者大于 1。
我不明白的是,为什么当我遍历糟糕的作者时,如果 $badAuthors 有多个元素,为什么它不能正确添加用户。
当用户输入每个名称(通过 ajax 助手等针对用户表和 LDAP 进行检查)然后选择时,将构建一个 author_name_list 数组。进而:
foreach($this->params['form']['author_name_list'] as $author_name){
$user_id = $this->Docu->User->field('id',array('User.name' => $author_name));
if($user_id){
$Authors['Author'][]=array(
'docu_id'=>$this->Docu->id
,'user_id'=>$user_id
);
}else{
$badAuthors[] = array('name'=>$author_name);
}
}
所以 $badAuthors 现在是那些在 LDAP 中找到或手动输入的。
所以现在我尝试创建/保存所有 badAuthors ...
文档控制器(docu_controller.php):
if(count($badAuthors)){
foreach($badAuthors as $key => $author){
$this->Memo->User->create(); // ** <-- this was missing!! **
if($ldap_author = $this->Docu->User->importPublicLDAPUser($author['name'])){
unset($badAuthors[$key]);
$Authors['Author'] []= array(
'docu_id'=>$this->Docu->id
,'user_id'=>$ldap_author['User']['id']
,'precedence' => $author['precedence']
);
} elseif ($new_author = $this->Docu->User->newReadonlyUser($author['name'])) {
unset($badAuthors[$key]);
$Authors['Author'] []= array(
'docu_id'=>$this->Docu->id
,'user_id'=>$new_author['User']['id']
,'precedence' => $author['precedence']
);
}
}
}
if(!count($badAuthors)){
$authors_saved = true;
foreach($Authors['Author'] as $author_arr){
$this->Docu->Author->create();
if(!$this->Docu->Author->save(array('Author' => $author_arr))){
$authors_saved = false;
break;
}
}
}
用户模型(user.php)
function afterSave($created) {
if (!$created) {
$parent = $this->parentNode();
$parent = $this->node($parent);
$node = $this->node();
$aro = $node[0];
$aro['Aro']['parent_id'] = $parent[0]['Aro']['id'];
$this->Aro->save($aro);
}
}
function importPublicLDAPUser($cn){
App::import('Vendor','adLDAP',array('file'=>'adLDAP.php'));
$oLDAP = new adLDAP(Configure::read('LDAP_options.email'));
$oLDAP->authenticate(NULL, NULL);
$filter = '(&(cn='.$oLDAP->ldap_escape($cn).'))';
$ldap_res = @$oLDAP->search($filter, array('cn', 'uid','profitcenter'),1);
if(isset($ldap_res['count']) && ($ldap_res['count'] > 0)){//found it
$user = $this->save(array('User' => array(
'group_id' => 3,
'name' => $ldap_res[0]['cn'][0],
'username' => $ldap_res[0]['uid'][0],
'grpnum' => pc2grpnum($ldap_res[0]['profitcenter'][0])
)));
if($user){
$user['User']['id'] = $this->id;
}
return ($user ? $user : false);
}else{
return false;
}
}
有什么建议么?谢谢!!