2012-10-31 3 views
1

다른 컨트롤러에있는 어레이에서 여러 명의 새로운 사용자를 만드는 방법은 무엇입니까?배열에서 루프로 다중 사용자 생성

양식 제출에 여러 사용자를 만들려고 시도하는 데 실패했지만 한 명의 새로운 사용자를 만드는 것이 설계된대로 작동하는 문제가 있습니다. 새 사용자를 저장 한 다음 return 문에서 새 user_id를 다시 가져 오는 것이 문제 일 수 있습니다. 새로운 id가 돌아 왔지만 후속 사용자 (2, 3 등)는 모두 동일한 id 값을 가지며 이후의 $ this-> save 호출은 add'l을 작성하는 대신 처음 생성 된 사용자를 수정하는 것으로 보입니다. 새 사용자가 데이터베이스에 표시되지 않습니다. (다시 한 번 이상의 새로운 사용자가 생성 될 때만 문제가 발생합니다.) $user = $this->save(array('User' => array( 바로 뒤에 내 importPublicLDAPUser() 함수 (user.php)의 var_dump ($ user)를 사용하면 작은 실마리가 생깁니다. ... ))); 첫 번째 요소의 경우 '수정 됨'과 '생성됨'이 모두 표시되는 반면 나머지는 '수정 된'것으로 표시됩니다. 이것은 다음 사용자를 생성하기 전에 사용자가 저장하거나 커밋 (??) 할 필요가있는 것처럼 단계가 누락되었다고 생각하게합니다.

$user = $this->User->save(array('group_id' => 3, ...으로 변경하고 전에 '추가'를 시도해 보았습니다. $this->User->create();하지만 '멤버가 아닌 개체에서 save() 호출'및 '멤버 함수 호출 create()'에서 오류가 발생합니다. 비 목적 '.

내 응용 프로그램은 문서를 관리합니다. 각 문서에는 많은 작성자가있을 수 있으므로 문서, 문서 유형, 사용자, 그룹 및 작성자 용 컨트롤러가 있습니다.

새 문서를 입력하면 양식을 사용하여 여러 명의 사용자가 '작성자'레코드를 만들 수 있습니다. 로컬 사용자 테이블 외에도 LDAP 서버를 검색하고 자동 입력을 통해 텍스트 필드에 입력 할 수도 있습니다. 그래서 저자는 LDAP 도우미

  • 무료 텍스트 입력을 통해

    • 사용자가
    • 의 기존 테이블을 선택한다.

    이 결과는 양식이 제출 될 때 응용 프로그램이 로컬 사용자 테이블에 추가하려고하는 $ badAuthors (LDAP 및 텍스트 입력)와 $ Authors의 두 배열입니다.

    1. 하나 또는 그 이상의 저자가 로컬 사용자 테이블에서 추가되는 다음의 경우

      양식은 잘 작동합니다

    2. LDAP에서 단일 작성자가 추가되고 (사용자 테이블에 새 항목을 만드는 데 성공 함) 0 명 이상의 로컬 사용자
    3. 단일 작성자가 텍스트 입력 (추가도 가능)에서 추가되고 0 명 이상의 로컬 사용자

    그러나 2 인 이상의 비 로컬 사용자가 추가 된 경우 ($ badAuthors에 둘 이상의 요소가있는 경우) 양식이 실패합니다. "실패"는 작성자 또는 사용자 저장 루틴이 실패 했으므로 문서 커밋 을 건너 뛰고 ajaxResponse를 통해 오류가 발생했음을 의미합니다. 따라서이 앱은 Authors/badAuthors가 1을 넘을 수 있도록 디자인되었지만 한 번에 하나의 새로운 User 항목만으로 설계된대로 작동합니다.

    내가 왜 이해할 수없는 이유는 나쁜 작성자를 통해 $ badAuthors에 둘 이상의 요소가있는 경우 사용자를 올바르게 추가하지 않는 이유입니다.

    사용자가 각 이름을 입력하면 (사용자 테이블과 LDAP에 대해 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에 있거나 수동으로 입력 한 것입니다.

    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; 
        } 
    } 
    

    :

    그래서 지금은 ...

    다큐 컨트롤러 (docu_controller.php)를 생성/모든 badAuthors을 저장하려고 어떤 제안? 감사!!

  • 답변

    0

    내 docu_controller.php에서 create() 호출이 누락되었습니다. create가 없으면 다른 컨트롤러가 commit()을 수행 할 때 객체를 저장/생성 할 수 있습니다. 그래서 커밋 이전에 create()를 추가하기 전에, 나중의 루프 반복에서 나는 새로운 객체가 아닌 원래 객체를 여전히 수정하고있었습니다. 컨트롤러에 create를 추가함으로써, method 함수에서의 저장은 각 루프 반복마다 새로운 사용자에 대해 작용합니다. 컨트롤러

    :

    function importPublicLDAPUser($cn){ 
        .... 
        $user = $this->save(array('User' => array(... 
    
    : 방법

    if(count($badAuthors)){ 
        foreach($badAuthors as $key => $author){ 
         $this->Memo->User->create(); 
          if($ldap_author = $this->Memo->User->importPublicLDAPUser($author['name'])){ 
    

    관련 문제