From 3396dfc7f60f31dc3660d7238638be043509354f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 8 Dec 2016 21:58:52 +0100 Subject: [PATCH] NEW Index upload files into database. --- dev/skeletons/build_class_from_table.php | 4 +- dev/skeletons/skeleton_class.class.php | 8 +- htdocs/core/lib/files.lib.php | 55 +- htdocs/ecm/class/ecmdirectory.class.php | 3 +- htdocs/ecm/class/ecmfiles.class.php | 764 ++++++++++++++++++ .../install/mysql/migration/5.0.0-6.0.0.sql | 29 + htdocs/install/mysql/tables/llx_ecm_files.sql | 3 +- 7 files changed, 854 insertions(+), 12 deletions(-) create mode 100644 htdocs/ecm/class/ecmfiles.class.php create mode 100644 htdocs/install/mysql/migration/5.0.0-6.0.0.sql diff --git a/dev/skeletons/build_class_from_table.php b/dev/skeletons/build_class_from_table.php index 62ad1188759..d9e30b23501 100755 --- a/dev/skeletons/build_class_from_table.php +++ b/dev/skeletons/build_class_from_table.php @@ -303,7 +303,7 @@ foreach($property as $key => $prop) $varprop.="\$this->db->escape(\$this->".$prop['field'].")"; $varprop.=".\"'\")"; } - elseif ($prop['field']=='fk_user_mod' || $prop['field']=='fk_user_author') + elseif ($prop['field']=='fk_user_mod' || $prop['field']=='fk_user_m' || $prop['field']=='fk_user_author') { $varprop.="'.\$user->id"; } @@ -367,7 +367,7 @@ foreach($property as $key => $prop) $varprop.=')."\'" : \'null\')'; } - elseif ($prop['field']=='fk_user_mod') { + elseif ($prop['field']=='fk_user_mod' || $prop['field']=='fk_user_m') { $varprop.="'.\$user->id"; } else diff --git a/dev/skeletons/skeleton_class.class.php b/dev/skeletons/skeleton_class.class.php index 4f725fa2dbe..1c9b8cb52bf 100644 --- a/dev/skeletons/skeleton_class.class.php +++ b/dev/skeletons/skeleton_class.class.php @@ -188,11 +188,13 @@ class Skeleton_Class extends CommonObject // Retrieve all extrafields for invoice // fetch optionals attributes and labels + /* require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; $extrafields=new ExtraFields($this->db); $extralabels=$extrafields->fetch_name_optionals_label($this->table_element,true); $this->fetch_optionals($this->id,$extralabels); - + */ + // $this->fetch_lines(); $this->db->free($resql); @@ -254,7 +256,7 @@ class Skeleton_Class extends CommonObject $sql .= ' ' . $this->db->plimit($limit + 1, $offset); } - $this->lines = array(); + //$this->lines = array(); $resql = $this->db->query($sql); if ($resql) { @@ -267,7 +269,7 @@ class Skeleton_Class extends CommonObject $line->prop1 = $obj->field1; $line->prop2 = $obj->field2; - $this->lines[$line->id] = $line; + //$this->lines[$line->id] = $line; //... } $this->db->free($resql); diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index f67f1a0daf4..68e3866f92e 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -743,7 +743,30 @@ function dol_delete_file($file,$disableglob=0,$nophperrors=0,$nohook=0,$object=n { if ($nophperrors) $ok=@unlink($filename); else $ok=unlink($filename); - if ($ok) dol_syslog("Removed file ".$filename, LOG_DEBUG); + if ($ok) + { + dol_syslog("Removed file ".$filename, LOG_DEBUG); + + // Delete entry into ecm database + $rel_filetodelete = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $filename); + if (! preg_match('/\/temp\//', $rel_filetodelete)) // If not a tmp file + { + $rel_filetodelete = preg_replace('/^\//', '', $rel_filetodelete); + + dol_syslog("Try to remove also entries in database for full relative path = ".$rel_filetodelete, LOG_DEBUG); + include DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php'; + $ecmfile=new EcmFiles($db); + $result = $ecmfile->fetch(0, '', $rel_filetodelete); + if ($result >= 0) + { + $result = $ecmfile->delete($user); + } + if ($result < 0) + { + setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings'); + } + } + } else dol_syslog("Failed to remove file ".$filename, LOG_WARNING); // TODO Failure to remove can be because file was already removed or because of permission // If error because of not exists, we must can return true but we should return false if this is a permission problem @@ -1000,7 +1023,7 @@ function dol_init_file_process($pathtoscan='', $trackid='') * @param int $donotupdatesession 1=Do no edit _SESSION variable * @param string $varfiles _FILES var name * @param string $savingdocmask Mask to use to define output filename. For example 'XXXXX-__YYYYMMDD__-__file__' - * @param string $link Link to add + * @param string $link Link to add (to add a link instead of a file) * @param string $trackid Track id (used to prefix name of session vars to avoid conflict) * @return void */ @@ -1043,7 +1066,7 @@ function dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesessio $destpath = $info['dirname'].'/'.$info['filename'].'.'.strtolower($info['extension']); $info = pathinfo($destfile); $destfile = $info['filename'].'.'.strtolower($info['extension']); - + $resupload = dol_move_uploaded_file($TFile['tmp_name'][$i], $destpath, $allowoverwrite, 0, $TFile['error'][$i], 0, $varfiles); if (is_numeric($resupload) && $resupload > 0) { @@ -1057,6 +1080,30 @@ function dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesessio $formmail->trackid = $trackid; $formmail->add_attached_files($destpath, $destfile, $TFile['type'][$i]); } + else // Update table of files + { + $rel_dir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $upload_dir); + if (! preg_match('/\/temp\//', $rel_dir)) // If not a tmp file + { + $rel_dir = preg_replace('/\/$/', '', $rel_dir); + $rel_dir = preg_replace('/^\//', '', $rel_dir); + + include DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php'; + $ecmfile=new EcmFiles($db); + $ecmfile->label = md5_file($destpath); + $ecmfile->filename = $destfile; + $ecmfile->filepath = $rel_dir; + $ecmfile->fullpath_orig = $TFile['name'][$i]; + $ecmfile->gen_or_uploaded = 'uploaded'; + $ecmfile->description = ''; // indexed content + $ecmfile->keyword = ''; // keyword content + $result = $ecmfile->create($user); + if ($result < 0) + { + setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings'); + } + } + } if (image_format_supported($destpath) == 1) { // Create thumbs @@ -1145,7 +1192,7 @@ function dol_remove_file_process($filenb,$donotupdatesession=0,$donotdeletefile= { $pathtodelete=$listofpaths[$keytodelete]; $filetodelete=$listofnames[$keytodelete]; - if (empty($donotdeletefile)) $result = dol_delete_file($pathtodelete,1); + if (empty($donotdeletefile)) $result = dol_delete_file($pathtodelete,1); // The delete of ecm database is inside the function dol_delete_file else $result=0; if ($result >= 0) { diff --git a/htdocs/ecm/class/ecmdirectory.class.php b/htdocs/ecm/class/ecmdirectory.class.php index c16cfe62e7c..1644b58075e 100644 --- a/htdocs/ecm/class/ecmdirectory.class.php +++ b/htdocs/ecm/class/ecmdirectory.class.php @@ -23,8 +23,7 @@ */ /** - * \class EcmDirectory - * \brief Class to manage ECM directories + * Class to manage ECM directories */ class EcmDirectory // extends CommonObject { diff --git a/htdocs/ecm/class/ecmfiles.class.php b/htdocs/ecm/class/ecmfiles.class.php new file mode 100644 index 00000000000..0133bff2580 --- /dev/null +++ b/htdocs/ecm/class/ecmfiles.class.php @@ -0,0 +1,764 @@ + + * Copyright (C) 2014-2016 Juanjo Menent + * Copyright (C) 2015 Florian Henry + * Copyright (C) 2015 Raphaƫl Doursenaud + * Copyright (C) ---Put here your own copyright and developer email--- + * + * 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 . + */ + +/** + * \file ecm/ecmfiles.class.php + * \ingroup ecm + * \brief Class to manage ECM Files (Create/Read/Update/Delete) + */ + +// Put here all includes required by your class file +require_once DOL_DOCUMENT_ROOT . '/core/class/commonobject.class.php'; +//require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php'; +//require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php'; + +/** + * Class to manage ECM files + */ +class EcmFiles //extends CommonObject +{ + /** + * @var string Id to identify managed objects + */ + public $element = 'ecmfiles'; + /** + * @var string Name of table without prefix where object is stored + */ + public $table_element = 'ecm_files'; + + /** + */ + public $label; + public $entity; + public $filename; + public $filepath; + public $fullpath_orig; + public $description; + public $keywords; + public $cover; + public $position; + public $gen_or_uploaded; + public $extraparams; + public $date_c = ''; + public $date_m = ''; + public $fk_user_c; + public $fk_user_m; + public $acl; + + /** + */ + + + /** + * Constructor + * + * @param DoliDb $db Database handler + */ + public function __construct(DoliDB $db) + { + $this->db = $db; + } + + /** + * Create object into database + * + * @param User $user User that creates + * @param bool $notrigger false=launch triggers after, true=disable triggers + * + * @return int <0 if KO, Id of created object if OK + */ + public function create(User $user, $notrigger = false) + { + global $conf; + + dol_syslog(__METHOD__, LOG_DEBUG); + + $error = 0; + + // Clean parameters + + if (isset($this->label)) { + $this->label = trim($this->label); + } + if (isset($this->entity)) { + $this->entity = trim($this->entity); + } + if (isset($this->filename)) { + $this->filename = trim($this->filename); + } + if (isset($this->filepath)) { + $this->filepath = trim($this->filepath); + } + if (isset($this->fullpath_orig)) { + $this->fullpath_orig = trim($this->fullpath_orig); + } + if (isset($this->description)) { + $this->description = trim($this->description); + } + if (isset($this->keywords)) { + $this->keywords = trim($this->keywords); + } + if (isset($this->cover)) { + $this->cover = trim($this->cover); + } + if (isset($this->gen_or_uploaded)) { + $this->gen_or_uploaded = trim($this->gen_or_uploaded); + } + if (isset($this->extraparams)) { + $this->extraparams = trim($this->extraparams); + } + if (isset($this->fk_user_c)) { + $this->fk_user_c = trim($this->fk_user_c); + } + if (isset($this->fk_user_m)) { + $this->fk_user_m = trim($this->fk_user_m); + } + if (isset($this->acl)) { + $this->acl = trim($this->acl); + } + if (empty($this->date_c)) $this->date_c = dol_now(); + + + // Check parameters + // Put here code to add control on parameters values + + // Insert request + $sql = 'INSERT INTO ' . MAIN_DB_PREFIX . $this->table_element . '('; + $sql.= 'label,'; + $sql.= 'entity,'; + $sql.= 'filename,'; + $sql.= 'filepath,'; + $sql.= 'fullpath_orig,'; + $sql.= 'description,'; + $sql.= 'keywords,'; + $sql.= 'cover,'; + $sql.= 'position,'; + $sql.= 'gen_or_uploaded,'; + $sql.= 'extraparams,'; + $sql.= 'date_c,'; + $sql.= 'date_m,'; + $sql.= 'fk_user_c,'; + $sql.= 'fk_user_m,'; + $sql.= 'acl'; + $sql .= ') VALUES ('; + $sql .= ' '.(! isset($this->label)?'NULL':"'".$this->db->escape($this->label)."'").','; + $sql .= ' '.(! isset($this->entity)?$conf->entity:$this->entity).','; + $sql .= ' '.(! isset($this->filename)?'NULL':"'".$this->db->escape($this->filename)."'").','; + $sql .= ' '.(! isset($this->filepath)?'NULL':"'".$this->db->escape($this->filepath)."'").','; + $sql .= ' '.(! isset($this->fullpath_orig)?'NULL':"'".$this->db->escape($this->fullpath_orig)."'").','; + $sql .= ' '.(! isset($this->description)?'NULL':"'".$this->db->escape($this->description)."'").','; + $sql .= ' '.(! isset($this->keywords)?'NULL':"'".$this->db->escape($this->keywords)."'").','; + $sql .= ' '.(! isset($this->cover)?'NULL':"'".$this->db->escape($this->cover)."'").','; + $sql .= ' '.(! isset($this->position)?'0':$this->db->escape($this->position)).','; + $sql .= ' '.(! isset($this->gen_or_uploaded)?'NULL':"'".$this->db->escape($this->gen_or_uploaded)."'").','; + $sql .= ' '.(! isset($this->extraparams)?'NULL':"'".$this->db->escape($this->extraparams)."'").','; + $sql .= ' '."'".$this->db->idate($this->date_c)."'".','; + $sql .= ' '.(! isset($this->date_m) || dol_strlen($this->date_m)==0?'NULL':"'".$this->db->idate($this->date_m)."'").','; + $sql .= ' '.(! isset($this->fk_user_c)?$user->id:$this->fk_user_c).','; + $sql .= ' '.(! isset($this->fk_user_m)?'NULL':$this->fk_user_m).','; + $sql .= ' '.(! isset($this->acl)?'NULL':"'".$this->db->escape($this->acl)."'"); + $sql .= ')'; + + $this->db->begin(); + + $resql = $this->db->query($sql); + if (!$resql) { + $error ++; + $this->errors[] = 'Error ' . $this->db->lasterror(); + dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); + } + + if (!$error) { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element); + + if (!$notrigger) { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action to call a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_CREATE',$user); + //if ($result < 0) $error++; + //// End call triggers + } + } + + // Commit or rollback + if ($error) { + $this->db->rollback(); + + return - 1 * $error; + } else { + $this->db->commit(); + + return $this->id; + } + } + + /** + * Load object in memory from the database + * + * @param int $id Id object + * @param string $ref Ref = md5 = label + * @param string $fullpath Full path of file (relative path to document directory) + * @return int <0 if KO, 0 if not found, >0 if OK + */ + public function fetch($id, $ref = null, $fullpath = '') + { + dol_syslog(__METHOD__, LOG_DEBUG); + + $sql = 'SELECT'; + $sql .= ' t.rowid,'; + $sql .= " t.label,"; + $sql .= " t.entity,"; + $sql .= " t.filename,"; + $sql .= " t.filepath,"; + $sql .= " t.fullpath_orig,"; + $sql .= " t.description,"; + $sql .= " t.keywords,"; + $sql .= " t.cover,"; + $sql .= " t.position,"; + $sql .= " t.gen_or_uploaded,"; + $sql .= " t.extraparams,"; + $sql .= " t.date_c,"; + $sql .= " t.date_m,"; + $sql .= " t.fk_user_c,"; + $sql .= " t.fk_user_m,"; + $sql .= " t.acl"; + $sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t'; + $sql.= ' WHERE 1 = 1'; + if (! empty($conf->multicompany->enabled)) { + $sql .= " AND entity IN (" . getEntity("ecmfiles", 1) . ")"; + } + if ($fullpath) { + $sql .= " AND t.filepath = '" . $this->db->escape(dirname($fullpath)) . "' AND t.filename = '".$this->db->escape(basename($fullpath))."'"; + } + elseif (null !== $ref) { + $sql .= " AND t.label = '".$this->db->escape($ref)."'"; + } else { + $sql .= ' AND t.rowid = ' . $id; + } + + $resql = $this->db->query($sql); + if ($resql) { + $numrows = $this->db->num_rows($resql); + if ($numrows) { + $obj = $this->db->fetch_object($resql); + + $this->id = $obj->rowid; + + $this->label = $obj->label; + $this->entity = $obj->entity; + $this->filename = $obj->filename; + $this->filepath = $obj->filepath; + $this->fullpath_orig = $obj->fullpath_orig; + $this->description = $obj->description; + $this->keywords = $obj->keywords; + $this->cover = $obj->cover; + $this->position = $obj->position; + $this->gen_or_uploaded = $obj->gen_or_uploaded; + $this->extraparams = $obj->extraparams; + $this->date_c = $this->db->jdate($obj->date_c); + $this->date_m = $this->db->jdate($obj->date_m); + $this->fk_user_c = $obj->fk_user_c; + $this->fk_user_m = $obj->fk_user_m; + $this->acl = $obj->acl; + } + + // Retrieve all extrafields for invoice + // fetch optionals attributes and labels + /* + require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + $extrafields=new ExtraFields($this->db); + $extralabels=$extrafields->fetch_name_optionals_label($this->table_element,true); + $this->fetch_optionals($this->id,$extralabels); + */ + // $this->fetch_lines(); + + $this->db->free($resql); + + if ($numrows) { + return 1; + } else { + return 0; + } + } else { + $this->errors[] = 'Error ' . $this->db->lasterror(); + dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); + + return - 1; + } + } + + /** + * Load object in memory from the database + * + * @param string $sortorder Sort Order + * @param string $sortfield Sort field + * @param int $limit offset limit + * @param int $offset offset limit + * @param array $filter filter array + * @param string $filtermode filter mode (AND or OR) + * + * @return int <0 if KO, >0 if OK + */ + public function fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter = array(), $filtermode='AND') + { + dol_syslog(__METHOD__, LOG_DEBUG); + + $sql = 'SELECT'; + $sql .= ' t.rowid,'; + $sql .= " t.label,"; + $sql .= " t.entity,"; + $sql .= " t.filename,"; + $sql .= " t.filepath,"; + $sql .= " t.fullpath_orig,"; + $sql .= " t.description,"; + $sql .= " t.keywords,"; + $sql .= " t.cover,"; + $sql .= " t.position,"; + $sql .= " t.gen_or_uploaded,"; + $sql .= " t.extraparams,"; + $sql .= " t.date_c,"; + $sql .= " t.date_m,"; + $sql .= " t.fk_user_c,"; + $sql .= " t.fk_user_m,"; + $sql .= " t.acl"; + $sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element. ' as t'; + + // Manage filter + $sqlwhere = array(); + if (count($filter) > 0) { + foreach ($filter as $key => $value) { + $sqlwhere [] = $key . ' LIKE \'%' . $this->db->escape($value) . '%\''; + } + } + $sql.= ' WHERE 1 = 1'; + if (! empty($conf->multicompany->enabled)) { + $sql .= " AND entity IN (" . getEntity("ecmfiles", 1) . ")"; + } + if (count($sqlwhere) > 0) { + $sql .= ' AND ' . implode(' '.$filtermode.' ', $sqlwhere); + } + if (!empty($sortfield)) { + $sql .= $this->db->order($sortfield,$sortorder); + } + if (!empty($limit)) { + $sql .= ' ' . $this->db->plimit($limit + 1, $offset); + } + + $this->lines = array(); + + $resql = $this->db->query($sql); + if ($resql) { + $num = $this->db->num_rows($resql); + + while ($obj = $this->db->fetch_object($resql)) { + $line = new EcmfilesLine(); + + $line->id = $obj->rowid; + + $line->label = $obj->label; + $line->entity = $obj->entity; + $line->filename = $obj->filename; + $line->filepath = $obj->filepath; + $line->fullpath_orig = $obj->fullpath_orig; + $line->description = $obj->description; + $line->keywords = $obj->keywords; + $line->cover = $obj->cover; + $line->position = $obj->position; + $line->gen_or_uploaded = $obj->gen_or_uploaded; + $line->extraparams = $obj->extraparams; + $line->date_c = $this->db->jdate($obj->date_c); + $line->date_m = $this->db->jdate($obj->date_m); + $line->fk_user_c = $obj->fk_user_c; + $line->fk_user_m = $obj->fk_user_m; + $line->acl = $obj->acl; + } + $this->db->free($resql); + + return $num; + } else { + $this->errors[] = 'Error ' . $this->db->lasterror(); + dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); + + return - 1; + } + } + + /** + * Update object into database + * + * @param User $user User that modifies + * @param bool $notrigger false=launch triggers after, true=disable triggers + * + * @return int <0 if KO, >0 if OK + */ + public function update(User $user, $notrigger = false) + { + $error = 0; + + dol_syslog(__METHOD__, LOG_DEBUG); + + // Clean parameters + + if (isset($this->label)) { + $this->label = trim($this->label); + } + if (isset($this->entity)) { + $this->entity = trim($this->entity); + } + if (isset($this->filename)) { + $this->filename = trim($this->filename); + } + if (isset($this->filepath)) { + $this->filepath = trim($this->filepath); + } + if (isset($this->fullpath_orig)) { + $this->fullpath_orig = trim($this->fullpath_orig); + } + if (isset($this->description)) { + $this->description = trim($this->description); + } + if (isset($this->keywords)) { + $this->keywords = trim($this->keywords); + } + if (isset($this->cover)) { + $this->cover = trim($this->cover); + } + if (isset($this->gen_or_uploaded)) { + $this->gen_or_uploaded = trim($this->gen_or_uploaded); + } + if (isset($this->extraparams)) { + $this->extraparams = trim($this->extraparams); + } + if (isset($this->fk_user_c)) { + $this->fk_user_c = trim($this->fk_user_c); + } + if (isset($this->fk_user_m)) { + $this->fk_user_m = trim($this->fk_user_m); + } + if (isset($this->acl)) { + $this->acl = trim($this->acl); + } + + + + // Check parameters + // Put here code to add a control on parameters values + + // Update request + $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element . ' SET'; + $sql .= ' label = '.(isset($this->label)?"'".$this->db->escape($this->label)."'":"null").','; + $sql .= ' entity = '.(isset($this->entity)?$this->entity:$conf->entity).','; + $sql .= ' filename = '.(isset($this->filename)?"'".$this->db->escape($this->filename)."'":"null").','; + $sql .= ' filepath = '.(isset($this->filepath)?"'".$this->db->escape($this->filepath)."'":"null").','; + $sql .= ' fullpath_orig = '.(isset($this->fullpath_orig)?"'".$this->db->escape($this->fullpath_orig)."'":"null").','; + $sql .= ' description = '.(isset($this->description)?"'".$this->db->escape($this->description)."'":"null").','; + $sql .= ' keywords = '.(isset($this->keywords)?"'".$this->db->escape($this->keywords)."'":"null").','; + $sql .= ' cover = '.(isset($this->cover)?"'".$this->db->escape($this->cover)."'":"null").','; + $sql .= ' position = '.(isset($this->position)?$this->db->escape($this->position):"0").','; + $sql .= ' gen_or_uploaded = '.(isset($this->gen_or_uploaded)?"'".$this->db->escape($this->gen_or_uploaded)."'":"null").','; + $sql .= ' extraparams = '.(isset($this->extraparams)?"'".$this->db->escape($this->extraparams)."'":"null").','; + $sql .= ' date_c = '.(! isset($this->date_c) || dol_strlen($this->date_c) != 0 ? "'".$this->db->idate($this->date_c)."'" : 'null').','; + $sql .= ' date_m = '.(! isset($this->date_m) || dol_strlen($this->date_m) != 0 ? "'".$this->db->idate($this->date_m)."'" : 'null').','; + $sql .= ' fk_user_c = '.(isset($this->fk_user_c)?$this->fk_user_c:"null").','; + $sql .= ' fk_user_m = '.(isset($this->fk_user_m)?$this->fk_user_m:"null").','; + $sql .= ' acl = '.(isset($this->acl)?"'".$this->db->escape($this->acl)."'":"null"); + $sql .= ' WHERE rowid=' . $this->id; + + $this->db->begin(); + + $resql = $this->db->query($sql); + if (!$resql) { + $error ++; + $this->errors[] = 'Error ' . $this->db->lasterror(); + dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); + } + + if (!$error && !$notrigger) { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_MODIFY',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + } + + // Commit or rollback + if ($error) { + $this->db->rollback(); + + return - 1 * $error; + } else { + $this->db->commit(); + + return 1; + } + } + + /** + * Delete object in database + * + * @param User $user User that deletes + * @param bool $notrigger false=launch triggers after, true=disable triggers + * + * @return int <0 if KO, >0 if OK + */ + public function delete(User $user, $notrigger = false) + { + dol_syslog(__METHOD__, LOG_DEBUG); + + $error = 0; + + $this->db->begin(); + + if (!$error) { + if (!$notrigger) { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_DELETE',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + } + } + + // If you need to delete child tables to, you can insert them here + + if (!$error) { + $sql = 'DELETE FROM ' . MAIN_DB_PREFIX . $this->table_element; + $sql .= ' WHERE rowid=' . $this->id; + + $resql = $this->db->query($sql); + if (!$resql) { + $error ++; + $this->errors[] = 'Error ' . $this->db->lasterror(); + dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); + } + } + + // Commit or rollback + if ($error) { + $this->db->rollback(); + + return - 1 * $error; + } else { + $this->db->commit(); + + return 1; + } + } + + /** + * Load an object from its id and create a new one in database + * + * @param int $fromid Id of object to clone + * + * @return int New id of clone + */ + public function createFromClone($fromid) + { + dol_syslog(__METHOD__, LOG_DEBUG); + + global $user; + $error = 0; + $object = new Ecmfiles($this->db); + + $this->db->begin(); + + // Load source object + $object->fetch($fromid); + // Reset object + $object->id = 0; + + // Clear fields + // ... + + // Create clone + $result = $object->create($user); + + // Other options + if ($result < 0) { + $error ++; + $this->errors = $object->errors; + dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); + } + + // End + if (!$error) { + $this->db->commit(); + + return $object->id; + } else { + $this->db->rollback(); + + return - 1; + } + } + + /** + * Return a link to the object card (with optionaly the picto) + * + * @param int $withpicto Include picto in link (0=No picto, 1=Include picto into link, 2=Only picto) + * @param string $option On what the link point to + * @param int $notooltip 1=Disable tooltip + * @param int $maxlen Max length of visible user name + * @param string $morecss Add more css on link + * @return string String with URL + */ + function getNomUrl($withpicto=0, $option='', $notooltip=0, $maxlen=24, $morecss='') + { + global $db, $conf, $langs; + global $dolibarr_main_authentication, $dolibarr_main_demo; + global $menumanager; + + if (! empty($conf->dol_no_mouse_hover)) $notooltip=1; // Force disable tooltips + + $result = ''; + $companylink = ''; + + $label = '' . $langs->trans("MyModule") . ''; + $label.= '
'; + $label.= '' . $langs->trans('Ref') . ': ' . $this->ref; + + $url = DOL_URL_ROOT.'/ecm/'.$this->table_name.'_card.php?id='.$this->id; + + $linkclose=''; + if (empty($notooltip)) + { + if (! empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) + { + $label=$langs->trans("ShowProject"); + $linkclose.=' alt="'.dol_escape_htmltag($label, 1).'"'; + } + $linkclose.=' title="'.dol_escape_htmltag($label, 1).'"'; + $linkclose.=' class="classfortooltip'.($morecss?' '.$morecss:'').'"'; + } + else $linkclose = ($morecss?' class="'.$morecss.'"':''); + + $linkstart = ''; + $linkend=''; + + if ($withpicto) + { + $result.=($linkstart.img_object(($notooltip?'':$label), 'label', ($notooltip?'':'class="classfortooltip"')).$linkend); + if ($withpicto != 2) $result.=' '; + } + $result.= $linkstart . $this->ref . $linkend; + return $result; + } + + /** + * Retourne le libelle du status d'un user (actif, inactif) + * + * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto + * @return string Label of status + */ + function getLibStatut($mode=0) + { + return $this->LibStatut($this->status,$mode); + } + + /** + * Return the status + * + * @param int $status Id status + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 5=Long label + Picto + * @return string Label of status + */ + static function LibStatut($status,$mode=0) + { + global $langs; + + if ($mode == 0) + { + $prefix=''; + if ($status == 1) return $langs->trans('Enabled'); + if ($status == 0) return $langs->trans('Disabled'); + } + if ($mode == 1) + { + if ($status == 1) return $langs->trans('Enabled'); + if ($status == 0) return $langs->trans('Disabled'); + } + if ($mode == 2) + { + if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4').' '.$langs->trans('Enabled'); + if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5').' '.$langs->trans('Disabled'); + } + if ($mode == 3) + { + if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4'); + if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5'); + } + if ($mode == 4) + { + if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4').' '.$langs->trans('Enabled'); + if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5').' '.$langs->trans('Disabled'); + } + if ($mode == 5) + { + if ($status == 1) return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'),'statut4'); + if ($status == 0) return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'),'statut5'); + } + if ($mode == 6) + { + if ($status == 1) return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'),'statut4'); + if ($status == 0) return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'),'statut5'); + } + } + + + /** + * Initialise object with example values + * Id must be 0 if object instance is a specimen + * + * @return void + */ + public function initAsSpecimen() + { + global $conf,$user; + + $this->id = 0; + + $this->label = '0a1b2c3e4f59999999'; + $this->entity = '1'; + $this->filename = 'myspecimenfilefile.pdf'; + $this->filepath = '/aaa/bbb'; + $this->fullpath_orig = 'c:/file on my disk.pdf'; + $this->description = 'This is a long description of file'; + $this->keywords = 'key1,key2'; + $this->cover = '1'; + $this->position = '5'; + $this->gen_or_uploaded = 'uploaded'; + $this->extraparams = ''; + $this->date_c = (dol_now() - 3600 * 24 * 10); + $this->date_m = ''; + $this->fk_user_c = $user->id; + $this->fk_user_m = ''; + $this->acl = ''; + } + +} + diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql new file mode 100644 index 00000000000..9c6aefdec6d --- /dev/null +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -0,0 +1,29 @@ +-- +-- Be carefull to requests order. +-- This file must be loaded by calling /install/index.php page +-- when current version is 5.0.0 or higher. +-- +-- To rename a table: ALTER TABLE llx_table RENAME TO llx_table_new; +-- To add a column: ALTER TABLE llx_table ADD COLUMN newcol varchar(60) NOT NULL DEFAULT '0' AFTER existingcol; +-- To rename a column: ALTER TABLE llx_table CHANGE COLUMN oldname newname varchar(60); +-- To drop a column: ALTER TABLE llx_table DROP COLUMN oldname; +-- To change type of field: ALTER TABLE llx_table MODIFY COLUMN name varchar(60); +-- To drop a foreign key: ALTER TABLE llx_table DROP FOREIGN KEY fk_name; +-- To drop an index: -- VMYSQL4.0 DROP INDEX nomindex on llx_table +-- To drop an index: -- VPGSQL8.0 DROP INDEX nomindex +-- To restrict request to Mysql version x.y minimum use -- VMYSQLx.y +-- To restrict request to Pgsql version x.y minimum use -- VPGSQLx.y +-- To make pk to be auto increment (mysql): -- VMYSQL4.3 ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid rowid INTEGER NOT NULL AUTO_INCREMENT; +-- To make pk to be auto increment (postgres): -- VPGSQL8.2 NOT POSSIBLE. MUST DELETE/CREATE TABLE +-- To set a field as NULL: -- VMYSQL4.3 ALTER TABLE llx_table MODIFY COLUMN name varchar(60) NULL; +-- To set a field as NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name DROP NOT NULL; +-- To set a field as NOT NULL: -- VMYSQL4.3 ALTER TABLE llx_table MODIFY COLUMN name varchar(60) NOT NULL; +-- To set a field as NOT NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name SET NOT NULL; +-- To set a field as default NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name SET DEFAULT NULL; +-- Note: fields with type BLOB/TEXT can't have default value. +-- -- VPGSQL8.2 DELETE FROM llx_usergroup_user WHERE fk_user NOT IN (SELECT rowid from llx_user); +-- -- VMYSQL4.1 DELETE FROM llx_usergroup_user WHERE fk_usergroup NOT IN (SELECT rowid from llx_usergroup); + + +ALTER TABLE llx_ecm_files CHANGE COLUMN fullpath filepath varchar(750); +ALTER TABLE llx_ecm_files ADD COLUMN position integer; diff --git a/htdocs/install/mysql/tables/llx_ecm_files.sql b/htdocs/install/mysql/tables/llx_ecm_files.sql index 8310c160384..7a30066c2b2 100644 --- a/htdocs/install/mysql/tables/llx_ecm_files.sql +++ b/htdocs/install/mysql/tables/llx_ecm_files.sql @@ -21,12 +21,13 @@ CREATE TABLE llx_ecm_files rowid integer AUTO_INCREMENT PRIMARY KEY, label varchar(64) NOT NULL, entity integer DEFAULT 1 NOT NULL, -- multi company id + filepath varchar(750) NOT NULL, -- relative to dolibarr document dir. example module/def filename varchar(255) NOT NULL, -- file name only without any directory - fullpath varchar(750) NOT NULL, -- relative to dolibarr document dir. example abc/def/myfile fullpath_orig varchar(750), -- full path of original filename, when file is uploaded from a local computer description text, keywords text, -- list of keywords, separated with comma cover text, -- is this file a file to use for a cover + position integer, -- position of file among others gen_or_uploaded varchar(12), -- 'generated' or 'uploaded' extraparams varchar(255), -- for stocking other parameters with json format date_c datetime,