31 private $hookObject = null;
40 public function addFamily($familyId, $includeSubFamily =
true)
44 $fam = new_doc($this->dbaccess, $familyId);
45 if ($fam->isAlive()) {
46 if ($fam->doctype ==
"C") {
47 $famids = $this->getTValue(
"off_families");
48 $subfamids = $this->getTValue(
"off_subfamilies");
49 $key = array_search($fam->id, $famids);
52 $subfamids[] = ($includeSubFamily ?
'yes' :
'no');
54 $famids[$key] = $fam->id;
55 $subfamids[$key] = ($includeSubFamily ?
'yes' :
'no');
57 $err.= $this->setValue(
"off_families", $famids);
58 $err.= $this->setValue(
"off_subfamilies", $subfamids);
59 if (!$err) $err = $this->store();
61 $err.= sprintf(
"not a family %s [%d] not alive", $fam->getTitle() , $fam->id);
64 $err.= sprintf(
"no family %s [%d] not alive", $fam->getTitle() , $fam->id);
67 $err.= sprintf(
"no family given");
70 AddLogMsg(__METHOD__ . $err);
80 if (($doc->lockdomainid == $this->id) && ($doc->locked == $this->getSystemUserId())) {
81 $wdoc = new_doc($this->dbaccess, $doc->wid);
83 if (!$wdoc->isAlive()) {
91 $fs = $wdoc->getFollowingStates(
true);
93 foreach ($fs as $state) {
94 $tr = $wdoc->getTransition($doc->state, $state);
95 $fsout[$state] = array(
96 "label" => _($state) ,
97 "color" => $wdoc->getColor($state) ,
98 "activity" => $wdoc->getActivity($state) ,
99 "transition" => isset($tr[
"id"]) ? _($tr[
"id"]) : sprintf(_(
"OFFLINE:Transition non authorized from %s to %s") , _($doc->state) , _($state))
105 catch(Exception $e) {
106 AddLogMsg(__METHOD__ . $e->getMessage());
115 $doc->addfields[
"pullextradata"] =
"pullextradata";
117 $doc->pullextradata[$key] = $value;
127 $fam = new_doc($this->dbaccess, $familyId);
128 if ($fam->isAlive()) {
129 if ($fam->doctype ==
"C") {
130 $famids = $this->getTValue(
"off_families");
131 $subfamids = $this->getTValue(
"off_subfamilies");
132 $key = array_search($fam->id, $famids);
133 if ($key !==
false) {
134 unset($famids[$key]);
135 unset($subfamids[$key]);
137 $err = $this->setValue(
"off_families", $famids);
138 $err.= $this->setValue(
"off_subfamilies", $subfamids);
139 if (!$err) $err = $this->store();
141 $err = sprintf(
"not a family %s [%d] not alive", $fam->getTitle() , $fam->id);
159 $fam = new_doc($this->dbaccess, $familyId);
160 if ($fam->isAlive()) {
161 if ($fam->doctype ==
"C") {
162 $domainFamily = $this->getFamDoc();
164 $newMask = new_doc($this->dbaccess, $maskId);
167 if ((!$newMask->isAlive()) || ($newMask->fromname !=
'MASK')) {
168 $err = sprintf(
"not a mask %s", $maskId);
173 $maskId = isset($newMask) ? $newMask->id : 0;
174 $famids = $domainFamily->getParamTValue(
"off_mskfamilies");
175 $subfamids = $domainFamily->getParamTValue(
"off_msksubfamilies");
176 $masks = $domainFamily->getParamTValue(
"off_masks");
177 $key = array_search($fam->id, $famids);
178 if ($key ===
false) {
180 $famids[] = $fam->id;
181 $subfamids[] = ($includeSubFamily ?
'yes' :
'no');
186 $famids[$key] = $fam->id;
187 $subfamids[$key] = ($includeSubFamily ?
'yes' :
'no');
188 $masks[$key] = $maskId;
190 unset($famids[$key]);
191 unset($subfamids[$key]);
195 $domainFamily->setParam(
"off_mskfamilies", $famids);
196 $domainFamily->setParam(
"off_msksubfamilies", $subfamids);
197 $domainFamily->setParam(
"off_masks", $masks);
199 $err = $domainFamily->modify();
203 $err = sprintf(
"not a family %s [%d] not alive", $fam->getTitle() , $fam->id);
207 $err = sprintf(
"no family %s [%d] not alive", $fam->getTitle() , $fam->id);
210 $err = sprintf(
"no family given");
220 $famids = $this->getTValue(
"off_allfamilies");
221 if (count($famids) == 0) {
222 $families = $this->getAValues(
"off_t_families");
224 foreach ($families as $currentFamily) {
225 if ($currentFamily[
"off_families"]) {
226 $fams[] = $currentFamily[
"off_families"];
227 if ($currentFamily[
"off_subfamilies"] !=
"no") {
228 $fams = array_merge(array_keys($this->getChildFam($currentFamily[
"off_families"],
false)) , $fams);
233 $famids = array_unique($fams);
235 $this->disableEditControl();
236 $err = $this->setValue(
"off_allfamilies", $famids);
237 $err.= $this->modify();
243 $this->enableEditControl();
250 $families = $this->getAValues(
"off_t_families");
251 foreach ($families as $currentFamily) {
252 if ($currentFamily[
"off_families"] == $familyId) {
253 if ($currentFamily[
"off_useworkflow"] ==
"yes") {
268 $userId = $this->getDomainUserId($userId);
270 $tmpfile = tempnam(getTmpDir() ,
'syncReport');
272 file_put_contents($tmpfile, $report);
274 $folder->disableEditControl();
275 $err = $folder->storeFile(
"off_report", $tmpfile, sprintf(_(
"Sync report %s.html") , date(
'Y-m-d')));
276 if (!$err) $err = $folder->modify();
277 $folder->enableEditControl();
285 $lay =
new Layout(getLayoutFile(
"OFFLINE",
"syncreport.html") , $action);
286 $q =
new QueryDb($this->dbaccess,
"DocLog");
287 $q->addQuery(sprintf(
"initid=%d", $this->
id));
288 $q->addQuery(sprintf(
"uid=%d", $userId));
289 $q->order_by =
"date desc";
291 $r = $q->query(0, 1000,
"TABLE");
293 foreach ($r as $k => $v) {
296 $v->arg = unserialize($v->arg);
299 "oddClass" => ($k % 2 == 0) ?
"even" :
"odd",
300 "syncDate" => $this->reportGetDate($v) ,
301 "syncCode" => substr($v->code, strlen(
'DomainSyncApi::')) ,
302 "syncAction" => $this->reportGetAction($v) ,
303 "syncMessage" => $this->reportGetMessage($v) ,
304 "syncStatus" => $this->reportGetStatus($v)
307 $lay->setBlockData(
"MSG", $tsync);
308 $lay->set(
"date", FrenchDateToLocaleDate($this->getTimeDate()));
309 $lay->set(
"domain", $this->getHTMLTitle());
310 $lay->set(
"username", User::getDisplayName($this->getSystemUserId()));
315 private function reportGetDate($sync)
317 return FrenchDateToLocaleDate(strtok($sync->date,
'.'));
320 private function reportGetStatus($sync)
323 switch ($sync->code) {
324 case 'DomainSyncApi::endTransaction':
325 switch ($sync->arg->status) {
328 foreach ($sync->arg->detailStatus as $dstatus) {
329 $dstatus = (object)$dstatus;
330 if ($dstatus->saveInfo->onAfterSaveChangeState || $dstatus->saveInfo->onAfterSaveDocument) {
348 if ($sync->arg->error !=
'') {
357 private function reportGetAction($sync)
359 return _($sync->code); # _(
"DomainSyncApi::bookDocument");_(
"DomainSyncApi::unbookDocument"); _(
"DomainSyncApi::removeUserDocument");_(
"DomainSyncApi::endTransaction"); _(
"DomainSyncApi::beginTransaction");_(
"DomainSyncApi::getUserDocuments");_(
"DomainSyncApi::getSharedDocuments"); _(
"DomainSyncApi::revertDocument"); _(
"DomainSyncApi::pushDocument");
363 private function reportGetMessage($sync)
369 switch ($sync->code) {
370 case 'DomainSyncApi::endTransaction':
371 $list =
new DocumentList();
372 $list->addDocumentIdentificators(array_keys($sync->arg->detailStatus));
374 foreach ($sync->arg->detailStatus as $docid => $status) {
376 $msgdoc[$docid] = $this->reportFormatEndStatus((
object)$status, _(
"new document"));
379 foreach ($list as $id => $doc) {
381 $status = (object)$sync->arg->detailStatus[$doc->initid];
382 $msgdoc[$id] = $this->reportFormatEndStatus($status, sprintf(
"%s <span>%s</span>", $doc->getTitle() , $doc->initid));
384 if (count($msgdoc) > 1) {
385 $message =
'<ul><li>' . implode(
'</li><li>', $msgdoc) .
'</li></ul>';
386 } elseif (count($msgdoc) == 1) {
387 $message = current($msgdoc);
389 $message.= _(
"no documents uploaded");
393 case 'DomainSyncApi::pushDocument':
394 if ($sync->arg->refererinitid < 0) {
395 $message = sprintf(_(
"document creation %s") , $message = $sync->arg->title);
396 } elseif ($sync->arg->refererinitid == null) {
397 $message = sprintf(_(
"document creation failed"));
399 $message = $sync->arg->title;
401 if ($sync->arg->error) {
402 $message.=
' : ' . $sync->arg->error;
404 if ($sync->arg->message) {
405 $message.=
' : ' . $sync->arg->message;
409 case 'DomainSyncApi::beginTransaction':
410 $message = $sync->arg->error;
413 case 'DomainSyncApi::bookDocument':
414 case 'DomainSyncApi::unbookDocument':
415 case 'DomainSyncApi::revertDocument':
416 if ($sync->arg->error) {
417 $message = sprintf(
"%s : %s", $sync->arg->title, $sync->arg->error);
419 $message = sprintf(_(
"%s has been downloaded") , sprintf(
"%s <span>%s</span>", $sync->arg->title, $sync->arg->initid));
423 case 'DomainSyncApi::getUserDocuments':
424 case 'DomainSyncApi::getSharedDocuments':
425 if (is_array($sync->arg->documentsToUpdate)) {
426 $list =
new DocumentList();
427 $list->addDocumentIdentificators($sync->arg->documentsToUpdate);
429 foreach ($list as $docid => $doc) {
431 $msgdoc[$docid] = sprintf(
"%s <span>%s</span>", $doc->getTitle() , $doc->initid);
433 if (count($msgdoc) > 1) {
434 $updateMessage = _(
"download documents :") .
'<ul><li>' . implode(
'</li><li>', $msgdoc) .
'</li></ul>';
435 } elseif (count($msgdoc) == 1) {
436 $updateMessage = sprintf(_(
"download document %s") , current($msgdoc));
441 if (is_array($sync->arg->documentsToDelete)) {
442 $list =
new DocumentList();
443 $list->addDocumentIdentificators($sync->arg->documentsToDelete);
445 foreach ($list as $docid => $doc) {
446 $msgdoc[$docid] = $doc->getTitle();
448 if (count($msgdoc) > 1) {
449 $deleteMessage = _(
"delete documents :") .
'<ul><li>' . implode(
'</li><li>', $msgdoc) .
'</li></ul>';
450 } elseif (count($msgdoc) == 1) {
451 $deleteMessage = sprintf(_(
"delete document %s") , current($msgdoc));
457 if ($sync->arg->error) $message = $sync->arg->error;
458 if ($updateMessage && $deleteMessage) {
459 $message.= nl2br($updateMessage .
"\n" . $deleteMessage);
460 } elseif ($updateMessage) {
461 $message.= $updateMessage;
462 } elseif ($deleteMessage) {
463 $message.= $deleteMessage;
465 $message.= _(
"no documents to retrieve");
475 private function reportFormatEndStatus($status, $title =
'')
479 $status->saveInfo = (object)$status->saveInfo;
480 switch ($status->statusCode) {
482 if (count($status->saveInfo->constraint) > 0) {
485 foreach ($status->saveInfo->constraint as $constraint) {
486 $msgConstraint.= sprintf(
"%s : %s", $constraint[
"label"], $constraint[
"err"]);
488 $statusMessage = $msgConstraint;
489 $msgdoc = sprintf(_(
"%s following constraints are not validated: %s") , $title, $statusMessage);
494 $msgdoc = sprintf(_(
"%s has been recorded") , $title);
501 if ($status->saveInfo->onAfterSaveDocument) {
502 $statusMessage.= sprintf(_(
"after save warning:%s\n") , $status->saveInfo->onAfterSaveDocument);
504 if ($status->saveInfo->onAfterSaveChangeState) {
505 $statusMessage.= sprintf((
"%s\n") , $status->saveInfo->onAfterSaveChangeState);
507 if (!$msgConstraint) {
508 $statusMessage.= $status->statusMessage;
511 return $statusMessage . $msgdoc;
519 public function addMember($userId, $hasManagePrivilege =
false)
521 $userId = $this->getDomainUserId($userId);
525 $user =
new User($this->dbaccess, $userId);
527 if ($user->isAffected()) {
529 if ($user->isgroup ==
'Y') {
530 $aidMember =
'off_group_members';
531 $aidMode =
'off_group_mode';
533 $aidMember =
'off_user_members';
534 $aidMode =
'off_user_mode';
536 $members = $this->getTValue($aidMember);
537 $mode = $this->getTValue($aidMode);
539 $key = array_search($user->fid, $members);
540 if ($key ===
false) {
542 $members[] = $user->fid;
543 $mode[] = ($hasManagePrivilege ?
'advanced' :
'standard');
546 $members[$key] = $user->fid;
547 $mode[$key] = ($hasManagePrivilege ?
'advanced' :
'standard');
549 $err.= $this->setValue($aidMember, $members);
550 $err.= $this->setValue($aidMode, $mode);
551 if (!$err) $err = $this->store();
553 $err.= sprintf(
"no user %s not alive", $userId);
556 $err.= sprintf(
"no user given");
567 $userId = $this->getDomainUserId($userId);
570 $user =
new User($this->dbaccess, $userId);
571 if ($user->isAffected()) {
573 if ($user->isgroup ==
'Y') {
574 $aidMember =
'off_group_members';
575 $aidMode =
'off_group_mode';
577 $aidMember =
'off_user_members';
578 $aidMode =
'off_user_mode';
580 $members = $this->getTValue($aidMember);
581 $mode = $this->getTValue($aidMode);
583 $key = array_search($user->fid, $members);
584 if ($key !==
false) {
585 unset($members[$key]);
588 $err.= $this->setValue($aidMember, $members);
589 $err.= $this->setValue($aidMode, $mode);
591 $err = $this->store();
594 $err.= sprintf(
"no user %s not alive", $userId);
597 $err.= sprintf(
"no user given");
609 $userId = $this->getDomainUserId($userId);
610 $fid = $this->uid2fid($userId);
611 $fids = $this->getTValue(
"off_user_members");
612 $fids+= $this->getTValue(
"off_group_members");
613 if (in_array($fid, $fids)) {
614 $err = $this->
addMember($userId, $hasManagePrivilege);
616 $err = sprintf(
"user %s is not a member", $userId);
627 return ($this->
getUserMode($userId) ==
'advanced');
637 include_once (
"FDL/Class.SearchDoc.php");
641 $um = $this->getTValue(
"off_group_members");
642 foreach ($um as $k => $v) {
643 if (!$v) unset($um[$k]);
645 if (count($um) > 0) {
646 $s =
new SearchDoc($this->dbaccess,
"IGROUP");
647 $s->addFilter($s->sqlCond($um,
"initid",
true));
649 $users = $s->search();
650 foreach ($users as $guser) {
651 $g =
new User($this->dbaccess, $guser[
"us_whatid"]);
652 if ($g->isAffected()) {
653 $members = $g->getUserMembers();
654 foreach ($members as $user) {
655 $index = $useSystemId ? $user[
"id"] : $user[
"fid"];
656 $out[$index] = array(
658 "docid" => $user[
"fid"],
659 "displayName" => trim($user[
"firstname"] .
" " . $user[
"lasttname"]) ,
660 "login" => $user[
"login"]
667 $um = $this->getTValue(
"off_user_members");
668 foreach ($um as $k => $v) {
669 if (!$v) unset($um[$k]);
671 if (count($um) > 0) {
672 $s =
new SearchDoc($this->dbaccess,
"IUSER");
673 $s->addFilter($s->sqlCond($um,
"initid",
true));
674 $users = $s->search();
675 foreach ($users as $user) {
676 $index = $useSystemId ? $user[
"us_whatid"] : $user[
"initid"];
677 $out[$index] = array(
678 "id" => $user[
"us_whatid"],
679 "docid" => $user[
"initid"],
680 "displayName" => $user[
"title"],
681 "login" => $user[
"us_login"]
697 include_once (
"FDL/Class.SearchDoc.php");
698 $userId = $this->getDomainUserId($uid);
699 $fid = $this->uid2fid($userId);
702 $um = $this->getTValue(
"off_user_members");
703 if (in_array($fid, $um))
return true;
705 $um = $this->getTValue(
"off_group_members");
706 foreach ($um as $k => $v) {
707 if (!$v) unset($um[$k]);
709 if (count($um) > 0) {
710 $s =
new SearchDoc($this->dbaccess,
"IGROUP");
711 $s->addFilter($s->sqlCond($um,
"initid",
true));
713 $users = $s->search();
714 foreach ($users as $guser) {
715 $g =
new User($this->dbaccess, $guser[
"us_whatid"]);
716 if ($g->isAffected()) {
717 if ($g->isMember($userId))
return true;
735 $user =
new User($this->dbaccess, $uid);
740 "docid" => $user->fid,
741 "displayName" => trim($user->firstname .
' ' . $user->lastname) ,
742 "login" => $user->login,
743 "managePrivilege" => ($userMode ==
'advanced')
749 private function uid2fid($uid)
751 $err = simpleQuery($this->dbaccess, sprintf(
"select fid from users where id=%d", $uid) , $docuid,
true,
true);
752 if (!$err)
return $docuid;
765 $uid = $this->getDomainUserId($uid);
766 $docuid = $this->uid2fid($uid);
768 $umembers = $this->getTValue(
"off_user_members");
769 $key = array_search($docuid, $umembers);
770 if ($key !==
false) {
771 $userMode = $this->getTValue(
"off_user_mode",
'', $key);
774 $ugroups = $this->getTValue(
"off_group_members");
775 $gu =
new User($this->dbaccess);
776 foreach ($ugroups as $k => $gid) {
777 if ($gu->setFid($gid)) {
778 $members = $gu->getUserMembers();
779 foreach ($members as $member) {
780 if ($member[
'id'] == $uid) {
781 $userMode = $this->getTValue(
"off_group_mode",
'', $k);
785 if ($userMode ===
'advanced') {
804 $doc = new_doc($this->dbaccess, $documentId,
true);
806 return $this->domainInsertDocument($sfolder, $doc, $reservedBy, ($reservedBy > 0));
817 $doc = new_doc($this->dbaccess, $documentId,
true);
819 if ($doc->isAlive()) {
820 $err = $sfolder->delFile($doc->initid);
821 $this->sendEvents($doc);
834 public function insertUserDocument($documentId, $userId = 0, $reserve =
true, &$documentstatus = array())
837 $userId = $this->getDomainUserId($userId);
839 $doc = new_doc($this->dbaccess, $documentId,
true);
841 return $this->domainInsertDocument($ufolder, $doc, $userId, $reserve, $documentstatus);
854 private function domainInsertDocument(Dir $folder, Doc & $doc, $userId = 0, $reserve =
true, &$documentstatus = array())
857 $statusErrorMessage =
"";
858 if ($doc->isAlive()) {
859 if ($reserve && ($doc->lockdomainid > 0) && ($doc->lockdomainid != $this->id)) {
860 $err = sprintf(_(
"document is already book in other domain : %s") , $this->getTitle($doc->lockdomainid));
862 $point =
"domainInsertDocument" . $doc->id;
863 $this->savePoint($point);
864 $err = $folder->AddFile($doc->initid);
866 $status =
"inserted";
868 $statusErrorMessage = $doc->canEdit(
false);
869 if ($statusErrorMessage ==
"") {
870 $err = $doc->lockToDomain($this->
id);
871 $status =
"reserved";
875 if ($err) $this->rollbackPoint($point);
877 $this->commitPoint($point);
878 $this->sendEvents($doc);
881 $documentstatus[$doc->id] =
new ReserveInfo($doc->id, $doc->getTitle() , $err ?
"error" : $status, $err ? $err :
"", $statusErrorMessage);
883 $err = sprintf(_(
"document to book not exists %s") , $doc->id);
891 private static function sendEvents(Doc & $doc)
894 $fdlids = $doc->getParentFolderIds();
895 foreach ($fdlids as $fldid) {
896 $action->AddActionDone(
"MODFOLDERCONTAINT", $fldid);
917 $err = $this->insertCollection($sfolder, $collection, $reservedBy, ($reservedBy > 0) , $documentstatus);
919 $err = sprintf(
"share folder not found");
932 public function insertUserCollection(DocumentList $collection, $userId, $reserve =
true, &$documentstatus = array())
934 $userId = $this->getDomainUserId($userId);
937 $err = $this->insertCollection($ufolder, $collection, $userId, $reserve, $documentstatus);
939 $err = sprintf(
"user folder %s noy found", $userId);
953 private function insertCollection(Dir & $folder, DocumentList $collection, $userId, $reserve =
true, &$documentstatus = array())
956 foreach ($collection as $doc) {
957 $err.= $this->domainInsertDocument($folder, $doc, $userId, $reserve, $documentstatus);
970 $userId = $this->getDomainUserId($userId);
972 return $this->clearFolder($ufolder);
984 return $this->clearFolder($ufolder);
993 private function clearFolder(Dir & $folder, $unlock =
true)
995 $dl = $folder->getDocumentList();
996 $err = $folder->clear();
998 foreach ($dl as $doc) {
1000 $doc->updateDomains();
1006 include_once (
"FDL/Class.DocWaitManager.php");
1007 DocWaitManager::clearWaitingDocs($this->domain, $this->getSystemUserId());
1009 $this->setError($err);
1023 $userId = $this->getDomainUserId($userId);
1025 $doc = new_doc($this->dbaccess, $documentId,
true);
1027 if ($doc->isAlive()) {
1028 $err = $ufolder->delFile($doc->initid);
1036 $this->sendEvents($doc);
1048 $doc = new_doc($this->dbaccess, $documentId,
true);
1049 if ($doc->isAlive()) {
1050 $err = $doc->canEdit(
false);
1052 if ($reservedBy > 0) {
1053 $err = $doc->lockToDomain($this->
id, $reservedBy);
1056 $err = $doc->lockToDomain(0);
1060 $err = sprintf(
"document %s not exists", $documentId);
1070 $shared = new_doc($this->dbaccess, $this->getShareId());
1071 if ($shared->isAlive())
return $shared;
1075 private function getDomainUserId($userId)
1078 $userId = $this->getSystemUserId();
1080 if (!is_numeric($userId)) {
1082 $user =
new User($this->dbaccess);
1083 $user->SetLoginName($userId);
1084 if ($user->isAffected()) {
1086 $userId = $user->id;
1099 $fam = $this->getFamDoc();
1100 $families = $fam->getParamTValue(
"off_mskfamilies");
1101 $familyMask = new_doc($this->dbaccess, $family);
1102 if ($familyMask->isAlive()) {
1104 $key = array_search($familyMask->id, $families);
1106 if ($key !==
false) {
1107 return $fam->getParamTValue(
"off_masks",
'', $key);
1110 $sub = $fam->getParamTValue(
"off_msksubfamilies");
1111 foreach ($families as $k => $famid) {
1112 if ($sub[$k] ==
"yes") {
1113 $subFamIds = array_keys($this->getChildFam($famid,
false));
1114 if (in_array($familyMask->id, $subFamIds))
return $fam->getParamTValue(
"off_masks",
'', $k);
1130 $userId = $this->getDomainUserId($userId);
1131 $user =
new User($this->dbaccess, $userId);
1133 if ($user->isAffected()) {
1135 $login = $user->login;
1136 $userFolderId = $this->getUserFolderId($login);
1137 $userFolder = new_doc($this->dbaccess, $userFolderId);
1138 if (!$userFolder->isAlive()) {
1143 "docid" => $user->fid,
1144 "displayName" => trim($user->firstname .
" " . $user->lasttname) ,
1145 "login" => $user->login
1151 throw new Exception(__METHOD__ .
" user $userId is not affected");
1163 $userId = $this->getDomainUserId($userId);
1166 $s =
new SearchDoc($this->dbaccess);
1167 $s->useCollection($userFolder->initid);
1168 $s->setObjectReturn();
1169 $s->addFilter(
"locked = %d", $userId);
1170 $s->addFilter(
"lockdomainid = %d", $this->
id);
1171 $dl = $s->search()->getDocumentList();
1172 foreach ($dl as $v) {
1173 $ids[] = $v->initid;
1179 $s =
new SearchDoc($this->dbaccess);
1180 $s->useCollection($shareFolder->initid);
1181 $s->setObjectReturn();
1182 $s->addFilter(
"locked = %d", $userId);
1183 $s->addFilter(
"lockdomainid = %d", $this->
id);
1184 $dl = $s->search()->getDocumentList();
1185 foreach ($dl as $v) {
1186 $ids[] = $v->initid;
1189 return array_unique($ids);
1211 return $userFolder->getDocumentList();
1223 return $shareFolder->getDocumentList();
1235 $err.= $this->deleteValue(
"off_allfamilies");
1245 $ref = $this->getValue(
"off_ref");
1247 $exists = $this->getTitle($ref);
1249 return sprintf(_(
"reference %s exists") , $ref);
1261 $ref = $this->getValue(
"off_ref");
1263 $err = $this->setLogicalIdentificator($ref);
1274 private function getShareId()
1276 return sprintf(
"offshared_%s", $this->name);
1284 private function getUserFolderId($login)
1286 return sprintf(
"offuser_%s_%s", $this->name, $login);
1299 $err.= $this->setLogicalIdentificator($this->getValue(
"off_ref"));
1301 if (($this->getValue(
"off_sharepolicy") ==
"admin") || ($this->getValue(
"off_sharepolicy") ==
"users")) {
1302 $sharedID = $this->getShareId();
1303 $sharedFolder = new_doc($this->dbaccess, $sharedID);
1304 if (!$sharedFolder->isAlive()) {
1305 $sharedFolder = createDoc($this->dbaccess,
"OFFLINEGLOBALFOLDER",
false);
1306 $sharedFolder->setValue(
"ba_title", sprintf(_(
"%s Share folder") , $this->getTitle()));
1307 $sharedFolder->setValue(
"off_domain", $this->
id);
1308 $err.= $sharedFolder->add();
1309 $err.= $sharedFolder->setLogicalIdentificator($sharedID);
1310 $err.= $this->addFile($sharedFolder->initid);
1312 $sharedFolder = new_doc($this->dbaccess, $sharedID);
1313 $err.= $this->addFile($sharedFolder->initid);
1315 $sharedFolder->disableEditControl();
1316 $sharedFolder->setValue(
"off_admins", $this->getValue(
"off_admins"));
1317 $sharedFolder->setValue(
"off_users", array_merge($this->getTValue(
"off_group_members") , $this->getTValue(
"off_user_members")));
1318 $sharedFolder->setValue(
"fld_allbut",
"1");
1319 $sharedFolder->setValue(
"fld_famids", $this->getValue(
"off_families"));
1320 $sharedFolder->setValue(
"fld_subfam", $this->getValue(
"off_subfamilies"));
1321 $err.= $sharedFolder->modify();
1322 if ($this->getValue(
"off_sharepolicy") ==
"admin") {
1323 $sharedFolder->setProfil(
"PRF_OFFGLOBFOLDERADMIN");
1324 } elseif ($this->getValue(
"off_sharepolicy") ==
"users") {
1325 $sharedFolder->setProfil(
"PRF_OFFGLOBFOLDERUSER");
1327 $sharedFolder->enableEditControl();
1329 $sharedID = $this->getShareId();
1330 $sharedFolder = new_doc($this->dbaccess, $sharedID);
1331 if ($sharedFolder->isAlive()) {
1335 $sharedFolder->delete();
1343 foreach ($members as $member) {
1344 $userFolderID = $this->getUserFolderId($member[
"login"]);
1348 catch(Exception $e) {
1349 $err.= $e->getMessage();
1366 $usersFolder = new_doc($this->dbaccess, $usersID);
1368 if (!$usersFolder->isAlive()) {
1369 $usersFolder = createDoc($this->dbaccess,
"DIR",
false);
1370 $usersFolder->setValue(
"ba_title", sprintf(_(
"%s Users folder") , $this->getTitle()));
1371 $usersFolder->setValue(
"off_domain", $this->
id);
1373 $err.= $usersFolder->add();
1374 $err.= $usersFolder->setLogicalIdentificator($usersID);
1375 $err.= $this->addFile($usersFolder->initid);
1377 $usersFolder = new_doc($this->dbaccess, $usersID);
1378 $err.= $this->addFile($usersFolder->initid);
1380 $usersFolder->disableEditControl();
1381 $usersFolder->setValue(
"fld_allbut",
"1");
1382 $usersFolder->setValue(
"fld_famids", getFamIdFromName($this->dbaccess,
"OFFLINEFOLDER"));
1383 $usersFolder->setValue(
"fld_subfam",
"no");
1384 $usersFolder->setValue(
"off_admins", $this->getValue(
"off_admins"));
1385 $usersFolder->setValue(
"off_users", array_merge($this->getTValue(
"off_group_members") , $this->getTValue(
"off_user_members")));
1386 $err.= $usersFolder->modify();
1387 $usersFolder->enableEditControl();
1389 throw new Exception(__METHOD__ . $err);
1391 return $usersFolder;
1396 $usersID = sprintf(
"offusers_%s", $this->name);
1408 $usersFolder = new_Doc(
"", $usersFolderId);
1409 if (!$usersFolder->isAlive()) {
1410 throw new Exception(__METHOD__ .
" usersFolder : $usersFolderId");
1412 return $usersFolder;
1428 $userFolder = new_doc($this->dbaccess, $userFolderID);
1429 if (!$userFolder->isAlive()) {
1430 $userFolder = createDoc($this->dbaccess,
"OFFLINEFOLDER",
false);
1431 $userFolder->setValue(
"ba_title", sprintf(_(
"%s User folder") , $member[
"login"]));
1432 $userFolder->setValue(
"off_domain", $this->
id);
1433 $userFolder->setValue(
"off_user", $member[
"docid"]);
1435 $err.= $userFolder->add();
1436 $err.= $userFolder->setLogicalIdentificator($userFolderID);
1437 $err.= $usersFolder->addFile($userFolder->initid);
1439 $userFolder = new_doc($this->dbaccess, $userFolderID);
1440 $err.= $usersFolder->addFile($userFolder->initid);
1442 $userFolder->disableEditControl();
1444 $userFolder->setValue(
"off_advanceduser", $member[
"docid"]);
1446 $userFolder->deleteValue(
"off_advanceduser");
1448 $userFolder->setValue(
"fld_allbut",
"1");
1449 $userFolder->setValue(
"fld_famids", $this->getValue(
"off_families"));
1450 $userFolder->setValue(
"fld_subfam", $this->getValue(
"off_subfamilies"));
1451 $err.= $userFolder->modify();
1452 $userFolder->enableEditControl();
1454 throw new Exception(__METHOD__ .
' ' . $err);
1467 if (strstr($filepath,
'..')) {
1468 return sprintf(_(
"file %s must be relative") , $filepath);
1470 if (!file_exists(sprintf(
"%s/%s", DEFAULT_PUBDIR, $filepath))) {
1471 return sprintf(_(
"file %s not exists") , $filepath);
1473 if (!preg_match(
'/\.php$/', $filepath)) {
1474 return sprintf(_(
"file %s must be a PHP file") , $filepath);
1476 $fileContent = file_get_contents($filepath);
1478 if (!preg_match(
'/class\s+([a-z_0-9]+)\s+implements\s+DomainHook/ims', $fileContent, $regs)) {
1479 return sprintf(_(
"file %s not implement DomainHook") , $filepath);
1490 if (!$this->hookObject) {
1491 $hookPath = $this->getValue(
'off_hookpath');
1493 if (!strstr($hookPath,
'..')) {
1495 require_once $hookPath;
1497 $fileContent = file_get_contents($hookPath);
1498 if (preg_match(
'/class\s+([a-z_0-9]+)\s+implements\s+DomainHook/i', $fileContent, $regs)) {
1499 $className = $regs[1];
1500 $this->hookObject =
new $className();
1502 addWarningMsg(
"hook class not implement DomainHook");
1507 return $this->hookObject;
1516 include_once (
"FDL/Class.SearchDoc.php");
1518 $userIds = implode(
',', array_keys($users));
1519 $sql = sprintf(
"update doc set lockdomainid = null where lockdomainid = %d and locked > 0 and locked not in (%s)", $this->
id, $userIds);
1521 $err = $this->exec_query($sql);
1523 foreach ($users as $u) {
1524 $fuid[] = $u[
"docid"];
1526 if (count($fuid) > 0) {
1527 $userFids =
"'" . implode(
"','", $fuid) .
"'";
1528 $searchDoc =
new SearchDoc($this->dbaccess,
"OFFLINEFOLDER");
1529 $searchDoc->only =
true;
1530 $searchDoc->addFilter(
"off_domain = '%d'", $this->
id);
1531 $searchDoc->addFilter(sprintf(
"off_user not in (%s)", $userFids));
1532 $searchDoc->setObjectReturn();
1533 $searchDoc->search();
1534 while ($doc = $searchDoc->nextDoc()) {
getReservedDocumentIds($userId=0)
getUserDocuments($userId=0)
generateUsersFolder($usersID)
insertUserCollection(DocumentList $collection, $userId, $reserve=true, &$documentstatus=array())
insertUserDocument($documentId, $userId=0, $reserve=true, &$documentstatus=array())
setManagePrivilege($userId, $hasManagePrivilege)
clearSharedFolder($unlock=true)
updateReport($userId, &$report)
insertSharedDocument($documentId, $reservedBy=null)
addExtraData(Doc &$doc, $key, $value)
canUseWorkflow($familyId)
insertShareCollection(DocumentList $collection, $reservedBy=0, &$documentstatus=array())
clearUserFolder($userId=0, $unlock=true)
removeUserDocument($documentId, $userId)
removeSharedDocument($documentId)
setReservation($documentId, $reservedBy)
generateUserFolder($userFolderID, $member, Dir $usersFolder)
hasManagePrivilege($userId)
addFollowingStates(Doc &$doc)
setFamilyMask($familyId, $includeSubFamily=true, $maskId)
addFamily($familyId, $includeSubFamily=true)
addMember($userId, $hasManagePrivilege=false)
getUserMembersInfo($useSystemId=true)