如何从不同控制器中的阵列创建多个新用户(例如循环)?
我遇到一个问题,即尝试在表单提交中创建多个用户失败,但创建一个新用户的工作方式与设计相同。似乎问题可能是在保存新用户然后将新user_id返回到return语句中时。虽然新的ID返回,后续用户(第2个,第3个等)都获得相同的id值,并且后续的$ this->保存调用似乎修改了第一个创建的用户,而不是创建添加&#l; l 。任何新用户都不会出现在数据库中。 (同样,只有在创建多个新用户时才会出现问题。)
我的一个小线索是,如果我在importPublicLDAPUser()函数(user.php)中的var_dump($ user)就在$user = $this->save(array('User' => array(
... )));
之后,那么对于我看到的第一个元素两者都修改了#39;并且'创建',而我只看到'修改'对于其余的。这使我相信缺少一个步骤,比如在创建下一个用户之前需要保存或提交用户(??)。
我尝试将其更改为$user = $this->User->save(array('group_id' => 3, ...
并添加了“创建”'之前:$this->User->create();
但这些产生错误'调用成员函数save()对非对象'和'在非对象上调用成员函数create()。
我的应用程序管理文档。每个文档都可以有许多作者,因此它具有以下控制器:docs,doc-types,users,groups和authors。
当输入新文档时,表单允许选择多个用户来创建“作者”。记录。除了本地用户表之外,它还搜索我们的LDAP服务器(通过auto-sugggest),并允许输入到文本字段。因此,作者选自
此结果是两个数组:$ Authors(来自本地用户表)和$ badAuthors(LDAP和文本输入),然后应用程序在提交表单时尝试将其添加到本地用户表。
如果符合以下条件,表单就可以了:
但是,如果添加了两个或更多非本地用户($ badAuthors有多个元素),则表单失败。 "失败"表示作者或用户保存例程失败,因此它跳过文档提交$this->Docu->commit();
并通过ajaxResponse吐出错误。因此,应用程序按设计工作,但一次只能使用一个新的用户条目,即使该表单旨在允许作者/ badAuthors> 1。
我不明白为什么当我通过糟糕的作者进行循环时,如果$ badAuthors有多个元素,为什么它没有正确添加用户。
当用户输入每个名称(通过ajax助手等对其进行检查,并通过ajax助手等进行检查)然后选择后,将构建一个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(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;
}
}
有什么建议吗?谢谢!!
答案 0 :(得分:0)
事实证明,在我的docu_controller.php中,我错过了一个create()调用。似乎没有创建,当另一个控制器执行commit()时,仍然可以保存/创建对象。所以在添加create()之前,在提交之前,在以后的循环迭代中,我仍在修改原始对象,而不是任何新对象。通过在控制器中添加一个create,方法函数中的save对每个循环迭代的新用户起作用。
控制器中的:
if(count($badAuthors)){
foreach($badAuthors as $key => $author){
$this->Memo->User->create();
if($ldap_author = $this->Memo->User->importPublicLDAPUser($author['name'])){
方法中的:
function importPublicLDAPUser($cn){
....
$user = $this->save(array('User' => array(...