mirror of
https://git.code.sf.net/p/seeddms/code
synced 2025-11-27 18:10:42 +00:00
Merge branch 'seeddms-5.1.x' into seeddms-6.0.x
This commit is contained in:
commit
bef7c173ce
|
|
@ -335,6 +335,7 @@
|
|||
- action when clicking on a thumbnail can be set (download or view online)
|
||||
- major update of polish translation
|
||||
- fix getting access rights in getMandatoryApprovers() and getMandatoryReviewers()
|
||||
- better checking for attribute definition when build a search query
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
Changes in version 5.1.40
|
||||
|
|
|
|||
123
controllers/class.EditAttributes.php
Normal file
123
controllers/class.EditAttributes.php
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
<?php
|
||||
/**
|
||||
* Implementation of EditAttributes controller
|
||||
*
|
||||
* @category DMS
|
||||
* @package SeedDMS
|
||||
* @license GPL 2
|
||||
* @version @version@
|
||||
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||
* @copyright Copyright (C) 2010-2013 Uwe Steinmann
|
||||
* @version Release: @package_version@
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class which does the busines logic for editing the version attributes
|
||||
*
|
||||
* @category DMS
|
||||
* @package SeedDMS
|
||||
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||
* @copyright Copyright (C) 2010-2025 Uwe Steinmann
|
||||
* @version Release: @package_version@
|
||||
*/
|
||||
class SeedDMS_Controller_EditAttributes extends SeedDMS_Controller_Common {
|
||||
|
||||
public function run() {
|
||||
$dms = $this->params['dms'];
|
||||
$user = $this->params['user'];
|
||||
$settings = $this->params['settings'];
|
||||
$document = $this->params['document'];
|
||||
$version = $this->params['version'];
|
||||
|
||||
if(false === $this->callHook('preEditAttributes')) {
|
||||
if(empty($this->errormsg))
|
||||
$this->errormsg = 'hook_preEditAttributes_failed';
|
||||
return null;
|
||||
}
|
||||
|
||||
$result = $this->callHook('editAttributes', $version);
|
||||
if($result === null) {
|
||||
$attributes = $this->params['attributes'];
|
||||
$oldattributes = $version->getAttributes();
|
||||
if($attributes) {
|
||||
foreach($attributes as $attrdefid=>$attribute) {
|
||||
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
|
||||
if(null === ($ret = $this->callHook('validateAttribute', $attrdef, $attribute))) {
|
||||
if($attribute) {
|
||||
switch($attrdef->getType()) {
|
||||
case SeedDMS_Core_AttributeDefinition::type_date:
|
||||
if(is_array($attribute))
|
||||
$attribute = array_map(fn($value): string => date('Y-m-d', makeTsFromDate($value)), $attribute);
|
||||
else
|
||||
$attribute = date('Y-m-d', makeTsFromDate($attribute));
|
||||
break;
|
||||
case SeedDMS_Core_AttributeDefinition::type_folder:
|
||||
if(is_array($attribute))
|
||||
$attribute = array_map(fn($value): object => $dms->getFolder((int) $value), $attribute);
|
||||
else
|
||||
$attribute = $dms->getFolder((int) $attribute);
|
||||
break;
|
||||
case SeedDMS_Core_AttributeDefinition::type_document:
|
||||
if(is_array($attribute))
|
||||
$attribute = array_map(fn($value): object => $dms->getDocument((int) $value), $attribute);
|
||||
else
|
||||
$attribute = $dms->getDocument((int) $attribute);
|
||||
break;
|
||||
case SeedDMS_Core_AttributeDefinition::type_user:
|
||||
if(is_array($attribute))
|
||||
$attribute = array_map(fn($value): object => $dms->getUser((int) $value), $attribute);
|
||||
else
|
||||
$attribute = $dms->getUser((int) $attribute);
|
||||
break;
|
||||
case SeedDMS_Core_AttributeDefinition::type_group:
|
||||
if(is_array($attribute))
|
||||
$attribute = array_map(fn($value): object => $dms->getGroup((int) $value), $attribute);
|
||||
else
|
||||
$attribute = $dms->getGroup((int) $attribute);
|
||||
break;
|
||||
}
|
||||
if(!$attrdef->validate($attribute, $version, false)) {
|
||||
$this->errormsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!isset($oldattributes[$attrdefid]) || $attribute != $oldattributes[$attrdefid]->getValue()) {
|
||||
if(!$version->setAttributeValue($dms->getAttributeDefinition($attrdefid), $attribute)) {
|
||||
//UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured"));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} elseif($attrdef->getMinValues() > 0) {
|
||||
$this->errormsg = array("attr_min_values", array("attrname"=>$attrdef->getName()));
|
||||
return false;
|
||||
} elseif(isset($oldattributes[$attrdefid])) {
|
||||
if(!$version->removeAttribute($dms->getAttributeDefinition($attrdefid)))
|
||||
// UI::exitError(getMLText("document_title", array("documentname" => $folder->getName())),getMLText("error_occured"));
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if($ret === false)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach($oldattributes as $attrdefid=>$oldattribute) {
|
||||
if(!isset($attributes[$attrdefid])) {
|
||||
if(!$version->removeAttribute($dms->getAttributeDefinition($attrdefid)))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
} elseif($result === false) {
|
||||
if(empty($this->errormsg))
|
||||
$this->errormsg = 'hook_editAttributes_failed';
|
||||
return false;
|
||||
}
|
||||
|
||||
if(false === $this->callHook('postEditAttributes')) {
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -10,25 +10,27 @@ regular ldap server, e.g. openldap
|
|||
|
||||
The location of the ldap server is specified in two parameters: `host` and
|
||||
`port`. `host` can be either a plain hostname or an ldap URI, including the
|
||||
protocol, the host and optionally the port, e.g. ldap://localhost:389. In case
|
||||
protocol, the host and optionally the port, e.g. `ldap://localhost:389`. In case
|
||||
of an URI the port in the configuration must remain empty.
|
||||
|
||||
The authentication itself is a two step process which differs, depending on how
|
||||
to bind to the server. If the configuration sets 'bindDN' and 'bindPW', those
|
||||
to bind to the server. If the configuration sets `bindDN` and `bindPW`, those
|
||||
values will be used for a initial non anonymous bind to the ldap server
|
||||
otherwise an anonymous bind is executed.
|
||||
|
||||
After the initial bind, a ldap search for either 'uid=<username>' (ldap) or
|
||||
'sAMAccountName=<username>' (AD) below basedn is done. The purpose of this
|
||||
After the initial bind, a ldap search for either `uid=<username>` (ldap) or
|
||||
`sAMAccountName=<username>` (AD) below basedn is done. The purpose of this
|
||||
search is to retrieve a working bindDN which is then used to actually
|
||||
authenticate the user. In case of an anonymous first bind the search will
|
||||
likely fail and the bindDN for the second bind will be either
|
||||
'uid=<username>,<basedn>' (ldap) or '<username>@<accountDomainName>' (AD). If
|
||||
the search succeeds the bindDN will be taken from the user's data in the ldap
|
||||
authenticate the user. In case of a successful anonymous first bind but a
|
||||
failed search (this seems to be the case when connecting to an AD), a second
|
||||
non anonymous bind is tried. The bindDN for that second bind will be either
|
||||
`uid=<username>,<basedn>` (ldap) or `<username>@<accountDomainName>` (AD).
|
||||
If the search after the first anonymous bind succeeds, the bindDN will be
|
||||
taken from the user's data in the ldap
|
||||
server. This bindDN will be used for a second bind using the users password.
|
||||
If the second bind succeeds the user could be successfully authenticated.
|
||||
If the second bind succeeds the user is successfully authenticated.
|
||||
|
||||
The data from the ldap server can be used to create an account in SeedDMS
|
||||
The data from the ldap server can be used to create or update an account in SeedDMS
|
||||
if the user trying to login does not exist yet, but was able to authenticate.
|
||||
This will only be done if 'authentication->restricted' in the configuration
|
||||
is set to false. In that case the common name (cn) and email address is taken
|
||||
|
|
@ -41,12 +43,37 @@ can be set with the attribute `mailField`. If it is not set it defaults to `mail
|
|||
Since version 5.1.34 and 6.0.27 the groups of a user stored in the ldap directory
|
||||
can be synchronised with the groups in SeedDMS. The ldap field storing
|
||||
the groups can be configured with the attribute `mailField`. This will add
|
||||
new groups in SeedDMS and aѕsign them to the user.
|
||||
new groups in SeedDMS and assign them to the user.
|
||||
|
||||
Using email address for authentication
|
||||
---------------------------------------
|
||||
|
||||
Since version 5.1.34 and 6.0.27 the email can be used for authentication
|
||||
(requires `enableLoginByEmail` to be set in the configuration).
|
||||
This only works if the search after the first bind succeeds, which is usually
|
||||
only the case if it is a none anonymous bind.
|
||||
|
||||
Notes on connecting to an AD
|
||||
-----------------------------
|
||||
|
||||
The ldap authentication was originally implemented for classic LDAP servers
|
||||
like openldap. Before doing the actual authentication the user was searched
|
||||
by combining the user's login name and the configured baseDN. This search was
|
||||
preceded an anonymous or non anonymous bind (depending on wether bindDN and
|
||||
bindPWD are set). The only purpose of that search was to retrieve the
|
||||
distinguished name of the user, which was used in a second non anonymous bind
|
||||
for authenticating the user. If that search fails or didn't return a record
|
||||
(which seems to be always the case for an anonymous bind to an AD)
|
||||
a second non anonymous bind with the user's credentials is tried. That bind
|
||||
uses a dn which is quite different for classic ldap and AD (see examples
|
||||
below). The dn for an AD is of the form '<username>@<domain>'. '<domain>' is
|
||||
the string configured in the parameter `accountDomainName`.
|
||||
|
||||
Examples
|
||||
---------
|
||||
|
||||
Anonymous bind to openldap on localhost, port 389
|
||||
### Anonymous bind to openldap on localhost, port 389
|
||||
|
||||
- type = "ldap"
|
||||
- baseDN = "ou=users,dc=mycompany,dc=de"
|
||||
- host = "ldap://localhost"
|
||||
|
|
@ -55,12 +82,37 @@ During authentication as user 'admin' the following steps are executed
|
|||
|
||||
1. connect to ldap server at localhost:389
|
||||
2. do an anonymous bind
|
||||
3. search for 'uid=admin' below basedn
|
||||
3.1 if the bind succeeds, search for `uid=admin` below basedn
|
||||
3.2 if the bind fails use `uid=admin,<basedn>` as dn and continue with step 5
|
||||
4.1. if search succeeds use the dn from the user
|
||||
4.2. if search fails use 'uid=admin,<basedn>' as dn
|
||||
4.2. if search fails use `uid=admin,<basedn>` as dn
|
||||
5. do a non anonymous bind with dn and password entered by user
|
||||
6. if step 5. succeeds the use is authenticated
|
||||
6. if step 5. succeeds the user is authenticated
|
||||
7. if `restricted` in the settings is *not* set another ldap search for the
|
||||
user is executed to retrieve the full name, and the email and if
|
||||
8.1 the user doesn't exist in SeedDMS, the user will be created or
|
||||
8.2 the user exists in SeedDMS, the use will be updated
|
||||
|
||||
If bindDN and bindPW are specified in the configuration, the second step
|
||||
will be a non anonymous bind.
|
||||
|
||||
### Connecting to an AD
|
||||
|
||||
- type = "AD"
|
||||
- baseDN = "ou=users,dc=mycompany,dc=de"
|
||||
- accountDomainName=mycompany
|
||||
- host = "ldap://localhost"
|
||||
|
||||
During authentication as user 'admin' the following steps are executed
|
||||
|
||||
1. connect to AD server at localhost:389
|
||||
2. do an anonymous bind (which usually succeeds)
|
||||
3. search for `uid=admin` below basedn (which usually returns an empty record)
|
||||
4. if search returns no data use `admin@<accountDomainName>` as dn
|
||||
5. do a non anonymous bind with dn and password entered by user
|
||||
6. if step 5. succeeds the user is authenticated
|
||||
7. if `restricted` in the settings is *not* set another ldap search for the
|
||||
user is executed to retrieve the full name, and the email and if
|
||||
8.1 the user doesn't exist in SeedDMS, the user will be created or
|
||||
8.2 the user exists in SeedDMS, the use will be updated
|
||||
|
||||
|
|
|
|||
|
|
@ -233,7 +233,7 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
|
|||
}
|
||||
|
||||
/* Check if user already exists in the database. Return with an error
|
||||
* only if the sql statements fails, but not if no user was found.
|
||||
* only if the sql statements fails, but not if the user wasn't found.
|
||||
* The username may not be the one passed to this function anymore. It
|
||||
* could have been overwritten by uid (or sAMAccountName) derived from
|
||||
* the above ldap search.
|
||||
|
|
|
|||
|
|
@ -685,6 +685,64 @@ class SeedDMS_NotificationService {
|
|||
}
|
||||
} /* }}} */
|
||||
|
||||
public function sendChangedVersionAttributesMail($version, $user, $oldattributes) { /* {{{ */
|
||||
$document = $version->getDocument();
|
||||
$dms = $document->getDMS();
|
||||
$folder = $document->getFolder();
|
||||
$notifyList = $document->getNotifyList();
|
||||
|
||||
$newattributes = $version->getAttributes();
|
||||
if($oldattributes) {
|
||||
foreach($oldattributes as $attrdefid=>$attribute) {
|
||||
if(!isset($newattributes[$attrdefid]) || $newattributes[$attrdefid]->getValueAsArray() !== $oldattributes[$attrdefid]->getValueAsArray()) {
|
||||
$subject = "attribute_changed_email_subject";
|
||||
$message = "attribute_changed_email_body";
|
||||
$params = array();
|
||||
$params['name'] = $document->getName();
|
||||
$params['version'] = $version->getVersion();
|
||||
$params['attribute_name'] = $attribute->getAttributeDefinition()->getName();
|
||||
$params['attribute_old_value'] = $oldattributes[$attrdefid]->getValue();
|
||||
$params['attribute_new_value'] = isset($newattributes[$attrdefid]) ? $newattributes[$attrdefid]->getValue() : '';
|
||||
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||
$params['username'] = $user->getFullName();
|
||||
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||
$params['sitename'] = $this->settings->_siteName;
|
||||
$params['http_root'] = $this->settings->_httpRoot;
|
||||
|
||||
$this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||
foreach ($notifyList["groups"] as $grp) {
|
||||
$this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Check for new attributes which didn't have a value before */
|
||||
if($newattributes) {
|
||||
foreach($newattributes as $attrdefid=>$attribute) {
|
||||
if(!isset($oldattributes[$attrdefid]) && $attribute) {
|
||||
$subject = "attribute_changed_email_subject";
|
||||
$message = "attribute_changed_email_body";
|
||||
$params = array();
|
||||
$params['name'] = $document->getName();
|
||||
$params['version'] = $version->getVersion();
|
||||
$params['attribute_name'] = $dms->getAttributeDefinition($attrdefid)->getName();
|
||||
$params['attribute_old_value'] = '';
|
||||
$params['attribute_new_value'] = $attribute->getValue();
|
||||
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||
$params['username'] = $user->getFullName();
|
||||
$params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||
$params['sitename'] = $this->settings->_siteName;
|
||||
$params['http_root'] = $this->settings->_httpRoot;
|
||||
|
||||
$this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||
foreach ($notifyList["groups"] as $grp) {
|
||||
$this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} /* }}} */
|
||||
|
||||
public function sendChangedFolderAttributesMail($folder, $user, $oldattributes) { /* {{{ */
|
||||
$dms = $folder->getDMS();
|
||||
$notifyList = $folder->getNotifyList();
|
||||
|
|
|
|||
|
|
@ -1880,16 +1880,17 @@ class SeedDMS_Search { /* {{{ */
|
|||
$attributes = array();
|
||||
|
||||
foreach($attributes as $attrdefid=>$attribute) {
|
||||
$attrdef = $this->dms->getAttributeDefinition($attrdefid);
|
||||
if($attribute) {
|
||||
if($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_date) {
|
||||
if(is_array($attribute)) {
|
||||
if(!empty($attributes[$attrdefid]['from']))
|
||||
$attributes[$attrdefid]['from'] = date('Y-m-d', makeTsFromDate($attribute['from']));
|
||||
if(!empty($attributes[$attrdefid]['to']))
|
||||
$attributes[$attrdefid]['to'] = date('Y-m-d', makeTsFromDate($attribute['to']));
|
||||
} else {
|
||||
$attributes[$attrdefid] = date('Y-m-d', makeTsFromDate($attribute));
|
||||
if($attrdef = $this->dms->getAttributeDefinition($attrdefid)) {
|
||||
if($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_date) {
|
||||
if(is_array($attribute)) {
|
||||
if(!empty($attributes[$attrdefid]['from']))
|
||||
$attributes[$attrdefid]['from'] = date('Y-m-d', makeTsFromDate($attribute['from']));
|
||||
if(!empty($attributes[$attrdefid]['to']))
|
||||
$attributes[$attrdefid]['to'] = date('Y-m-d', makeTsFromDate($attribute['to']));
|
||||
} else {
|
||||
$attributes[$attrdefid] = date('Y-m-d', makeTsFromDate($attribute));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,8 +27,12 @@ include("../inc/inc.Init.php");
|
|||
include("../inc/inc.Extension.php");
|
||||
include("../inc/inc.DBInit.php");
|
||||
include("../inc/inc.ClassUI.php");
|
||||
include("../inc/inc.ClassController.php");
|
||||
include("../inc/inc.Authentication.php");
|
||||
|
||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||
$controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user));
|
||||
|
||||
/* Check if the form data comes from a trusted request */
|
||||
if(!checkFormKey('editattributes')) {
|
||||
UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token"));
|
||||
|
|
@ -51,7 +55,6 @@ if (!is_object($document)) {
|
|||
}
|
||||
|
||||
$folder = $document->getFolder();
|
||||
$docPathHTML = getFolderPathHTML($folder, true). " / <a href=\"../out/out.ViewDocument.php?documentid=".$documentid."\">".$document->getName()."</a>";
|
||||
|
||||
if ($document->getAccessMode($user, 'editDocumentContentAttributes') < M_READWRITE) {
|
||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||
|
|
@ -73,120 +76,25 @@ foreach($version->getAttributes() as $ai=>$aa)
|
|||
$oldattributes[$ai] = clone $aa;
|
||||
|
||||
$attributes = $_POST["attributes"];
|
||||
if($attributes) {
|
||||
foreach($attributes as $attrdefid=>$attribute) {
|
||||
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
|
||||
if($attribute) {
|
||||
switch($attrdef->getType()) {
|
||||
case SeedDMS_Core_AttributeDefinition::type_date:
|
||||
if(is_array($attribute))
|
||||
$attribute = array_map(fn($value): string => date('Y-m-d', makeTsFromDate($value)), $attribute);
|
||||
else
|
||||
$attribute = date('Y-m-d', makeTsFromDate($attribute));
|
||||
break;
|
||||
case SeedDMS_Core_AttributeDefinition::type_folder:
|
||||
if(is_array($attribute))
|
||||
$attribute = array_map(fn($value): object => $dms->getFolder((int) $value), $attribute);
|
||||
else
|
||||
$attribute = $dms->getFolder((int) $attribute);
|
||||
break;
|
||||
case SeedDMS_Core_AttributeDefinition::type_document:
|
||||
if(is_array($attribute))
|
||||
$attribute = array_map(fn($value): object => $dms->getDocument((int) $value), $attribute);
|
||||
else
|
||||
$attribute = $dms->getDocument((int) $attribute);
|
||||
break;
|
||||
case SeedDMS_Core_AttributeDefinition::type_user:
|
||||
if(is_array($attribute))
|
||||
$attribute = array_map(fn($value): object => $dms->getUser((int) $value), $attribute);
|
||||
else
|
||||
$attribute = $dms->getUser((int) $attribute);
|
||||
break;
|
||||
case SeedDMS_Core_AttributeDefinition::type_group:
|
||||
if(is_array($attribute))
|
||||
$attribute = array_map(fn($value): object => $dms->getGroup((int) $value), $attribute);
|
||||
else
|
||||
$attribute = $dms->getGroup((int) $attribute);
|
||||
break;
|
||||
}
|
||||
if(!$attrdef->validate($attribute, $version, false)) {
|
||||
$errmsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute);
|
||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg);
|
||||
}
|
||||
if(!isset($oldattributes[$attrdefid]) || $attribute != $oldattributes[$attrdefid]->getValue()) {
|
||||
if(!$version->setAttributeValue($dms->getAttributeDefinition($attrdefid), $attribute)) {
|
||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured"));
|
||||
}
|
||||
}
|
||||
} elseif($attrdef->getMinValues() > 0) {
|
||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName())));
|
||||
} elseif(isset($oldattributes[$attrdefid])) {
|
||||
if(!$version->removeAttribute($dms->getAttributeDefinition($attrdefid)))
|
||||
UI::exitError(getMLText("document_title", array("documentname" => $folder->getName())),getMLText("error_occured"));
|
||||
}
|
||||
}
|
||||
$controller->setParam('document', $document);
|
||||
$controller->setParam('version', $version);
|
||||
$controller->setParam('attributes', $attributes);
|
||||
if(!$controller()) {
|
||||
$err = $controller->getErrorMsg();
|
||||
if(is_string($err))
|
||||
$errmsg = getMLText($err);
|
||||
elseif(is_array($err)) {
|
||||
$errmsg = getMLText($err[0], $err[1]);
|
||||
} else {
|
||||
$errmsg = $err;
|
||||
}
|
||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg);
|
||||
}
|
||||
|
||||
$newattributes = $version->getAttributes();
|
||||
if($oldattributes) {
|
||||
foreach($oldattributes as $attrdefid=>$attribute) {
|
||||
if(!isset($newattributes[$attrdefid]) || $newattributes[$attrdefid]->getValueAsArray() !== $oldattributes[$attrdefid]->getValueAsArray()) {
|
||||
if($notifier) {
|
||||
$notifyList = $document->getNotifyList();
|
||||
$subject = "attribute_changed_email_subject";
|
||||
$message = "attribute_changed_email_body";
|
||||
$params = array();
|
||||
$params['name'] = $document->getName();
|
||||
$params['version'] = $version->getVersion();
|
||||
$params['attribute_name'] = $attribute->getAttributeDefinition()->getName();
|
||||
$params['attribute_old_value'] = $oldattributes[$attrdefid]->getValue();
|
||||
$params['attribute_new_value'] = isset($newattributes[$attrdefid]) ? $newattributes[$attrdefid]->getValue() : '';
|
||||
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||
$params['username'] = $user->getFullName();
|
||||
$params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||
$params['sitename'] = $settings->_siteName;
|
||||
$params['http_root'] = $settings->_httpRoot;
|
||||
|
||||
$notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||
foreach ($notifyList["groups"] as $grp) {
|
||||
$notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Check for new attributes which didn't have a value before */
|
||||
if($newattributes) {
|
||||
foreach($newattributes as $attrdefid=>$attribute) {
|
||||
if(!isset($oldattributes[$attrdefid]) && $attribute) {
|
||||
if($notifier) {
|
||||
$notifyList = $document->getNotifyList();
|
||||
$subject = "attribute_changed_email_subject";
|
||||
$message = "attribute_changed_email_body";
|
||||
$params = array();
|
||||
$params['name'] = $document->getName();
|
||||
$params['version'] = '';
|
||||
$params['attribute_name'] = $dms->getAttributeDefinition($attrdefid)->getName();
|
||||
$params['attribute_old_value'] = '';
|
||||
$params['attribute_new_value'] = $attribute->getValue();
|
||||
$params['folder_path'] = $folder->getFolderPathPlain();
|
||||
$params['username'] = $user->getFullName();
|
||||
$params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID();
|
||||
$params['sitename'] = $settings->_siteName;
|
||||
$params['http_root'] = $settings->_httpRoot;
|
||||
|
||||
$notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||
foreach ($notifyList["groups"] as $grp) {
|
||||
$notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if($notifier) {
|
||||
$notifier->sendChangedVersionAttributesMail($version, $user, $oldattributes);
|
||||
}
|
||||
|
||||
add_log_line("?documentid=".$documentid);
|
||||
|
||||
header("Location:../out/out.DocumentVersionDetail.php?documentid=".$documentid."&version=".$versionid);
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -53,7 +53,6 @@ if (!is_object($document)) {
|
|||
}
|
||||
|
||||
$folder = $document->getFolder();
|
||||
$docPathHTML = getFolderPathHTML($folder, true). " / <a href=\"../out/out.ViewDocument.php?documentid=".$documentid."\">".$document->getName()."</a>";
|
||||
|
||||
if ($document->getAccessMode($user, 'editDocument') < M_READWRITE) {
|
||||
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied"));
|
||||
|
|
@ -129,7 +128,6 @@ $oldexpires = $document->getExpires();
|
|||
$oldattributes = array();
|
||||
foreach($document->getAttributes() as $ai=>$aa)
|
||||
$oldattributes[$ai] = clone $aa;
|
||||
//$oldattributes = $document->getAttributes();
|
||||
|
||||
$controller->setParam('fulltextservice', $fulltextservice);
|
||||
$controller->setParam('document', $document);
|
||||
|
|
|
|||
|
|
@ -566,16 +566,17 @@ if($fullsearch) {
|
|||
$attributes = array();
|
||||
|
||||
foreach($attributes as $attrdefid=>$attribute) {
|
||||
$attrdef = $dms->getAttributeDefinition($attrdefid);
|
||||
if($attribute) {
|
||||
if($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_date) {
|
||||
if(is_array($attribute)) {
|
||||
if(!empty($attributes[$attrdefid]['from']))
|
||||
$attributes[$attrdefid]['from'] = date('Y-m-d', makeTsFromDate($attribute['from']));
|
||||
if(!empty($attributes[$attrdefid]['to']))
|
||||
$attributes[$attrdefid]['to'] = date('Y-m-d', makeTsFromDate($attribute['to']));
|
||||
} else {
|
||||
$attributes[$attrdefid] = date('Y-m-d', makeTsFromDate($attribute));
|
||||
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
|
||||
if($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_date) {
|
||||
if(is_array($attribute)) {
|
||||
if(!empty($attributes[$attrdefid]['from']))
|
||||
$attributes[$attrdefid]['from'] = date('Y-m-d', makeTsFromDate($attribute['from']));
|
||||
if(!empty($attributes[$attrdefid]['to']))
|
||||
$attributes[$attrdefid]['to'] = date('Y-m-d', makeTsFromDate($attribute['to']));
|
||||
} else {
|
||||
$attributes[$attrdefid] = date('Y-m-d', makeTsFromDate($attribute));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ $(document).ready( function() {
|
|||
foreach($res['contents'] as $content) {
|
||||
$document = $content->getDocument();
|
||||
$extracontent = array();
|
||||
$extracontent['below_title'] = $this->getListRowPath($doc);
|
||||
$extracontent['below_title'] = $this->getListRowPath($document);
|
||||
$txt = $this->callHook('documentListItem', $document, $previewer, false, 'attributemgr', $extracontent);
|
||||
if(is_string($txt))
|
||||
echo $txt;
|
||||
|
|
|
|||
|
|
@ -251,7 +251,7 @@ class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style {
|
|||
echo "</td>";
|
||||
echo "<td>".$extconf['title'];
|
||||
echo "<br /><small>".$extconf['description']."</small>";
|
||||
echo "<br /><small>".getMLText('author').": <a href=\"mailto:".htmlspecialchars($extconf['author']['email'])."\">".$extconf['author']['name']."</a>, ".$extconf['author']['company']."</small>";
|
||||
echo "<br /><small>".getMLText('author').": <a href=\"mailto:".htmlspecialchars($extconf['author']['email'])."\">".$extconf['author']['name']."</a>, ".(!empty($extconf['author']['company']) ? $extconf['author']['company'] : '')."</small>";
|
||||
if($errmsgs)
|
||||
echo "<div><img src=\"".$this->getImgPath("attention.gif")."\"> ".implode('<br /><img src="'.$this->getImgPath("attention.gif").'"> ', $errmsgs)."</div>";
|
||||
echo "</td>";
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user