mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2026-01-02 15:12:29 +01:00
Fix: Little debug of add link feature. Link was broken because of missing http, fix W3C making output wrong with some browsers.
373 lines
12 KiB
PHP
373 lines
12 KiB
PHP
<?php
|
|
/* Copyright (C) 2013 Cédric Salvador <csalvador@gpcsolutions.fr>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* \file htdocs/link/class/link.class.php
|
|
* \ingroup link
|
|
* \brief File for link class
|
|
*/
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
|
|
|
|
|
|
/**
|
|
* Class to manage links
|
|
*/
|
|
class Link extends CommonObject
|
|
{
|
|
public $element = 'link';
|
|
public $table_element = 'links';
|
|
|
|
public $id;
|
|
public $entity;
|
|
public $datea;
|
|
public $url;
|
|
public $label;
|
|
public $objecttype;
|
|
public $objectid;
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param DoliDB $db Database handler
|
|
*/
|
|
public function __construct($db)
|
|
{
|
|
global $conf;
|
|
|
|
$this->db = $db;
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
/**
|
|
* Create link in database
|
|
*
|
|
* @param User $user Object of user that ask creation
|
|
* @return int >= 0 if OK, < 0 if KO
|
|
*/
|
|
public function create($user='')
|
|
{
|
|
global $langs,$conf;
|
|
|
|
$error=0;
|
|
$langs->load("errors");
|
|
// Clean parameters
|
|
if (empty($this->label)) {
|
|
$this->label = trim(basename($this->url));
|
|
}
|
|
if (empty($this->datea)) {
|
|
$this->datea = dol_now();
|
|
}
|
|
$this->url = trim($this->url);
|
|
|
|
dol_syslog(get_class($this)."::create ".$this->url);
|
|
|
|
// Check parameters
|
|
if (empty($this->url)) {
|
|
$this->error = $langs->trans("NoUrl");
|
|
return -1;
|
|
}
|
|
|
|
$this->db->begin();
|
|
|
|
$sql = "INSERT INTO ".MAIN_DB_PREFIX."links (entity, datea, url, label, objecttype, objectid)";
|
|
$sql .= " VALUES ('".$conf->entity."', '".$this->db->idate($this->datea)."'";
|
|
$sql .= ", '" . $this->db->escape($this->url) . "'";
|
|
$sql .= ", '" . $this->db->escape($this->label) . "'";
|
|
$sql .= ", '" . $this->objecttype . "'";
|
|
$sql .= ", " . $this->objectid . ")";
|
|
|
|
dol_syslog(get_class($this)."::create sql=".$sql);
|
|
$result = $this->db->query($sql);
|
|
if ($result) {
|
|
$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . "links");
|
|
|
|
if ($this->id > 0) {
|
|
// Appel des triggers
|
|
include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
|
|
$interface=new Interfaces($this->db);
|
|
$result=$interface->run_triggers('LINK_CREATE', $this, $user, $langs, $conf);
|
|
if ($result < 0) {
|
|
$error++;
|
|
$this->errors = $interface->errors;
|
|
}
|
|
// Fin appel triggers
|
|
} else {
|
|
$error++;
|
|
}
|
|
|
|
if (! $error)
|
|
{
|
|
dol_syslog(get_class($this)."::Create success id=" . $this->id);
|
|
$this->db->commit();
|
|
return $this->id;
|
|
}
|
|
else
|
|
{
|
|
dol_syslog(get_class($this)."::Create echec update " . $this->error, LOG_ERR);
|
|
$this->db->rollback();
|
|
return -3;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
|
|
{
|
|
|
|
$this->error=$langs->trans("ErrorCompanyNameAlreadyExists",$this->name);
|
|
$result=-1;
|
|
}
|
|
else
|
|
{
|
|
$this->error=$this->db->lasterror();
|
|
dol_syslog(get_class($this)."::Create fails insert sql=".$sql, LOG_ERR);
|
|
$result=-2;
|
|
}
|
|
$this->db->rollback();
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update parameters of third party
|
|
*
|
|
* @param User $user User executing update
|
|
* @param int $call_trigger 0=no, 1=yes
|
|
* @return int <0 if KO, >=0 if OK
|
|
*/
|
|
public function update($user='', $call_trigger=1)
|
|
{
|
|
global $langs,$conf;
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
|
|
|
$langs->load("errors");
|
|
$error=0;
|
|
|
|
dol_syslog(get_class($this)."::Update id = " . $this->id . " call_trigger = " . $call_trigger);
|
|
|
|
// Check parameters
|
|
if (empty($this->url))
|
|
{
|
|
$this->error = $langs->trans("NoURL");
|
|
return -1;
|
|
}
|
|
|
|
// Clean parameters
|
|
$this->url = clean_url($this->url,1);
|
|
if (empty($this->label)) $this->label = basename($this->url);
|
|
$this->label = trim($this->label);
|
|
|
|
|
|
$this->db->begin();
|
|
|
|
$sql = "UPDATE " . MAIN_DB_PREFIX . "links SET ";
|
|
$sql .= "entity = '" . $conf->entity ."'";
|
|
$sql .= ", datea = '" . $this->db->idate(dol_now()) . "'";
|
|
$sql .= ", url = '" . $this->db->escape($this->url) . "'";
|
|
$sql .= ", label = '" . $this->db->escape($this->label) . "'";
|
|
$sql .= ", objecttype = '" . $this->objecttype . "'";
|
|
$sql .= ", objectid = " . $this->objectid;
|
|
$sql .= " WHERE rowid = '" . $this->id ."'";
|
|
|
|
|
|
dol_syslog(get_class($this)."::Update sql = " .$sql);
|
|
$resql = $this->db->query($sql);
|
|
if ($resql)
|
|
{
|
|
if ($call_trigger)
|
|
{
|
|
// Appel des triggers
|
|
include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
|
|
$interface = new Interfaces($this->db);
|
|
$result = $interface->run_triggers('LINK_MODIFY', $this, $user, $langs, $conf);
|
|
if ($result < 0) {
|
|
$error++;
|
|
$this->errors = $interface->errors;
|
|
}
|
|
// Fin appel triggers
|
|
}
|
|
|
|
if (! $error)
|
|
{
|
|
dol_syslog(get_class($this) . "::Update success");
|
|
$this->db->commit();
|
|
return 1;
|
|
} else {
|
|
$this->db->rollback();
|
|
return -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
|
|
{
|
|
// Doublon
|
|
$this->error = $langs->trans("ErrorDuplicateField");
|
|
$result = -1;
|
|
}
|
|
else
|
|
{
|
|
$this->error = $langs->trans("Error sql = " . $sql);
|
|
dol_syslog(get_class($this) . "::Update fails update = " . $this->error, LOG_ERR);
|
|
$result = -2;
|
|
}
|
|
$this->db->rollback();
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Loads all links from database
|
|
*
|
|
* @param array &$links array of Link objects to fill
|
|
* @param string $objecttype type of the associated object in dolibarr
|
|
* @param int $objectid id of the associated object in dolibarr
|
|
* @param string $sortfield field used to sort
|
|
* @param string $sortorder sort order
|
|
* @return 1 if ok, 0 if no records, -1 if error
|
|
*
|
|
* */
|
|
public function fetchAll(&$links, $objecttype, $objectid, $sortfield=null, $sortorder=null)
|
|
{
|
|
global $conf;
|
|
$sql = "SELECT rowid, entity, datea, url, label , objecttype, objectid FROM " . MAIN_DB_PREFIX . "links";
|
|
$sql .= " WHERE objecttype = '" . $objecttype . "' AND objectid = " . $objectid;
|
|
if($conf->entity != 0) $sql .= " AND entity = " . $conf->entity;
|
|
if ($sortfield) {
|
|
if (empty($sortorder)) {
|
|
$sortorder = "ASC";
|
|
}
|
|
$sql .= " ORDER BY " . $sortfield . " " . $sortorder;
|
|
}
|
|
$resql = $this->db->query($sql);
|
|
dol_syslog(get_class($this)."::fetchAll " . $sql, LOG_DEBUG);
|
|
if ($resql) {
|
|
$num = $this->db->num_rows($resql);
|
|
dol_syslog(get_class($this)."::fetchAll " . $num . "records", LOG_DEBUG);
|
|
if ($num > 0) {
|
|
while ($obj = $this->db->fetch_object($resql)) {
|
|
$link = new Link($db);
|
|
$link->id = $obj->rowid;
|
|
$link->entity = $obj->entity;
|
|
$link->datea = $this->db->jdate($obj->datea);
|
|
$link->url = $obj->url;
|
|
$link->label = $obj->label;
|
|
$link->objecttype = $obj->objecttype;
|
|
$link->objectid = $obj->objectid;
|
|
$links[] = $link;
|
|
}
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
} else {
|
|
dol_syslog(get_class($this) . "::FetchAll fails sql=" . $sql, LOG_ERR);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Loads a link from database
|
|
* @param rowid id of link to load
|
|
* @return int 1 if ok, 0 if no record found, -1 if error
|
|
*
|
|
* */
|
|
public function fetch($rowid=null)
|
|
{
|
|
global $conf;
|
|
if (empty($rowid)) {
|
|
$rowid = $this->id;
|
|
}
|
|
$sql = "SELECT rowid, entity, datea, url, label, objecttype, objectid FROM " . MAIN_DB_PREFIX . "links";
|
|
$sql .= " WHERE rowid = " . $rowid;
|
|
if($conf->entity != 0) $sql .= " AND entity = " . $conf->entity;
|
|
$resql = $this->db->query($sql);
|
|
dol_syslog(get_class($this)."::fetch " . $sql, LOG_DEBUG);
|
|
if ($resql) {
|
|
if($this->db->num_rows($resql) > 0) {
|
|
$obj = $this->db->fetch_object($resql);
|
|
$this->entity = $obj->entity;
|
|
$this->datea = $this->db->jdate($obj->datea);
|
|
$this->url = $obj->url;
|
|
$this->label = $obj->label;
|
|
$this->objecttype = $obj->objecttype;
|
|
$this->objectid = $obj->objectid;
|
|
return 1;
|
|
} else {
|
|
$this->error = 'Fetch no link found for id = ' . $rowid;
|
|
dol_syslog($this->error, LOG_ERR);
|
|
return 0;
|
|
}
|
|
} else {
|
|
dol_syslog($this->db->error(), LOG_ERR);
|
|
$this->error=$this->db->error();
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Delete a link from database
|
|
*
|
|
* @return int <0 if KO, 0 if nothing done, >0 if OK
|
|
*/
|
|
public function delete()
|
|
{
|
|
global $user, $langs, $conf;
|
|
|
|
dol_syslog(get_class($this)."::delete", LOG_DEBUG);
|
|
$error = 0;
|
|
|
|
$this->db->begin();
|
|
|
|
// Remove link
|
|
|
|
$sql = "DELETE FROM " . MAIN_DB_PREFIX . "links";
|
|
$sql.= " WHERE rowid = " . $this->id;
|
|
dol_syslog(get_class($this)."::delete sql=" . $sql, LOG_DEBUG);
|
|
if (! $this->db->query($sql)) {
|
|
$error++;
|
|
$this->error = $this->db->lasterror();
|
|
dol_syslog(get_class($this)."::delete error -4 " . $this->error, LOG_ERR);
|
|
}
|
|
|
|
|
|
if (! $error) {
|
|
// Appel des triggers
|
|
include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
|
|
$interface=new Interfaces($this->db);
|
|
$result = $interface->run_triggers('LINK_DELETE', $this, $user, $langs, $conf);
|
|
if ($result < 0) {
|
|
$error++;
|
|
$this->errors = $interface->errors;
|
|
}
|
|
// Fin appel triggers
|
|
}
|
|
|
|
if (! $error) {
|
|
$this->db->commit();
|
|
|
|
return 1;
|
|
} else {
|
|
$this->db->rollback();
|
|
return -1;
|
|
}
|
|
|
|
}
|
|
|
|
}
|