dolibarr 21.0.0-alpha
file_card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2008-2020 Laurent Destailleur <eldy@users.sourceforge.net>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
24// Load Dolibarr environment
25require '../main.inc.php';
26require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
27require_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmdirectory.class.php';
28require_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
29require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
30require_once DOL_DOCUMENT_ROOT.'/core/lib/ecm.lib.php';
31require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
32
33// Load translation files required by page
34$langs->loadLangs(array('ecm', 'companies', 'other', 'users', 'orders', 'propal', 'bills', 'contracts', 'categories'));
35
36$action = GETPOST('action', 'aZ09');
37$cancel = GETPOST('cancel', 'alpha');
38$backtopage = GETPOST('backtopage', 'alpha');
39
40// Get parameters
41$socid = GETPOSTINT("socid");
42
43// Security check
44if ($user->socid > 0) {
45 $action = '';
46 $socid = $user->socid;
47}
48
49$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
50$sortfield = GETPOST('sortfield', 'aZ09comma');
51$sortorder = GETPOST('sortorder', 'aZ09comma');
52$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
53if (empty($page) || $page == -1) {
54 $page = 0;
55} // If $page is not defined, or '' or -1
56$offset = $limit * $page;
57$pageprev = $page - 1;
58$pagenext = $page + 1;
59if (!$sortorder) {
60 $sortorder = "ASC";
61}
62if (!$sortfield) {
63 $sortfield = "label";
64}
65
66$section = GETPOST("section", 'alpha');
67if (!$section) {
68 dol_print_error(null, 'Error, section parameter missing');
69 exit;
70}
71$urlfile = (string) dol_sanitizePathName(GETPOST("urlfile"), '_', 0);
72if (!$urlfile) {
73 dol_print_error(null, "ErrorParamNotDefined");
74 exit;
75}
76
77// Load ecm object
78$ecmdir = new EcmDirectory($db);
79$result = $ecmdir->fetch(GETPOST("section", 'alpha'));
80if (!($result > 0)) {
81 dol_print_error($db, $ecmdir->error);
82 exit;
83}
84$relativepath = $ecmdir->getRelativePath();
85$upload_dir = $conf->ecm->dir_output.'/'.$relativepath;
86
87$fullpath = $conf->ecm->dir_output.'/'.$relativepath.$urlfile;
88
89$relativetodocument = 'ecm/'.$relativepath; // $relativepath is relative to ECM dir, we need relative to document
90$filepath = $relativepath.$urlfile;
91$filepathtodocument = $relativetodocument.$urlfile;
92
93// Try to load object from index
94$object = new EcmFiles($db);
95$extrafields = new ExtraFields($db);
96// fetch optionals attributes and labels
97$extrafields->fetch_name_optionals_label($object->table_element);
98
99$result = $object->fetch(0, '', $filepathtodocument);
100if ($result < 0) {
101 dol_print_error($db, $object->error, $object->errors);
102 exit;
103}
104
105// Permissions
106$permissiontoread = $user->hasRight('ecm', 'read');
107$permissiontoadd = $user->hasRight('ecm', 'setup');
108$permissiontoupload = $user->hasRight('ecm', 'upload');
109
110if (!$permissiontoread) {
112}
113
114
115/*
116 * Actions
117 */
118
119if ($cancel) {
120 $action = '';
121 if ($backtopage) {
122 header("Location: ".$backtopage);
123 exit;
124 } else {
125 header('Location: '.$_SERVER["PHP_SELF"].'?urlfile='.urlencode($urlfile).'&section='.urlencode($section).($module ? '&module='.urlencode($module) : ''));
126 exit;
127 }
128}
129
130// Rename file
131if ($action == 'update' && $permissiontoadd) {
132 $error = 0;
133
134 $oldlabel = GETPOST('urlfile', 'alpha');
135 $newlabel = dol_sanitizeFileName(GETPOST('label', 'alpha'), '_', 0);
136 $shareenabled = GETPOST('shareenabled', 'alpha');
137
138 //$db->begin();
139
140 $olddir = $ecmdir->getRelativePath(0); // Relative to ecm
141 $olddirrelativetodocument = 'ecm/'.$olddir; // Relative to document
142 $newdirrelativetodocument = 'ecm/'.$olddir;
143 $olddir = $conf->ecm->dir_output.'/'.$olddir;
144 $newdir = $olddir;
145
146 $oldfile = $olddir.$oldlabel;
147 $newfile = $newdir.$newlabel;
148 $newfileformove = $newfile;
149 // If old file end with .noexe, new file must also end with .noexe
150 if (preg_match('/\.noexe$/', $oldfile) && !preg_match('/\.noexe$/', $newfileformove)) {
151 $newfileformove .= '.noexe';
152 }
153 //var_dump($oldfile);var_dump($newfile);exit;
154
155 // Now we update index of file
156 $db->begin();
157 //print $oldfile.' - '.$newfile;
158 if ($newlabel != $oldlabel) {
159 $result = dol_move($oldfile, $newfileformove); // This include update of database
160 if (!$result) {
161 $langs->load('errors');
162 setEventMessages($langs->trans('ErrorFailToRenameFile', $oldfile, $newfile), null, 'errors');
163 $error++;
164 }
165
166 // Reload object after the move
167 $result = $object->fetch(0, '', $newdirrelativetodocument.$newlabel);
168 if ($result < 0) {
169 dol_print_error($db, $object->error, $object->errors);
170 exit;
171 }
172 }
173
174 if (!$error) {
175 if ($shareenabled) {
176 require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
177 $object->share = getRandomPassword(true);
178 } else {
179 $object->share = '';
180 }
181
182 if ($object->id > 0) {
183 $ret = $extrafields->setOptionalsFromPost(null, $object);
184 if ($ret < 0) {
185 $error++;
186 }
187 if (!$error) {
188 // Actions on extra fields
189 $result = $object->insertExtraFields();
190 if ($result < 0) {
191 setEventMessages($object->error, $object->errors, 'errors');
192 $error++;
193 }
194 }
195 // Call update to set the share key
196 $result = $object->update($user);
197 if ($result < 0) {
198 setEventMessages($object->error, $object->errors, 'warnings');
199 }
200 } else {
201 // Call create to insert record
202 $object->entity = $conf->entity;
203 $object->filepath = preg_replace('/[\\/]+$/', '', $newdirrelativetodocument);
204 $object->filename = $newlabel;
205 $object->label = md5_file(dol_osencode($newfileformove)); // hash of file content
206 $object->fullpath_orig = '';
207 $object->gen_or_uploaded = 'unknown';
208 $object->description = ''; // indexed content
209 $object->keywords = ''; // keyword content
210 $result = $object->create($user);
211 if ($result < 0) {
212 setEventMessages($object->error, $object->errors, 'warnings');
213 }
214 }
215 }
216
217 if (!$error) {
218 $db->commit();
219
220 $urlfile = $newlabel;
221 // If old file end with .noexe, new file must also end with .noexe
222 if (preg_match('/\.noexe$/', $newfileformove)) {
223 $urlfile .= '.noexe';
224 }
225
226 header('Location: '.$_SERVER["PHP_SELF"].'?urlfile='.urlencode($urlfile).'&section='.urlencode($section));
227 exit;
228 } else {
229 $db->rollback();
230 }
231}
232
233
234
235/*
236 * View
237 */
238
239$form = new Form($db);
240
241llxHeader('', '', '', '', 0, 0, '', '', '', 'mod-ecm page-file_card');
242
243$object->section_id = $ecmdir->id;
244$object->label = $urlfile;
245$head = ecm_file_prepare_head($object);
246
247if ($action == 'edit') {
248 print '<form name="update" action="'.$_SERVER["PHP_SELF"].'" method="POST">';
249 print '<input type="hidden" name="token" value="'.newToken().'">';
250 print '<input type="hidden" name="section" value="'.$section.'">';
251 print '<input type="hidden" name="urlfile" value="'.$urlfile.'">';
252 print '<input type="hidden" name="module" value="'.$module.'">';
253 print '<input type="hidden" name="action" value="update">';
254 print '<input type="hidden" name="id" value="'.$object->id.'">';
255}
256
257print dol_get_fiche_head($head, 'card', $langs->trans("File"), -1, 'generic');
258
259
260$s = '';
261$tmpecmdir = new EcmDirectory($db); // Need to create a new one
262$tmpecmdir->fetch($ecmdir->id);
263$result = 1;
264$i = 0;
265while ($tmpecmdir && $result > 0) {
266 $tmpecmdir->ref = $tmpecmdir->label;
267 $s = $tmpecmdir->getNomUrl(1).$s;
268 if ($tmpecmdir->fk_parent) {
269 $s = ' -> '.$s;
270 $result = $tmpecmdir->fetch($tmpecmdir->fk_parent);
271 } else {
272 $tmpecmdir = 0;
273 }
274 $i++;
275}
276
277$urlfiletoshow = preg_replace('/\.noexe$/', '', $urlfile);
278
279$s = img_picto('', 'object_dir').' <a href="'.DOL_URL_ROOT.'/ecm/index.php">'.$langs->trans("ECMRoot").'</a> -> '.$s.' -> ';
280if ($action == 'edit') {
281 $s .= '<input type="text" name="label" class="quatrevingtpercent" value="'.$urlfiletoshow.'">';
282} else {
283 $s .= $urlfiletoshow;
284}
285
286$linkback = '';
287if ($backtopage) {
288 $linkback = '<a href="'.$backtopage.'">'.$langs->trans("BackToTree").'</a>';
289}
290
291$object->ref = ''; // Force to hide ref
292dol_banner_tab($object, '', $linkback, 0, '', '', $s);
293
294print '<div class="fichecenter">';
295
296print '<div class="underbanner clearboth"></div>';
297print '<table class="border centpercent tableforfield">';
298print '<tr><td class="titlefieldcreate">'.$langs->trans("ECMCreationDate").'</td><td>';
299print dol_print_date(dol_filemtime($fullpath), 'dayhour');
300print '</td></tr>';
301/*print '<tr><td>'.$langs->trans("ECMDirectoryForFiles").'</td><td>';
302print '/ecm/'.$relativepath;
303print '</td></tr>';
304print '<tr><td>'.$langs->trans("ECMNbOfDocs").'</td><td>';
305print count($filearray);
306print '</td></tr>';
307print '<tr><td>'.$langs->trans("TotalSizeOfAttachedFiles").'</td><td>';
308print dol_print_size($totalsize);
309print '</td></tr>';
310*/
311
312// Hash of file content
313print '<tr><td>'.$langs->trans("HashOfFileContent").'</td><td>';
314$object = new EcmFiles($db);
315$object->fetch(0, '', $filepathtodocument);
316if (!empty($object->label)) {
317 print $object->label;
318} else {
319 print img_warning().' '.$langs->trans("FileNotYetIndexedInDatabase");
320}
321print '</td></tr>';
322
323// Define $urlwithroot
324$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
325$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
326//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
327
328// Link for internal download
329print '<tr><td>';
330print $form->textwithpicto($langs->trans("DirectDownloadInternalLink"), $langs->trans("PrivateDownloadLinkDesc"));
331print '</td><td>';
332$modulepart = 'ecm';
333$forcedownload = 1;
334$rellink = '/document.php?modulepart='.$modulepart;
335if ($forcedownload) {
336 $rellink .= '&attachment=1';
337}
338if (!empty($object->entity)) {
339 $rellink .= '&entity='.$object->entity;
340}
341$rellink .= '&file='.urlencode($filepath);
342$fulllink = $urlwithroot.$rellink;
343print img_picto('', 'globe').' ';
344if ($action != 'edit') {
345 print '<input type="text" class="maxquatrevingtpercent widthcentpercentminusxx" id="downloadinternallink" name="downloadinternellink" value="'.dol_escape_htmltag($fulllink).'">';
346} else {
347 print $fulllink;
348}
349if ($action != 'edit') {
350 print ' <a href="'.$fulllink.'">'.img_picto($langs->trans("Download"), 'download', 'class="opacitymedium paddingrightonly"').'</a>'; // No target here.
351}
352print '</td></tr>';
353
354// Link for direct external download
355print '<tr><td>';
356if ($action != 'edit') {
357 print $form->textwithpicto($langs->trans("DirectDownloadLink"), $langs->trans("PublicDownloadLinkDesc"));
358} else {
359 print $form->textwithpicto($langs->trans("FileSharedViaALink"), $langs->trans("PublicDownloadLinkDesc"));
360}
361print '</td><td>';
362if (!empty($object->share)) {
363 if ($action != 'edit') {
364 $forcedownload = 0;
365
366 $paramlink = '';
367 if (!empty($object->share)) {
368 $paramlink .= ($paramlink ? '&' : '').'hashp='.$object->share; // Hash for public share
369 }
370 if ($forcedownload) {
371 $paramlink .= ($paramlink ? '&' : '').'attachment=1';
372 }
373
374 $fulllink = $urlwithroot.'/document.php'.($paramlink ? '?'.$paramlink : '');
375 //if (!empty($object->ref)) $fulllink.='&hashn='.$object->ref; // Hash of file path
376 //elseif (!empty($object->label)) $fulllink.='&hashc='.$object->label; // Hash of file content
377
378 print img_picto('', 'globe').' ';
379 if ($action != 'edit') {
380 print '<input type="text" class="quatrevingtpercent nopadding small" id="downloadlink" name="downloadexternallink" value="'.dol_escape_htmltag($fulllink).'">';
381 } else {
382 print $fulllink;
383 }
384 if ($action != 'edit') {
385 print ' <a href="'.$fulllink.'">'.$langs->trans("Download").'</a>'; // No target here
386 }
387 } else {
388 print '<input type="checkbox" name="shareenabled"'.($object->share ? ' checked="checked"' : '').' /> ';
389 }
390} else {
391 if ($action != 'edit') {
392 print '<span class="opacitymedium">'.$langs->trans("FileNotShared").'</span>';
393 } else {
394 print '<input type="checkbox" name="shareenabled"'.($object->share ? ' checked="checked"' : '').' /> ';
395 }
396}
397print '</td>';
398print '</tr>';
399print $object->showOptionals($extrafields, ($action == 'edit' ? 'edit' : 'view'));
400print '</table>';
401print '</div>';
402
403print ajax_autoselect('downloadinternallink');
404print ajax_autoselect('downloadlink');
405
406print dol_get_fiche_end();
407
408if ($action == 'edit') {
409 print $form->buttonsSaveCancel();
410
411 print '</form>';
412}
413
414
415// Confirm deletion of a file
416if ($action == 'deletefile') {
417 print $form->formconfirm($_SERVER["PHP_SELF"].'?section='.urlencode($section), $langs->trans('DeleteFile'), $langs->trans('ConfirmDeleteFile', $urlfile), 'confirm_deletefile', '', 1, 1);
418}
419
420if ($action != 'edit') {
421 // Actions buttons
422 print '<div class="tabsAction">';
423
424 if ($user->hasRight('ecm', 'setup')) {
425 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=edit&section='.urlencode($section).'&urlfile='.urlencode($urlfile).'">'.$langs->trans('Edit').'</a>';
426 }
427
428 print '</div>';
429}
430
431
432// End of page
433llxFooter();
434$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:70
Class to manage ECM directories.
Class to manage ECM files.
Class to manage standard extra fields.
Class to manage generation of HTML components Only common components must be here.
llxFooter()
Footer empty.
Definition document.php:107
ecm_file_prepare_head($object)
Prepare array with list of tabs.
Definition ecm.lib.php:118
dol_filemtime($pathoffile)
Return time of a file.
dol_move($srcfile, $destfile, $newmask='0', $overwriteifexists=1, $testvirus=0, $indexdatabase=1, $moreinfo=array())
Move a file into another name.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
ajax_autoselect($htmlname, $addlink='', $textonlink='Link')
Make content of an input box selected when we click into input field.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_sanitizePathName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a path name.
getRandomPassword($generic=false, $replaceambiguouschars=null, $length=32)
Return a generated password using default module.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.