NEW : Add triggers OBJECT_LINK_INSERT, OBJECT_LINK_UPDATE et OBJECT_LINK_DELETE in the function add_object_linked(), updateObjectLinked() and deleteObjectLinked()

This commit is contained in:
kamel 2021-01-06 11:14:13 +01:00
parent 007ae59788
commit 32109de67b

View File

@ -3257,14 +3257,18 @@ abstract class CommonObject
* *
* @param string $origin Linked element type * @param string $origin Linked element type
* @param int $origin_id Linked element id * @param int $origin_id Linked element id
* @param User $f_user User that create
* @param int $notrigger 1=Does not execute triggers, 0= execute triggers
* @return int <=0 if KO, >0 if OK * @return int <=0 if KO, >0 if OK
* @see fetchObjectLinked(), updateObjectLinked(), deleteObjectLinked() * @see fetchObjectLinked(), updateObjectLinked(), deleteObjectLinked()
*/ */
public function add_object_linked($origin = null, $origin_id = null) public function add_object_linked($origin = null, $origin_id = null, $f_user = null, $notrigger = 0)
{ {
// phpcs:enable // phpcs:enable
global $user;
$origin = (!empty($origin) ? $origin : $this->origin); $origin = (!empty($origin) ? $origin : $this->origin);
$origin_id = (!empty($origin_id) ? $origin_id : $this->origin_id); $origin_id = (!empty($origin_id) ? $origin_id : $this->origin_id);
$f_user = isset($f_user) ? $f_user : $user;
// Special case // Special case
if ($origin == 'order') $origin = 'commande'; if ($origin == 'order') $origin = 'commande';
@ -3272,6 +3276,7 @@ abstract class CommonObject
if ($origin == 'invoice_template') $origin = 'facturerec'; if ($origin == 'invoice_template') $origin = 'facturerec';
if ($origin == 'supplierorder') $origin = 'order_supplier'; if ($origin == 'supplierorder') $origin = 'order_supplier';
$this->db->begin(); $this->db->begin();
$error = 0;
$sql = "INSERT INTO " . MAIN_DB_PREFIX . "element_element ("; $sql = "INSERT INTO " . MAIN_DB_PREFIX . "element_element (";
$sql .= "fk_source"; $sql .= "fk_source";
@ -3286,12 +3291,26 @@ abstract class CommonObject
$sql .= ")"; $sql .= ")";
dol_syslog(get_class($this) . "::add_object_linked", LOG_DEBUG); dol_syslog(get_class($this) . "::add_object_linked", LOG_DEBUG);
if ($this->db->query($sql)) if ($this->db->query($sql)) {
{ if (!$notrigger) {
// Call trigger
$this->context['link_origin'] = $origin;
$this->context['link_origin_id'] = $origin_id;
$result = $this->call_trigger('OBJECT_LINK_INSERT', $f_user);
if ($result < 0) {
$error++;
}
// End call triggers
}
} else {
$this->error = $this->db->lasterror();
$error++;
}
if (!$error) {
$this->db->commit(); $this->db->commit();
return 1; return 1;
} else { } else {
$this->error = $this->db->lasterror();
$this->db->rollback(); $this->db->rollback();
return 0; return 0;
} }
@ -3502,26 +3521,31 @@ abstract class CommonObject
* @param string $sourcetype Object source type * @param string $sourcetype Object source type
* @param int $targetid Object target id * @param int $targetid Object target id
* @param string $targettype Object target type * @param string $targettype Object target type
* @param User $f_user User that create
* @param int $notrigger 1=Does not execute triggers, 0= execute triggers
* @return int >0 if OK, <0 if KO * @return int >0 if OK, <0 if KO
* @see add_object_linked(), fetObjectLinked(), deleteObjectLinked() * @see add_object_linked(), fetObjectLinked(), deleteObjectLinked()
*/ */
public function updateObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '') public function updateObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '', $f_user = null, $notrigger = 0)
{ {
global $user;
$updatesource = false; $updatesource = false;
$updatetarget = false; $updatetarget = false;
$f_user = isset($f_user) ? $f_user : $user;
if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource = true; if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource = true;
elseif (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) $updatetarget = true; elseif (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) $updatetarget = true;
$this->db->begin();
$error = 0;
$sql = "UPDATE " . MAIN_DB_PREFIX . "element_element SET "; $sql = "UPDATE " . MAIN_DB_PREFIX . "element_element SET ";
if ($updatesource) if ($updatesource) {
{
$sql .= "fk_source = " . $sourceid; $sql .= "fk_source = " . $sourceid;
$sql .= ", sourcetype = '" . $this->db->escape($sourcetype) . "'"; $sql .= ", sourcetype = '" . $this->db->escape($sourcetype) . "'";
$sql .= " WHERE fk_target = " . $this->id; $sql .= " WHERE fk_target = " . $this->id;
$sql .= " AND targettype = '" . $this->db->escape($this->element) . "'"; $sql .= " AND targettype = '" . $this->db->escape($this->element) . "'";
} elseif ($updatetarget) } elseif ($updatetarget) {
{
$sql .= "fk_target = " . $targetid; $sql .= "fk_target = " . $targetid;
$sql .= ", targettype = '" . $this->db->escape($targettype) . "'"; $sql .= ", targettype = '" . $this->db->escape($targettype) . "'";
$sql .= " WHERE fk_source = " . $this->id; $sql .= " WHERE fk_source = " . $this->id;
@ -3529,11 +3553,29 @@ abstract class CommonObject
} }
dol_syslog(get_class($this) . "::updateObjectLinked", LOG_DEBUG); dol_syslog(get_class($this) . "::updateObjectLinked", LOG_DEBUG);
if ($this->db->query($sql)) if ($this->db->query($sql)) {
{ if (!$notrigger) {
return 1; // Call trigger
$this->context['link_source_id'] = $sourceid;
$this->context['link_source_type'] = $sourcetype;
$this->context['link_target_id'] = $targetid;
$this->context['link_target_type'] = $targettype;
$result = $this->call_trigger('OBJECT_LINK_UPDATE', $f_user);
if ($result < 0) {
$error++;
}
// End call triggers
}
} else { } else {
$this->error = $this->db->lasterror(); $this->error = $this->db->lasterror();
$error++;
}
if (!$error) {
$this->db->commit();
return 1;
} else {
$this->db->rollback();
return -1; return -1;
} }
} }
@ -3546,13 +3588,17 @@ abstract class CommonObject
* @param int $targetid Object target id * @param int $targetid Object target id
* @param string $targettype Object target type * @param string $targettype Object target type
* @param int $rowid Row id of line to delete. If defined, other parameters are not used. * @param int $rowid Row id of line to delete. If defined, other parameters are not used.
* @param User $f_user User that create
* @param int $notrigger 1=Does not execute triggers, 0= execute triggers
* @return int >0 if OK, <0 if KO * @return int >0 if OK, <0 if KO
* @see add_object_linked(), updateObjectLinked(), fetchObjectLinked() * @see add_object_linked(), updateObjectLinked(), fetchObjectLinked()
*/ */
public function deleteObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '', $rowid = '') public function deleteObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '', $rowid = '', $f_user = null, $notrigger = 0)
{ {
global $user;
$deletesource = false; $deletesource = false;
$deletetarget = false; $deletetarget = false;
$f_user = isset($f_user) ? $f_user : $user;
if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource = true; if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource = true;
elseif (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) $deletetarget = true; elseif (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) $deletetarget = true;
@ -3561,19 +3607,33 @@ abstract class CommonObject
$sourcetype = (!empty($sourcetype) ? $sourcetype : $this->element); $sourcetype = (!empty($sourcetype) ? $sourcetype : $this->element);
$targetid = (!empty($targetid) ? $targetid : $this->id); $targetid = (!empty($targetid) ? $targetid : $this->id);
$targettype = (!empty($targettype) ? $targettype : $this->element); $targettype = (!empty($targettype) ? $targettype : $this->element);
$this->db->begin();
$error = 0;
if (!$notrigger) {
// Call trigger
$this->context['link_id'] = $rowid;
$this->context['link_source_id'] = $sourceid;
$this->context['link_source_type'] = $sourcetype;
$this->context['link_target_id'] = $targetid;
$this->context['link_target_type'] = $targettype;
$result = $this->call_trigger('OBJECT_LINK_DELETE', $f_user);
if ($result < 0) {
$error++;
}
// End call triggers
}
if (!$error) {
$sql = "DELETE FROM " . MAIN_DB_PREFIX . "element_element"; $sql = "DELETE FROM " . MAIN_DB_PREFIX . "element_element";
$sql .= " WHERE"; $sql .= " WHERE";
if ($rowid > 0) if ($rowid > 0) {
{
$sql .= " rowid = " . $rowid; $sql .= " rowid = " . $rowid;
} else { } else {
if ($deletesource) if ($deletesource) {
{
$sql .= " fk_source = " . $sourceid . " AND sourcetype = '" . $this->db->escape($sourcetype) . "'"; $sql .= " fk_source = " . $sourceid . " AND sourcetype = '" . $this->db->escape($sourcetype) . "'";
$sql .= " AND fk_target = " . $this->id . " AND targettype = '" . $this->db->escape($this->element) . "'"; $sql .= " AND fk_target = " . $this->id . " AND targettype = '" . $this->db->escape($this->element) . "'";
} elseif ($deletetarget) } elseif ($deletetarget) {
{
$sql .= " fk_target = " . $targetid . " AND targettype = '" . $this->db->escape($targettype) . "'"; $sql .= " fk_target = " . $targetid . " AND targettype = '" . $this->db->escape($targettype) . "'";
$sql .= " AND fk_source = " . $this->id . " AND sourcetype = '" . $this->db->escape($this->element) . "'"; $sql .= " AND fk_source = " . $this->id . " AND sourcetype = '" . $this->db->escape($this->element) . "'";
} else { } else {
@ -3584,13 +3644,19 @@ abstract class CommonObject
} }
dol_syslog(get_class($this) . "::deleteObjectLinked", LOG_DEBUG); dol_syslog(get_class($this) . "::deleteObjectLinked", LOG_DEBUG);
if ($this->db->query($sql)) if (!$this->db->query($sql)) {
{
return 1;
} else {
$this->error = $this->db->lasterror(); $this->error = $this->db->lasterror();
$this->errors[] = $this->error; $this->errors[] = $this->error;
return -1; $error++;
}
}
if (!$error) {
$this->db->commit();
return 1;
} else {
$this->db->rollback();
return 0;
} }
} }