从数组循环创建多个用户

时间:2012-10-31 19:45:42

标签: cakephp cakephp-1.3

如何从不同控制器中的阵列创建多个新用户(例如循环)?

我遇到一个问题,即尝试在表单提交中创建多个用户失败,但创建一个新用户的工作方式与设计相同。似乎问题可能是在保存新用户然后将新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),并允许输入到文本字段。因此,作者选自

  • 现有用户表
  • 通过LDAP帮助程序
  • 免费文字输入。

此结果是两个数组:$ Authors(来自本地用户表)和$ badAuthors(LDAP和文本输入),然后应用程序在提交表单时尝试将其添加到本地用户表。

如果符合以下条件,表单就可以了:

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

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

    有什么建议吗?谢谢!!

1 个答案:

答案 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(...