다른 컨트롤러에있는 어레이에서 여러 명의 새로운 사용자를 만드는 방법은 무엇입니까?배열에서 루프로 다중 사용자 생성
양식 제출에 여러 사용자를 만들려고 시도하는 데 실패했지만 한 명의 새로운 사용자를 만드는 것이 설계된대로 작동하는 문제가 있습니다. 새 사용자를 저장 한 다음 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의 두 배열입니다.
- 하나 또는 그 이상의 저자가 로컬 사용자 테이블에서 추가되는 다음의 경우
양식은 잘 작동합니다
- LDAP에서 단일 작성자가 추가되고 (사용자 테이블에 새 항목을 만드는 데 성공 함) 0 명 이상의 로컬 사용자
- 단일 작성자가 텍스트 입력 (추가도 가능)에서 추가되고 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을 저장하려고 어떤 제안? 감사!!