New: A lot of enhancements into ECM module. Dir can contains special characters. Speed enhancements. Dir can be created outside of dolibarr, the refresh button will update database.

This commit is contained in:
Laurent Destailleur 2010-10-03 15:42:01 +00:00
parent 640e03422f
commit a6c0e62107
9 changed files with 278 additions and 115 deletions

View File

@ -66,6 +66,9 @@ class Conf
var $logbuffer = array(); var $logbuffer = array();
var $filesystem_forbidden_chars = array('<','>',':','/','\\','?','*','|','"');
/** /**
* Constructor * Constructor
* *

View File

@ -51,6 +51,8 @@ class EcmDirectory // extends CommonObject
var $cats=array(); var $cats=array();
var $motherof=array(); var $motherof=array();
var $forbiddenchars = array('<','>',':','/','\\','?','*','|','"');
/** /**
* \brief Constructor * \brief Constructor
@ -64,18 +66,18 @@ class EcmDirectory // extends CommonObject
/** /**
* \brief Create record into database * Create record into database
* \param user User that create * @param user User that create
* \return int <0 si ko, >0 si ok * @return int <0 if KO, >0 if OK
*/ */
function create($user) function create($user)
{ {
global $conf, $langs; global $conf, $langs;
$now=time(); $now=dol_now();
// Clean parameters // Clean parameters
$this->label=dol_string_nospecial(trim($this->label)); $this->label=dol_sanitizeFileName(trim($this->label));
$this->fk_parent=trim($this->fk_parent); $this->fk_parent=trim($this->fk_parent);
$this->description=trim($this->description); $this->description=trim($this->description);
if (! $this->cachenbofdoc) $this->cachenbofdoc=0; if (! $this->cachenbofdoc) $this->cachenbofdoc=0;
@ -83,6 +85,7 @@ class EcmDirectory // extends CommonObject
$this->fk_user_c=$user->id; $this->fk_user_c=$user->id;
if ($this->fk_parent <= 0) $this->fk_parent=0; if ($this->fk_parent <= 0) $this->fk_parent=0;
// Check if same directory does not exists with this name // Check if same directory does not exists with this name
$relativepath=$this->label; $relativepath=$this->label;
if ($this->fk_parent) if ($this->fk_parent)
@ -99,7 +102,7 @@ class EcmDirectory // extends CommonObject
$pathfound=0; $pathfound=0;
foreach ($cate_arbo as $key => $categ) foreach ($cate_arbo as $key => $categ)
{ {
$path=preg_replace('/([\s-><\/])+/i','/',$categ['fulllabel']); $path=str_replace($this->forbiddenchars,'_',$categ['fulllabel']);
//print $path.'<br>'; //print $path.'<br>';
if ($path == $relativepath) if ($path == $relativepath)
{ {
@ -352,7 +355,7 @@ class EcmDirectory // extends CommonObject
} }
else else
{ {
$this->error='ErrorFailedToDeleteDir'; $this->error='ErrorFailToDeleteDir';
dol_syslog("EcmDirectories::delete ".$this->error, LOG_ERR); dol_syslog("EcmDirectories::delete ".$this->error, LOG_ERR);
$this->db->rollback(); $this->db->rollback();
$error++; $error++;
@ -408,7 +411,8 @@ class EcmDirectory // extends CommonObject
//$picto=DOL_URL_ROOT.'/theme/common/treemenu/folder.gif'; //$picto=DOL_URL_ROOT.'/theme/common/treemenu/folder.gif';
$picto='dir'; $picto='dir';
$newref=str_replace('_',' ',$this->ref); //$newref=str_replace('_',' ',$this->ref);
$newref=$this->ref;
$newlabel=$langs->trans("ShowECMSection").': '.$newref; $newlabel=$langs->trans("ShowECMSection").': '.$newref;
if ($withpicto) $result.=($lien.img_object($newlabel,$picto,'',1).$lienfin); if ($withpicto) $result.=($lien.img_object($newlabel,$picto,'',1).$lienfin);
@ -491,22 +495,22 @@ class EcmDirectory // extends CommonObject
/** /**
* \brief Reconstruit l'arborescence des categories sous la forme d'un tableau * Reconstruit l'arborescence des categories sous la forme d'un tableau
* Renvoi un tableau de tableau('id','id_mere',...) trie selon * Renvoi un tableau de tableau('id','id_mere',...) trie selon arbre et avec:
* arbre et avec: * id Id de la categorie
* id = id de la categorie * id_mere Id de la categorie mere
* id_mere = id de la categorie mere * id_children Tableau des id enfant
* id_children = tableau des id enfant * label Name of directory
* label = nom de la categorie * cachenbofdoc Nb of documents
* cachenbofdoc = nb of documents * date_c Date creation
* date_c = date creation * fk_user_c User creation
* fk_user_c = user creation * login_c Login creation
* login_c = login creation * fullpath Full path of id (Added by build_path_from_id_categ call)
* fullpath Full path (Added by build_path_from_id_categ call) * fullrelativename Full path name (Added by build_path_from_id_categ call)
* fulllabel Full label (Added by build_path_from_id_categ call) * fulllabel Full label (Added by build_path_from_id_categ call)
* level Level of line (Added by build_path_from_id_categ call) * level Level of line (Added by build_path_from_id_categ call)
* \param force Force reload of full arbo even if already loaded * @param force Force reload of full arbo even if already loaded in cache $this->cats
* \return array Tableau de array * @return array Tableau de array
*/ */
function get_full_arbo($force=0) function get_full_arbo($force=0)
{ {
@ -576,7 +580,7 @@ class EcmDirectory // extends CommonObject
return -1; return -1;
} }
// On ajoute la propriete fullpath a tous les elements // We add properties fullxxx to all elements
foreach($this->cats as $key => $val) foreach($this->cats as $key => $val)
{ {
if (isset($motherof[$key])) continue; if (isset($motherof[$key])) continue;
@ -590,7 +594,7 @@ class EcmDirectory // extends CommonObject
} }
/** /**
* \brief Calcule les proprietes fullpath et fulllabel d'une categorie * \brief Calcule les proprietes fullpath, fullrelativename, fulllabel d'un repertoire
* du tableau this->cats et de toutes ces enfants * du tableau this->cats et de toutes ces enfants
* \param id_categ id_categ entry to update * \param id_categ id_categ entry to update
* \param protection Deep counter to avoid infinite loop * \param protection Deep counter to avoid infinite loop
@ -602,16 +606,19 @@ class EcmDirectory // extends CommonObject
{ {
$this->cats[$id_categ]['fullpath'] =$this->cats[$this->cats[$id_categ]['id_mere']]['fullpath']; $this->cats[$id_categ]['fullpath'] =$this->cats[$this->cats[$id_categ]['id_mere']]['fullpath'];
$this->cats[$id_categ]['fullpath'].='_'.$id_categ; $this->cats[$id_categ]['fullpath'].='_'.$id_categ;
$this->cats[$id_categ]['fullrelativename'] =$this->cats[$this->cats[$id_categ]['id_mere']]['fullrelativename'];
$this->cats[$id_categ]['fullrelativename'].='/'.$this->cats[$id_categ]['label'];
$this->cats[$id_categ]['fulllabel'] =$this->cats[$this->cats[$id_categ]['id_mere']]['fulllabel']; $this->cats[$id_categ]['fulllabel'] =$this->cats[$this->cats[$id_categ]['id_mere']]['fulllabel'];
$this->cats[$id_categ]['fulllabel'].=' >> '.$this->cats[$id_categ]['label']; $this->cats[$id_categ]['fulllabel'].=' >> '.$this->cats[$id_categ]['label'];
} }
else else
{ {
$this->cats[$id_categ]['fullpath']='_'.$id_categ; $this->cats[$id_categ]['fullpath']='_'.$id_categ;
$this->cats[$id_categ]['fullrelativename']=$this->cats[$id_categ]['label'];
$this->cats[$id_categ]['fulllabel']=$this->cats[$id_categ]['label']; $this->cats[$id_categ]['fulllabel']=$this->cats[$id_categ]['label'];
} }
// We count number of _ to have level // We count number of _ to have level (we use strlen that is faster than dol_strlen)
$this->cats[$id_categ]['level']=dol_strlen(preg_replace('/([^_])/i','',$this->cats[$id_categ]['fullpath'])); $this->cats[$id_categ]['level']=strlen(preg_replace('/([^_])/i','',$this->cats[$id_categ]['fullpath']));
// Traite ces enfants // Traite ces enfants
$protection++; $protection++;
@ -647,7 +654,7 @@ class EcmDirectory // extends CommonObject
// Update request // Update request
$sql = "UPDATE ".MAIN_DB_PREFIX."ecm_directories SET"; $sql = "UPDATE ".MAIN_DB_PREFIX."ecm_directories SET";
$sql.= " cachenbofdoc = '".sizeof($filelist)."'"; $sql.= " cachenbofdoc = '".sizeof($filelist)."'";
if (empty($all)) if (empty($all)) // By default
{ {
$sql.= " WHERE rowid = ".$this->id; $sql.= " WHERE rowid = ".$this->id;
} }

View File

@ -1,5 +1,5 @@
<?php <?php
/* Copyright (C) 2008-2009 Laurent Destailleur <eldy@users.sourceforge.net> /* Copyright (C) 2008-2010 Laurent Destailleur <eldy@users.sourceforge.net>
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -88,8 +88,8 @@ $upload_dir = $conf->ecm->dir_output.'/'.$relativepath;
* Put here all code to do according to value of "action" parameter * Put here all code to do according to value of "action" parameter
********************************************************************/ ********************************************************************/
// Envoie fichier // Upload file
if ( $_POST["sendit"] && ! empty($conf->global->MAIN_UPLOAD_DOC)) if (GETPOST("sendit") && ! empty($conf->global->MAIN_UPLOAD_DOC))
{ {
require_once(DOL_DOCUMENT_ROOT."/lib/files.lib.php"); require_once(DOL_DOCUMENT_ROOT."/lib/files.lib.php");
@ -126,9 +126,9 @@ if ( $_POST["sendit"] && ! empty($conf->global->MAIN_UPLOAD_DOC))
} }
// Remove file // Remove file
if ($_POST['action'] == 'confirm_deletefile' && $_POST['confirm'] == 'yes') if (GETPOST('action') == 'confirm_deletefile' && GETPOST('confirm') == 'yes')
{ {
$file = $upload_dir . "/" . $_GET['urlfile']; // Do not use urldecode here ($_GET and $_REQUEST are already decoded by PHP). $file = $upload_dir . "/" . GETPOST('urlfile'); // Do not use urldecode here ($_GET and $_REQUEST are already decoded by PHP).
$result=dol_delete_file($file); $result=dol_delete_file($file);
$mesg = '<div class="ok">'.$langs->trans("FileWasRemoved").'</div>'; $mesg = '<div class="ok">'.$langs->trans("FileWasRemoved").'</div>';
@ -137,7 +137,7 @@ if ($_POST['action'] == 'confirm_deletefile' && $_POST['confirm'] == 'yes')
} }
// Remove dir // Remove dir
if ($_POST['action'] == 'confirm_deletedir' && $_POST['confirm'] == 'yes') if (GETPOST('action') == 'confirm_deletedir' && GETPOST('confirm') == 'yes')
{ {
// Fetch was already done // Fetch was already done
$result=$ecmdir->delete($user); $result=$ecmdir->delete($user);
@ -148,12 +148,12 @@ if ($_POST['action'] == 'confirm_deletedir' && $_POST['confirm'] == 'yes')
} }
else else
{ {
$mesg = '<div class="error">'.$langs->trans($ecmdir->error).'</div>'; $mesg = '<div class="error">'.$langs->trans($ecmdir->error,$ecmdir->label).'</div>';
} }
} }
// Update description // Update description
if ($_POST['action'] == 'update' && ! $_POST['cancel']) if (GETPOST('action') == 'update' && ! GETPOST('cancel'))
{ {
$db->begin(); $db->begin();
@ -162,8 +162,8 @@ if ($_POST['action'] == 'update' && ! $_POST['cancel'])
$olddir=$conf->ecm->dir_output.'/'.$olddir; $olddir=$conf->ecm->dir_output.'/'.$olddir;
// Fetch was already done // Fetch was already done
$ecmdir->label = $_POST["label"]; $ecmdir->label = GETPOST("label");
$ecmdir->description = $_POST["description"]; $ecmdir->description = GETPOST("description");
$result=$ecmdir->update($user); $result=$ecmdir->update($user);
if ($result > 0) if ($result > 0)
{ {
@ -218,7 +218,7 @@ $form=new Form($db);
// Construit liste des fichiers // Construit liste des fichiers
$filearray=dol_dir_list($upload_dir,"files",0,'','\.meta$',$sortfield,(strtolower($sortorder)=='desc'?SORT_ASC:SORT_DESC),1); $filearray=dol_dir_list($upload_dir,"files",0,'','\.meta$',$sortfield,(strtolower($sortorder)=='desc'?SORT_ASC:SORT_DESC),3);
$totalsize=0; $totalsize=0;
foreach($filearray as $key => $file) foreach($filearray as $key => $file)
{ {
@ -312,7 +312,7 @@ print '</div>';
// Actions buttons // Actions buttons
if ($_GET["action"] != 'edit' && $_GET['action'] != 'delete_dir' && $_GET['action'] != 'delete') if ($_GET["action"] != 'edit' && $_GET['action'] != 'delete')
{ {
print '<div class="tabsAction">'; print '<div class="tabsAction">';
@ -361,7 +361,8 @@ if ($_GET['action'] == 'delete')
// Confirm remove file // Confirm remove file
if ($_GET['action'] == 'delete_dir') if ($_GET['action'] == 'delete_dir')
{ {
$ret=$form->form_confirm($_SERVER["PHP_SELF"].'?section='.$_REQUEST["section"], $langs->trans('DeleteSection'), $langs->trans('ConfirmDeleteSection'), 'confirm_deletedir'); $relativepathwithoutslash=preg_replace('/[\/]$/','',$relativepath);
$ret=$form->form_confirm($_SERVER["PHP_SELF"].'?section='.$_REQUEST["section"], $langs->trans('DeleteSection'), $langs->trans('ConfirmDeleteSection',$relativepathwithoutslash), 'confirm_deletedir', '', 1, 1);
if ($ret == 'html') print '<br>'; if ($ret == 'html') print '<br>';
} }

View File

@ -50,9 +50,9 @@ $result = restrictedArea($user, 'ecm','');
$user->getrights('ecm'); $user->getrights('ecm');
// Get parameters // Get parameters
$socid = isset($_GET["socid"])?$_GET["socid"]:''; $socid=GETPOST('socid');
$action = isset($_GET["action"])?$_GET["action"]:$_POST['action']; $action=GETPOST("action");
$section=isset($_GET["section"])?$_GET["section"]:$_POST['section']; $section=GETPOST("section");
if (! $section) $section=0; if (! $section) $section=0;
$upload_dir = $conf->ecm->dir_output.'/'.$section; $upload_dir = $conf->ecm->dir_output.'/'.$section;
@ -67,9 +67,9 @@ if (! $sortorder) $sortorder="ASC";
if (! $sortfield) $sortfield="label"; if (! $sortfield) $sortfield="label";
$ecmdir = new ECMDirectory($db); $ecmdir = new ECMDirectory($db);
if (! empty($_REQUEST["section"])) if (GETPOST("section"))
{ {
$result=$ecmdir->fetch($_REQUEST["section"]); $result=$ecmdir->fetch(GETPOST("section"));
if (! $result > 0) if (! $result > 0)
{ {
dol_print_error($db,$ecmdir->error); dol_print_error($db,$ecmdir->error);
@ -77,6 +77,10 @@ if (! empty($_REQUEST["section"]))
} }
} }
$form=new Form($db);
$ecmdirstatic = new ECMDirectory($db);
$userstatic = new User($db);
/******************************************************************* /*******************************************************************
* ACTIONS * ACTIONS
@ -84,17 +88,9 @@ if (! empty($_REQUEST["section"]))
* Put here all code to do according to value of "action" parameter * Put here all code to do according to value of "action" parameter
********************************************************************/ ********************************************************************/
// Envoie fichier // Upload file
if ( $_POST["sendit"] && ! empty($conf->global->MAIN_UPLOAD_DOC)) if (GETPOST("sendit") && ! empty($conf->global->MAIN_UPLOAD_DOC))
{ {
require_once(DOL_DOCUMENT_ROOT."/lib/files.lib.php");
$result=$ecmdir->fetch($_REQUEST["section"]);
if (! $result > 0)
{
dol_print_error($db,$ecmdir->error);
exit;
}
$relativepath=$ecmdir->getRelativePath(); $relativepath=$ecmdir->getRelativePath();
$upload_dir = $conf->ecm->dir_output.'/'.$relativepath; $upload_dir = $conf->ecm->dir_output.'/'.$relativepath;
@ -131,12 +127,12 @@ if ( $_POST["sendit"] && ! empty($conf->global->MAIN_UPLOAD_DOC))
} }
} }
// Action ajout d'un produit ou service // Add directory
if ($_POST["action"] == 'add' && $user->rights->ecm->setup) if (GETPOST("action") == 'add' && $user->rights->ecm->setup)
{ {
$ecmdir->ref = $_POST["ref"]; $ecmdir->ref = 'NOTUSEDYET';
$ecmdir->label = $_POST["label"]; $ecmdir->label = GETPOST("label");
$ecmdir->description = $_POST["desc"]; $ecmdir->description = GETPOST("desc");
$id = $ecmdir->create($user); $id = $ecmdir->create($user);
if ($id > 0) if ($id > 0)
@ -152,9 +148,9 @@ if ($_POST["action"] == 'add' && $user->rights->ecm->setup)
} }
// Remove file // Remove file
if ($_REQUEST['action'] == 'confirm_deletefile' && $_REQUEST['confirm'] == 'yes') if (GETPOST('action') == 'confirm_deletefile' && GETPOST('confirm') == 'yes')
{ {
$result=$ecmdir->fetch($_REQUEST["section"]); $result=$ecmdir->fetch(GETPOST("section"));
if (! $result > 0) if (! $result > 0)
{ {
dol_print_error($db,$ecmdir->error); dol_print_error($db,$ecmdir->error);
@ -162,7 +158,7 @@ if ($_REQUEST['action'] == 'confirm_deletefile' && $_REQUEST['confirm'] == 'yes'
} }
$relativepath=$ecmdir->getRelativePath(); $relativepath=$ecmdir->getRelativePath();
$upload_dir = $conf->ecm->dir_output.'/'.$relativepath; $upload_dir = $conf->ecm->dir_output.'/'.$relativepath;
$file = $upload_dir . "/" . $_REQUEST['urlfile']; // Do not use urldecode here ($_GET and $_REQUEST are already decoded by PHP). $file = $upload_dir . "/" . GETPOST('urlfile'); // Do not use urldecode here ($_GET and $_REQUEST are already decoded by PHP).
$result=dol_delete_file($file); $result=dol_delete_file($file);
@ -173,13 +169,123 @@ if ($_REQUEST['action'] == 'confirm_deletefile' && $_REQUEST['confirm'] == 'yes'
} }
// Remove directory // Remove directory
if ($_REQUEST['action'] == 'confirm_deletesection' && $_REQUEST['confirm'] == 'yes') if (GETPOST('action') == 'confirm_deletesection' && GETPOST('confirm') == 'yes')
{ {
$result=$ecmdir->delete($user); $result=$ecmdir->delete($user);
$mesg = '<div class="ok">'.$langs->trans("ECMSectionWasRemoved", $ecmdir->label).'</div>'; $mesg = '<div class="ok">'.$langs->trans("ECMSectionWasRemoved", $ecmdir->label).'</div>';
} }
// Refresh directory view
if (GETPOST("action") == 'refreshmanual')
{
$diroutputslash=str_replace('\\','/',$conf->ecm->dir_output);
$diroutputslash.='/';
// Scan directory tree on disk
$disktree=dol_dir_list($conf->ecm->dir_output,'directories',1,'','','','',0);
// Scan directory tree in database
$sqltree=$ecmdirstatic->get_full_arbo(0);
$adirwascreated=0;
// Now we compare both trees to complete missing trees into database
//var_dump($disktree);
//var_dump($sqltree);
foreach($disktree as $dirdesc)
{
$dirisindatabase=0;
foreach($sqltree as $dirsqldesc)
{
if ($conf->ecm->dir_output.'/'.$dirsqldesc['fullrelativename'] == $dirdesc['fullname'])
{
$dirisindatabase=1;
break;
}
}
if (! $dirisindatabase)
{
$txt="Directory found on disk ".$dirdesc['fullname'].", not found into database so we add it";
dol_syslog($txt);
print $txt."<br>\n";
// We must first find the fk_parent of directory to create $dirdesc['fullname']
$fk_parent=-1;
$relativepathmissing=str_replace($diroutputslash,'',$dirdesc['fullname']);
$relativepathtosearchparent=$relativepathmissing;
//dol_syslog("Try to find parent id for directory ".$relativepathtosearchparent);
if (preg_match('/\//',$relativepathtosearchparent))
//while (preg_match('/\//',$relativepathtosearchparent))
{
$relativepathtosearchparent=preg_replace('/\/[^\/]*$/','',$relativepathtosearchparent);
$txt="Is relative parent path ".$relativepathtosearchparent." for ".$relativepathmissing." found in sql tree ?";
dol_syslog($txt);
print $txt." -> ";
$parentdirisindatabase=0;
foreach($sqltree as $dirsqldesc)
{
if ($dirsqldesc['fullrelativename'] == $relativepathtosearchparent)
{
$parentdirisindatabase=$dirsqldesc['id'];
break;
}
}
if ($parentdirisindatabase > 0)
{
dol_syslog("Yes with id ".$parentdirisindatabase);
print "Yes with id ".$parentdirisindatabase."<br>\n";
$fk_parent=$parentdirisindatabase;
//break; // We found parent, we can stop the while loop
}
else
{
dol_syslog("No");
print "No<br>\n";
}
}
else
{
$fk_parent=0; // Parent is root
}
if ($fk_parent >= 0)
{
$ecmdirtmp=new ECMDirectory($db);
$ecmdirtmp->ref = 'NOTUSEDYET';
$ecmdirtmp->label = basename($dirdesc['fullname']);
$ecmdirtmp->description = '';
$ecmdirtmp->fk_parent = $fk_parent;
$txt="We create directory ".$ecmdirtmp->label." with parent ".$fk_parent;
dol_syslog($txt);
print $txt."<br>\n";
$id = $ecmdirtmp->create($user);
//$id=999;
if ($id > 0)
{
$newdirsql=array('id'=>$id,
'id_mere'=>$ecmdirtmp->fk_parent,
'label'=>$ecmdirtmp->label,
'description'=>$ecmdirtmp->description,
'fullrelativename'=>$relativepathmissing);
$sqltree[]=$newdirsql; // We complete fulltree for following loops
//var_dump($sqltree);
$adirwascreated=1;
}
}
else {
$txt="Parent of ".$dirdesc['fullname']." not found";
dol_syslog($txt);
print $txt."<br>\n";
}
}
}
// If a directory was added, the fulltree array is not correctly completed and sorted, so we clean
// it to be sure that fulltree array is not used without reloading it.
if ($adirwascreated) $sqltree=null;
}
/******************************************************************* /*******************************************************************
@ -231,7 +337,7 @@ html, body {
center__paneSelector: \".ui-in-layout-center\" center__paneSelector: \".ui-in-layout-center\"
, south__paneSelector: \".ui-in-layout-south\" , south__paneSelector: \".ui-in-layout-south\"
, resizable: false , resizable: false
, south__miSize: 34 , south__minSize: 32
, south__resizable: false , south__resizable: false
, south__closable: false , south__closable: false
, useStateCookie: true /* Put this to false for dev */ , useStateCookie: true /* Put this to false for dev */
@ -241,11 +347,6 @@ html, body {
llxHeader($morehead,$langs->trans("ECM"),'','','','',$morejs,'',0,0); llxHeader($morehead,$langs->trans("ECM"),'','','','',$morejs,'',0,0);
$form=new Form($db);
$ecmdirstatic = new ECMDirectory($db);
$userstatic = new User($db);
// Ajout rubriques automatiques // Ajout rubriques automatiques
$rowspan=0; $rowspan=0;
$sectionauto=array(); $sectionauto=array();
@ -269,7 +370,7 @@ print $langs->trans("ECMAreaDesc2")."<br>";
print "<br>\n"; print "<br>\n";
// Confirm remove file // Confirm remove file
if ($_GET['action'] == 'delete') if (GETPOST('action') == 'delete')
{ {
$ret=$form->form_confirm($_SERVER["PHP_SELF"].'?section='.$_REQUEST["section"].'&urlfile='.urlencode($_GET["urlfile"]), $langs->trans('DeleteFile'), $langs->trans('ConfirmDeleteFile'), 'confirm_deletefile','','',1); $ret=$form->form_confirm($_SERVER["PHP_SELF"].'?section='.$_REQUEST["section"].'&urlfile='.urlencode($_GET["urlfile"]), $langs->trans('DeleteFile'), $langs->trans('ConfirmDeleteFile'), 'confirm_deletefile','','',1);
if ($ret == 'html') print '<br>'; if ($ret == 'html') print '<br>';
@ -277,7 +378,7 @@ if ($_GET['action'] == 'delete')
if ($mesg) { print $mesg."<br>"; } if ($mesg) { print $mesg."<br>"; }
// Tool bar // Toolbar
$head = ecm_prepare_head_fm($fac); $head = ecm_prepare_head_fm($fac);
//dol_fiche_head($head, 'file_manager', '', 1); //dol_fiche_head($head, 'file_manager', '', 1);
@ -300,9 +401,9 @@ else
print '<tr><td colspan="2" style="background: #FFFFFF" style="height: 24px !important">'; print '<tr><td colspan="2" style="background: #FFFFFF" style="height: 24px !important">';
} }
// Construit liste des repertoires // Show button to create a directory
if (empty($action) || $action == 'file_manager' || preg_match('/refresh/i',$action)) //if (empty($action) || $action == 'file_manager' || preg_match('/refresh/i',$action))
{ //{
if ($user->rights->ecm->setup) if ($user->rights->ecm->setup)
{ {
print '<a href="'.DOL_URL_ROOT.'/ecm/docdir.php?action=create" title="'.dol_escape_htmltag($langs->trans('ECMAddSection')).'">'; print '<a href="'.DOL_URL_ROOT.'/ecm/docdir.php?action=create" title="'.dol_escape_htmltag($langs->trans('ECMAddSection')).'">';
@ -317,13 +418,10 @@ if (empty($action) || $action == 'file_manager' || preg_match('/refresh/i',$acti
print '<img width="32" height="32" border="0" src="'.DOL_URL_ROOT.'/theme/common/folder-new.png">'; print '<img width="32" height="32" border="0" src="'.DOL_URL_ROOT.'/theme/common/folder-new.png">';
print '</a>'; print '</a>';
} }
} //}
//print '</td>'; // Show button to refresh listing
//print '<td class="liste_titre" colspan="5" align="right">';
//print '<a href="'.$_SERVER["PHP_SELF"].'?action=refreshmanual'.($section?'&amp;section='.$section:'').'">'.img_picto($langs->trans("Refresh"),'refresh').'</a>';
print '<a href="'.$_SERVER["PHP_SELF"].'?action=refreshmanual'.($section?'&amp;section='.$section:'').'" title="'.dol_escape_htmltag($langs->trans('Refresh')).'">'; print '<a href="'.$_SERVER["PHP_SELF"].'?action=refreshmanual'.($section?'&amp;section='.$section:'').'" title="'.dol_escape_htmltag($langs->trans('Refresh')).'">';
print '<img width="32" height="32" border="0" src="'.DOL_URL_ROOT.'/theme/common/view-refresh.png">'; print '<img width="32" height="32" border="0" src="'.DOL_URL_ROOT.'/theme/common/view-refresh.png">';
//print $langs->trans('Refresh');
print '</a>'; print '</a>';
@ -498,7 +596,7 @@ if (empty($action) || $action == 'file_manager' || preg_match('/refresh/i',$acti
// Load full tree // Load full tree
$fulltree=$ecmdirstatic->get_full_arbo(); if (empty($sqltree)) $sqltree=$ecmdirstatic->get_full_arbo(0);
// ----- This section will show a tree from a fulltree array ----- // ----- This section will show a tree from a fulltree array -----
// $section must also be defined // $section must also be defined
@ -506,7 +604,7 @@ if (empty($action) || $action == 'file_manager' || preg_match('/refresh/i',$acti
// Define fullpathselected ( _x_y_z ) of $section parameter // Define fullpathselected ( _x_y_z ) of $section parameter
$fullpathselected=''; $fullpathselected='';
foreach($fulltree as $key => $val) foreach($sqltree as $key => $val)
{ {
//print $val['id']."-".$section."<br>"; //print $val['id']."-".$section."<br>";
if ($val['id'] == $section) if ($val['id'] == $section)
@ -542,7 +640,7 @@ if (empty($action) || $action == 'file_manager' || preg_match('/refresh/i',$acti
foreach($oldexpandedsectionarray as $sectioncursor) foreach($oldexpandedsectionarray as $sectioncursor)
{ {
// is_in_subtree(fulltree,sectionparent,sectionchild) // is_in_subtree(fulltree,sectionparent,sectionchild)
if ($sectioncursor && ! is_in_subtree($fulltree,$section,$sectioncursor)) $expandedsectionarray[]=$sectioncursor; if ($sectioncursor && ! is_in_subtree($sqltree,$section,$sectioncursor)) $expandedsectionarray[]=$sectioncursor;
} }
$_SESSION['dol_ecmexpandedsectionarray']=join(',',$expandedsectionarray); $_SESSION['dol_ecmexpandedsectionarray']=join(',',$expandedsectionarray);
} }
@ -551,7 +649,7 @@ if (empty($action) || $action == 'file_manager' || preg_match('/refresh/i',$acti
$nbofentries=0; $nbofentries=0;
$oldvallevel=0; $oldvallevel=0;
$var=true; $var=true;
foreach($fulltree as $key => $val) foreach($sqltree as $key => $val)
{ {
$var=false; $var=false;
@ -593,7 +691,7 @@ if (empty($action) || $action == 'file_manager' || preg_match('/refresh/i',$acti
// Show tree graph pictos // Show tree graph pictos
print '<td align="left">'; print '<td align="left">';
print '<table class="nobordernopadding"><tr class="nobordernopadding"><td>'; print '<table class="nobordernopadding"><tr class="nobordernopadding"><td>';
$resarray=tree_showpad($fulltree,$key); $resarray=tree_showpad($sqltree,$key);
$a=$resarray[0]; $a=$resarray[0];
$nbofsubdir=$resarray[1]; $nbofsubdir=$resarray[1];
$c=$resarray[2]; $c=$resarray[2];
@ -609,7 +707,8 @@ if (empty($action) || $action == 'file_manager' || preg_match('/refresh/i',$acti
else $ref=img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/minustop'.$n.'.gif','',1); else $ref=img_picto('',DOL_URL_ROOT.'/theme/common/treemenu/minustop'.$n.'.gif','',1);
if ($option == 'indexexpanded') $lien = '<a href="'.$_SERVER["PHP_SELF"].'?section='.$val['id'].'&amp;sectionexpand=false">'; if ($option == 'indexexpanded') $lien = '<a href="'.$_SERVER["PHP_SELF"].'?section='.$val['id'].'&amp;sectionexpand=false">';
if ($option == 'indexnotexpanded') $lien = '<a href="'.$_SERVER["PHP_SELF"].'?section='.$val['id'].'&amp;sectionexpand=true">'; if ($option == 'indexnotexpanded') $lien = '<a href="'.$_SERVER["PHP_SELF"].'?section='.$val['id'].'&amp;sectionexpand=true">';
$newref=str_replace('_',' ',$ref); //$newref=str_replace('_',' ',$ref);
$newref=$ref;
$lienfin='</a>'; $lienfin='</a>';
print $lien.$newref.$lienfin; print $lien.$newref.$lienfin;
if (! in_array($val['id'],$expandedsectionarray)) print img_picto($ecmdirstatic->ref,DOL_URL_ROOT.'/theme/common/treemenu/folder.gif','',1); if (! in_array($val['id'],$expandedsectionarray)) print img_picto($ecmdirstatic->ref,DOL_URL_ROOT.'/theme/common/treemenu/folder.gif','',1);
@ -766,7 +865,6 @@ else
print '</table>'; print '</table>';
} }
print '<br>';
// End of page // End of page
$db->close(); $db->close();

View File

@ -73,3 +73,7 @@ ALTER TABLE llx_categorie ADD COLUMN import_key varchar(14);
ALTER TABLE llx_product ADD COLUMN customcode varchar(32) after note; ALTER TABLE llx_product ADD COLUMN customcode varchar(32) after note;
ALTER TABLE llx_product ADD COLUMN fk_country integer after customcode; ALTER TABLE llx_product ADD COLUMN fk_country integer after customcode;
ALTER TABLE llx_ecm_directories ADD UNIQUE INDEX idx_ecm_directories (label, fk_parent, entity);
ALTER TABLE llx_ecm_documents ADD UNIQUE INDEX idx_ecm_documents (fullpath_dol);

View File

@ -0,0 +1,23 @@
-- ============================================================================
-- Copyright (C) 2010 Laurent Destailleur <eldy@users.sourceforge.net>
--
-- 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 2 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, write to the Free Software
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- $Id$
-- ============================================================================
ALTER TABLE llx_ecm_directories ADD UNIQUE INDEX idx_ecm_directories (label, fk_parent, entity);

View File

@ -0,0 +1,23 @@
-- ============================================================================
-- Copyright (C) 2010 Laurent Destailleur <eldy@users.sourceforge.net>
--
-- 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 2 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, write to the Free Software
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- $Id$
-- ============================================================================
ALTER TABLE llx_ecm_documents ADD UNIQUE INDEX idx_ecm_documents (fullpath_dol);

View File

@ -24,23 +24,24 @@
*/ */
/** /**
* Scan a directory and return a list of files/directories. Content for string is UTF8. * Scan a directory and return a list of files/directories.
* Content for string is UTF8 and dir separator is "/".
* @param $path Starting path from which to search * @param $path Starting path from which to search
* @param $types Can be "directories", "files", or "all" * @param $types Can be "directories", "files", or "all"
* @param $recursive Determines whether subdirectories are searched * @param $recursive Determines whether subdirectories are searched
* @param $filter Regex for include filter * @param $filter Regex for include filter
* @param $exludefilter Regex for exclude filter (example: '\.meta$') * @param $excludefilter Regex for exclude filter (example: '\.meta$')
* @param $sortcriteria Sort criteria ("name","date","size") * @param $sortcriteria Sort criteria ("","name","date","size")
* @param $sortorder Sort order (SORT_ASC, SORT_DESC) * @param $sortorder Sort order (SORT_ASC, SORT_DESC)
* @param $mode 0=Return array minimum keys loaded (faster), 1=Force all keys like date and size to be loaded (slower) * @param $mode 0=Return array minimum keys loaded (faster), 1=Force all keys like date and size to be loaded (slower), 2=Force load of date only, 3=Force load of size only
* @return array Array of array('name'=>'xxx','fullname'=>'/abc/xxx','date'=>'yyy','size'=>99,'type'=>'dir|file') * @return array Array of array('name'=>'xxx','fullname'=>'/abc/xxx','date'=>'yyy','size'=>99,'type'=>'dir|file')
*/ */
function dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter="", $sortcriteria="name", $sortorder=SORT_ASC, $mode=0) function dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter="", $sortcriteria="name", $sortorder=SORT_ASC, $mode=0)
{ {
dol_syslog("files.lib.php::dol_dir_list path=".$path." types=".$types." recursive=".$recursive." filter=".$filter." excludefilter=".$excludefilter); dol_syslog("files.lib.php::dol_dir_list path=".$path." types=".$types." recursive=".$recursive." filter=".$filter." excludefilter=".$excludefilter);
$loaddate=$mode?true:false; $loaddate=($mode==1||$mode==2)?true:false;
$loadsize=$mode?true:false; $loadsize=($mode==1||$mode==3)?true:false;
// Clean parameters // Clean parameters
$path=preg_replace('/([\\/]+)$/i','',$path); $path=preg_replace('/([\\/]+)$/i','',$path);
@ -114,7 +115,7 @@ function dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefil
$myarray[$key] = $row[$sortcriteria]; $myarray[$key] = $row[$sortcriteria];
} }
// Sort the data // Sort the data
array_multisort($myarray, $sortorder, $file_list); if ($sortorder) array_multisort($myarray, $sortorder, $file_list);
return $file_list; return $file_list;
} }

View File

@ -111,22 +111,23 @@ function dol_now($mode='tzserver')
/** /**
* \brief Clean a string to use it as a file name. * Clean a string to use it as a file name.
* \param str String to clean * @param str String to clean
* \param newstr String to replace bad chars by * @param newstr String to replace bad chars with
* \return string String cleaned (a-zA-Z_) * @return string String cleaned (a-zA-Z_)
* \seealso dol_string_nospecial, dol_string_unaccent * @see dol_string_nospecial, dol_string_unaccent
*/ */
function dol_sanitizeFileName($str,$newstr='_') function dol_sanitizeFileName($str,$newstr='_')
{ {
return dol_string_nospecial(dol_string_unaccent($str),$newstr); global $conf;
return dol_string_nospecial(dol_string_unaccent($str),$newstr,$conf->filesystem_forbidden_chars);
} }
/** /**
* \brief Clean a string from all accent characters to be used as ref, login or by dol_sanitizeFileName. * Clean a string from all accent characters to be used as ref, login or by dol_sanitizeFileName.
* \param str String to clean * @param str String to clean
* \return string Cleaned string * @return string Cleaned string
* \seealso dol_sanitizeFilename, dol_string_nospecial * @see dol_sanitizeFilename, dol_string_nospecial
*/ */
function dol_string_unaccent($str) function dol_string_unaccent($str)
{ {
@ -169,19 +170,21 @@ function dol_string_unaccent($str)
} }
/** /**
* \brief Clean a string from all punctuation characters to use it as a ref or login. * Clean a string from all punctuation characters to use it as a ref or login.
* \param str String to clean * @param str String to clean
* \param newstr String to replace bad chars by * @param newstr String to replace forbidden chars with
* \return string Cleaned string * @param badchars List of forbidden characters
* \seealso dol_sanitizeFilename, dol_string_unaccent * @return string Cleaned string
* @see dol_sanitizeFilename, dol_string_unaccent
*/ */
function dol_string_nospecial($str,$newstr='_') function dol_string_nospecial($str,$newstr='_',$badchars='')
{ {
$forbidden_chars_to_underscore=array(" ","'","/","\\",":","*","?","\"","<",">","|","[","]",",",";","="); $forbidden_chars_to_replace=array(" ","'","/","\\",":","*","?","\"","<",">","|","[","]",",",";","=");
//$forbidden_chars_to_remove=array("(",")");
$forbidden_chars_to_remove=array(); $forbidden_chars_to_remove=array();
if (is_array($badchars)) $forbidden_chars_to_replace=$badchars;
//$forbidden_chars_to_remove=array("(",")");
return str_replace($forbidden_chars_to_underscore,$newstr,str_replace($forbidden_chars_to_remove,"",$str)); return str_replace($forbidden_chars_to_replace,$newstr,str_replace($forbidden_chars_to_remove,"",$str));
} }
/** /**