1

如何从不同控制器中的数组创建多个新用户,比如在一个循环中?

我有一个问题,尝试在表单提交中创建多个用户失败,但创建一个新用户按设计工作。看来问题可能出在保存新用户然后将新的 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 和文本输入),然后应用程序会在提交表单时尝试将其添加到本地用户表中。

如果满足以下条件,该表格就可以正常工作:

  1. 从本地用户表中添加一个或多个作者;
  2. 从 LDAP 添加单个作者(成功在用户表中创建新条目),以及零个或多个本地用户
  3. 从文本输入添加单个作者(也成功),以及零个或多个本地用户

但是,如果添加了两个或更多非本地用户($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;
    }
}

有什么建议么?谢谢!!

4

1 回答 1

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(...
于 2012-11-02T19:36:38.013 回答