ryxeo-glpi-git / inc / document.function.php @ b67d8923
Historique | Voir | Annoter | Télécharger (20,2 ko)
1 | b67d8923 | Eric Seigne | <?php
|
---|---|---|---|
2 | /*
|
||
3 | * @version $Id: document.function.php 7894 2009-01-25 20:06:49Z moyo $
|
||
4 | -------------------------------------------------------------------------
|
||
5 | GLPI - Gestionnaire Libre de Parc Informatique
|
||
6 | Copyright (C) 2003-2009 by the INDEPNET Development Team.
|
||
7 | |||
8 | http://indepnet.net/ http://glpi-project.org
|
||
9 | -------------------------------------------------------------------------
|
||
10 | |||
11 | LICENSE
|
||
12 | |||
13 | This file is part of GLPI.
|
||
14 | |||
15 | GLPI is free software; you can redistribute it and/or modify
|
||
16 | it under the terms of the GNU General Public License as published by
|
||
17 | the Free Software Foundation; either version 2 of the License, or
|
||
18 | (at your option) any later version.
|
||
19 | |||
20 | GLPI is distributed in the hope that it will be useful,
|
||
21 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
22 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
23 | GNU General Public License for more details.
|
||
24 | |||
25 | You should have received a copy of the GNU General Public License
|
||
26 | along with GLPI; if not, write to the Free Software
|
||
27 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
28 | --------------------------------------------------------------------------
|
||
29 | */
|
||
30 | |||
31 | // ----------------------------------------------------------------------
|
||
32 | // Original Author of file: Julien Dombre
|
||
33 | // Purpose of file:
|
||
34 | // ----------------------------------------------------------------------
|
||
35 | |||
36 | |||
37 | if (!defined('GLPI_ROOT')){ |
||
38 | die("Sorry. You can't access directly to this file"); |
||
39 | } |
||
40 | |||
41 | |||
42 | |||
43 | |||
44 | /**
|
||
45 | * Move an uploadd document (files in GLPI_DOC_DIR."/_uploads" dir)
|
||
46 | *
|
||
47 | * @param $filename filename to move
|
||
48 | * @param $old_file old file name to replace : to unlink it
|
||
49 | * @return nothing
|
||
50 | **/
|
||
51 | function moveUploadedDocument($filename,$old_file=''){ |
||
52 | global $CFG_GLPI,$LANG; |
||
53 | |||
54 | if (is_dir(GLPI_DOC_DIR."/_uploads")){ |
||
55 | if (is_file(GLPI_DOC_DIR."/_uploads/".$filename)){ |
||
56 | $dir=isValidDoc($filename); |
||
57 | $new_path=getUploadFileValidLocationName($dir,$filename,0); |
||
58 | if (!empty($new_path)){ |
||
59 | |||
60 | // Delete old file
|
||
61 | if(!empty($old_file)&& is_file(GLPI_DOC_DIR."/".$old_file)&& !is_dir(GLPI_DOC_DIR."/".$old_file)) { |
||
62 | if (unlink(GLPI_DOC_DIR."/".$old_file)) |
||
63 | addMessageAfterRedirect($LANG["document"][24]." ".GLPI_DOC_DIR."/".$old_file); |
||
64 | else
|
||
65 | addMessageAfterRedirect($LANG["document"][25]." ".GLPI_DOC_DIR."/".$old_file); |
||
66 | } |
||
67 | |||
68 | // D�lacement si droit
|
||
69 | if (is_writable (GLPI_DOC_DIR."/_uploads/".$filename)){ |
||
70 | if (rename(GLPI_DOC_DIR."/_uploads/".$filename,GLPI_DOC_DIR."/".$new_path)){ |
||
71 | addMessageAfterRedirect($LANG["document"][39]); |
||
72 | return $new_path; |
||
73 | } |
||
74 | else {
|
||
75 | addMessageAfterRedirect($LANG["document"][40]); |
||
76 | } |
||
77 | } else { // Copi sinon |
||
78 | if (copy(GLPI_DOC_DIR."/_uploads/".$filename,GLPI_DOC_DIR."/".$new_path)){ |
||
79 | addMessageAfterRedirect($LANG["document"][41]); |
||
80 | return $new_path; |
||
81 | } |
||
82 | else addMessageAfterRedirect($LANG["document"][40]); |
||
83 | } |
||
84 | } |
||
85 | |||
86 | } else addMessageAfterRedirect($LANG["document"][38].": ".GLPI_DOC_DIR."/_uploads/".$filename); |
||
87 | |||
88 | } else addMessageAfterRedirect($LANG["document"][35]); |
||
89 | |||
90 | return ""; |
||
91 | } |
||
92 | |||
93 | /**
|
||
94 | * Upload a new file
|
||
95 | *
|
||
96 | * @param $FILEDESC FILE descriptor
|
||
97 | * @param $old_file old file name to replace : to unlink it
|
||
98 | * @return nothing
|
||
99 | **/
|
||
100 | function uploadDocument($FILEDESC,$old_file=''){ |
||
101 | global $CFG_GLPI,$LANG; |
||
102 | |||
103 | // Is a file uploaded ?
|
||
104 | if (count($FILEDESC)>0&&!empty($FILEDESC['name'])){ |
||
105 | // Clean is name
|
||
106 | $filename=cleanFilenameDocument($FILEDESC['name']); |
||
107 | $force=0; |
||
108 | // Is it a valid file ?
|
||
109 | $dir=isValidDoc($filename); |
||
110 | if (!empty($old_file)&&$dir."/".$filename==$old_file) $force=1; |
||
111 | |||
112 | $new_path=getUploadFileValidLocationName($dir,$filename,$force); |
||
113 | |||
114 | if (!empty($new_path)){ |
||
115 | // Delete old file
|
||
116 | if(!empty($old_file)&& is_file(GLPI_DOC_DIR."/".$old_file)&& !is_dir(GLPI_DOC_DIR."/".$old_file)) { |
||
117 | if (unlink(GLPI_DOC_DIR."/".$old_file)) |
||
118 | addMessageAfterRedirect($LANG["document"][24]." ".GLPI_DOC_DIR."/".$old_file); |
||
119 | else
|
||
120 | addMessageAfterRedirect($LANG["document"][25]." ".GLPI_DOC_DIR."/".$old_file); |
||
121 | } |
||
122 | |||
123 | // Move uploaded file
|
||
124 | if (rename($FILEDESC['tmp_name'],GLPI_DOC_DIR."/".$new_path)) { |
||
125 | addMessageAfterRedirect($LANG["document"][26]); |
||
126 | return $new_path; |
||
127 | } else {
|
||
128 | addMessageAfterRedirect($LANG["document"][27]); |
||
129 | } |
||
130 | } |
||
131 | |||
132 | |||
133 | } |
||
134 | return ""; |
||
135 | } |
||
136 | |||
137 | /**
|
||
138 | * Find a valid path for the new file
|
||
139 | *
|
||
140 | * @param $dir dir to search a free path for the file
|
||
141 | * @param $filename new filename
|
||
142 | * @param $force may replace an existing doc ?
|
||
143 | * @return nothing
|
||
144 | **/
|
||
145 | function getUploadFileValidLocationName($dir,$filename,$force){ |
||
146 | |||
147 | global $CFG_GLPI,$LANG; |
||
148 | |||
149 | if (!empty($dir)){ |
||
150 | // Test existance repertoire DOCS
|
||
151 | if (is_dir(GLPI_DOC_DIR)){ |
||
152 | // Test existance sous-repertoire type dans DOCS -> sinon cr�tion
|
||
153 | if (!is_dir(GLPI_DOC_DIR."/".$dir)){ |
||
154 | addMessageAfterRedirect($LANG["document"][34]." ".GLPI_DOC_DIR."/".$dir); |
||
155 | @mkdir(GLPI_DOC_DIR."/".$dir); |
||
156 | } |
||
157 | // Copy du fichier upload�si r�ertoire existe
|
||
158 | if (is_dir(GLPI_DOC_DIR."/".$dir)){ |
||
159 | if (!$force){ |
||
160 | if (is_file(GLPI_DOC_DIR."/".$dir."/".$filename)){ |
||
161 | $original_split=explode('.',$filename); |
||
162 | $where_to_add=count($original_split)-2; |
||
163 | $splitted=$original_split; |
||
164 | $number=2; |
||
165 | $splitted[$where_to_add]=preg_replace('/_[0-9]*$/','',$splitted[$where_to_add])."_".$number; |
||
166 | $filename=implode('.',$splitted); |
||
167 | // Rename file if exists
|
||
168 | while (is_file(GLPI_DOC_DIR."/".$dir."/".$filename)){ |
||
169 | $number++;
|
||
170 | $splitted=$original_split; |
||
171 | |||
172 | $splitted[$where_to_add]=preg_replace('/_[0-9]*$/','',$splitted[$where_to_add])."_".$number; |
||
173 | $filename=implode('.',$splitted); |
||
174 | } |
||
175 | } |
||
176 | } |
||
177 | if ($force||!is_file(GLPI_DOC_DIR."/".$dir."/".$filename)){ |
||
178 | return $dir."/".$filename; |
||
179 | } else addMessageAfterRedirect($LANG["document"][28]); |
||
180 | |||
181 | } else addMessageAfterRedirect($LANG["document"][29]." ".GLPI_DOC_DIR."/".$dir." ".$LANG["document"][30]); |
||
182 | |||
183 | } else addMessageAfterRedirect($LANG["document"][31]." ".GLPI_DOC_DIR); |
||
184 | |||
185 | } else addMessageAfterRedirect($LANG["document"][32]); |
||
186 | |||
187 | return ""; |
||
188 | } |
||
189 | |||
190 | /**
|
||
191 | * Show devices links to a document
|
||
192 | *
|
||
193 | * @param $instID document ID
|
||
194 | * @return nothing
|
||
195 | **/
|
||
196 | function showDeviceDocument($instID) { |
||
197 | global $DB,$CFG_GLPI, $LANG,$INFOFORM_PAGES,$LINK_ID_TABLE; |
||
198 | |||
199 | if (!haveRight("document","r")) return false; |
||
200 | |||
201 | $doc=new Document(); |
||
202 | if ($doc->getFromDB($instID)){ |
||
203 | $canedit=$doc->can($instID,'w'); |
||
204 | |||
205 | // for a document,
|
||
206 | // don't show here others documents associated to this one,
|
||
207 | // it's done for both directions in showDocumentAssociated
|
||
208 | $query = "SELECT DISTINCT device_type FROM glpi_doc_device WHERE glpi_doc_device.FK_doc = '$instID' AND glpi_doc_device.device_type != ".DOCUMENT_TYPE." ORDER BY device_type"; |
||
209 | |||
210 | $result = $DB->query($query); |
||
211 | $number = $DB->numrows($result); |
||
212 | $i = 0; |
||
213 | |||
214 | echo "<form method='post' name='document_form' id='document_form' action=\"".$CFG_GLPI["root_doc"]."/front/document.form.php\">"; |
||
215 | |||
216 | echo "<br><br><div class='center'><table class='tab_cadre_fixe'>"; |
||
217 | echo "<tr><th colspan='".($canedit?6:5)."'>".$LANG["document"][19].":</th></tr><tr>"; |
||
218 | if ($canedit) { |
||
219 | echo "<th> </th>"; |
||
220 | } |
||
221 | echo "<th>".$LANG["common"][17]."</th>"; |
||
222 | echo "<th>".$LANG["common"][16]."</th>"; |
||
223 | echo "<th>".$LANG["entity"][0]."</th>"; |
||
224 | echo "<th>".$LANG["common"][19]."</th>"; |
||
225 | echo "<th>".$LANG["common"][20]."</th>"; |
||
226 | echo "</tr>"; |
||
227 | $ci=new CommonItem(); |
||
228 | while ($i < $number) { |
||
229 | $type=$DB->result($result, $i, "device_type"); |
||
230 | if (haveTypeRight($type,"r")){ |
||
231 | $column="name"; |
||
232 | if ($type==TRACKING_TYPE) $column="ID"; |
||
233 | if ($type==KNOWBASE_TYPE) $column="question"; |
||
234 | |||
235 | $query = "SELECT ".$LINK_ID_TABLE[$type].".*, glpi_doc_device.ID AS IDD, glpi_entities.ID AS entity " |
||
236 | ." FROM glpi_doc_device, ".$LINK_ID_TABLE[$type] |
||
237 | ." LEFT JOIN glpi_entities ON (glpi_entities.ID=".$LINK_ID_TABLE[$type].".FK_entities) " |
||
238 | ." WHERE ".$LINK_ID_TABLE[$type].".ID = glpi_doc_device.FK_device AND glpi_doc_device.device_type='$type' AND glpi_doc_device.FK_doc = '$instID' " |
||
239 | . getEntitiesRestrictRequest(" AND ",$LINK_ID_TABLE[$type],'','',isset($CFG_GLPI["recursive_type"][$type])); |
||
240 | if (in_array($LINK_ID_TABLE[$type],$CFG_GLPI["template_tables"])){ |
||
241 | $query.=" AND ".$LINK_ID_TABLE[$type].".is_template='0'"; |
||
242 | } |
||
243 | $query.=" ORDER BY glpi_entities.completename, ".$LINK_ID_TABLE[$type].".$column"; |
||
244 | |||
245 | if ($result_linked=$DB->query($query)) |
||
246 | if ($DB->numrows($result_linked)){ |
||
247 | $ci->setType($type); |
||
248 | while ($data=$DB->fetch_assoc($result_linked)){ |
||
249 | $ID=""; |
||
250 | if ($type==TRACKING_TYPE) $data["name"]=$LANG["job"][38]." ".$data["ID"]; |
||
251 | if ($type==KNOWBASE_TYPE) $data["name"]=$data["question"]; |
||
252 | |||
253 | if($CFG_GLPI["view_ID"]||empty($data["name"])) $ID= " (".$data["ID"].")"; |
||
254 | $name= "<a href=\"".$CFG_GLPI["root_doc"]."/".$INFOFORM_PAGES[$type]."?ID=".$data["ID"]."\">" |
||
255 | .$data["name"]."$ID</a>"; |
||
256 | |||
257 | echo "<tr class='tab_bg_1'>"; |
||
258 | |||
259 | if ($canedit){ |
||
260 | echo "<td width='10'>"; |
||
261 | $sel=""; |
||
262 | if (isset($_GET["select"])&&$_GET["select"]=="all") $sel="checked"; |
||
263 | echo "<input type='checkbox' name='item[".$data["IDD"]."]' value='1' $sel>"; |
||
264 | echo "</td>"; |
||
265 | } |
||
266 | echo "<td class='center'>".$ci->getType()."</td>"; |
||
267 | |||
268 | echo "<td ".(isset($data['deleted'])&&$data['deleted']?"class='tab_bg_2_2'":"").">".$name."</td>"; |
||
269 | echo "<td class='center'>".getDropdownName("glpi_entities",$data['entity'])."</td>"; |
||
270 | echo "<td class='center'>".(isset($data["serial"])? "".$data["serial"]."" :"-")."</td>"; |
||
271 | echo "<td class='center'>".(isset($data["otherserial"])? "".$data["otherserial"]."" :"-")."</td>"; |
||
272 | |||
273 | echo "</tr>"; |
||
274 | } |
||
275 | } |
||
276 | } |
||
277 | $i++;
|
||
278 | } |
||
279 | |||
280 | if ($canedit) { |
||
281 | echo "<tr class='tab_bg_1'><td colspan='4' class='center'>"; |
||
282 | |||
283 | echo "<input type='hidden' name='conID' value='$instID'>"; |
||
284 | echo "<input type='hidden' name='right' value='doc'>"; |
||
285 | $types=$CFG_GLPI["state_types"]; |
||
286 | $types[]=ENTERPRISE_TYPE; |
||
287 | $types[]=CARTRIDGE_TYPE; |
||
288 | $types[]=CONSUMABLE_TYPE; |
||
289 | $types[]=CONTRACT_TYPE; |
||
290 | |||
291 | dropdownAllItems("item",0,0,($doc->fields['recursive']?-1:$doc->fields['FK_entities']),$types); |
||
292 | |||
293 | echo "</td>"; |
||
294 | echo "<td colspan='2' class='center'>"; |
||
295 | echo "<input type='submit' name='additem' value=\"".$LANG["buttons"][8]."\" class='submit'>"; |
||
296 | echo "</td></tr>"; |
||
297 | echo "</table></div>" ; |
||
298 | |||
299 | echo "<div class='center'>"; |
||
300 | echo "<table width='950px'>"; |
||
301 | echo "<tr><td><img src=\"".$CFG_GLPI["root_doc"]."/pics/arrow-left.png\" alt=''></td><td class='center'><a onclick= \"if ( markAllRows('document_form') ) return false;\" href='".$_SERVER['PHP_SELF']."?ID=$instID&select=all'>".$LANG["buttons"][18]."</a></td>"; |
||
302 | |||
303 | echo "<td>/</td><td class='center'><a onclick= \"if ( unMarkAllRows('document_form') ) return false;\" href='".$_SERVER['PHP_SELF']."?ID=$instID&select=none'>".$LANG["buttons"][19]."</a>"; |
||
304 | echo "</td><td align='left' width='80%'>"; |
||
305 | echo "<input type='submit' name='deleteitem' value=\"".$LANG["buttons"][6]."\" class='submit'>"; |
||
306 | echo "</td>"; |
||
307 | echo "</table>"; |
||
308 | |||
309 | echo "</div>"; |
||
310 | |||
311 | |||
312 | }else{
|
||
313 | |||
314 | echo "</table></div>" ; |
||
315 | } |
||
316 | echo "</form>"; |
||
317 | } |
||
318 | |||
319 | } |
||
320 | |||
321 | /**
|
||
322 | * Add a document to an item
|
||
323 | *
|
||
324 | * @param $docID document ID
|
||
325 | * @param $ID item ID
|
||
326 | * @param $type item type
|
||
327 | **/
|
||
328 | function addDeviceDocument($docID,$type,$ID){ |
||
329 | global $DB; |
||
330 | if ($docID>0&&$ID>0&&$type>0){ |
||
331 | // Do not insert auto link for document
|
||
332 | if ($type==DOCUMENT_TYPE && $ID == $docID){ |
||
333 | return;
|
||
334 | } |
||
335 | $query="INSERT INTO glpi_doc_device (FK_doc,FK_device, device_type) VALUES ('$docID','$ID','$type');"; |
||
336 | $result = $DB->query($query); |
||
337 | } |
||
338 | } |
||
339 | /**
|
||
340 | * Delete a document to an item
|
||
341 | *
|
||
342 | * @param $ID doc_device ID
|
||
343 | **/
|
||
344 | function deleteDeviceDocument($ID){ |
||
345 | |||
346 | global $DB; |
||
347 | $query="DELETE FROM glpi_doc_device WHERE ID= '$ID';"; |
||
348 | $result = $DB->query($query); |
||
349 | } |
||
350 | |||
351 | /**
|
||
352 | * Show documents associated to an item
|
||
353 | *
|
||
354 | * @param $device_type item type
|
||
355 | * @param $ID item ID
|
||
356 | * @param $withtemplate if 3 -> view via helpdesk -> no links
|
||
357 | **/
|
||
358 | function showDocumentAssociated($device_type,$ID,$withtemplate=''){ |
||
359 | |||
360 | global $DB, $CFG_GLPI, $LANG, $LINK_ID_TABLE; |
||
361 | |||
362 | if ($device_type!=KNOWBASE_TYPE) |
||
363 | if (!haveRight("document","r")||!haveTypeRight($device_type,"r")) return false; |
||
364 | |||
365 | if (empty($withtemplate)) $withtemplate=0; |
||
366 | |||
367 | $ci=new CommonItem(); |
||
368 | $ci->getFromDB($device_type,$ID); |
||
369 | $canread=$ci->obj->can($ID,'r'); |
||
370 | $canedit=$ci->obj->can($ID,'w'); |
||
371 | |||
372 | $needed_fields=array('ID','name','filename','mime','rubrique','link','deleted','FK_entities','recursive'); |
||
373 | |||
374 | |||
375 | $query = "SELECT glpi_doc_device.ID AS assocID, glpi_entities.ID AS entity, |
||
376 | glpi_docs.name AS assocName, glpi_docs.* FROM glpi_doc_device
|
||
377 | LEFT JOIN glpi_docs ON (glpi_doc_device.FK_doc=glpi_docs.ID)
|
||
378 | LEFT JOIN glpi_entities ON (glpi_docs.FK_entities=glpi_entities.ID)
|
||
379 | WHERE glpi_doc_device.FK_device = '$ID' AND glpi_doc_device.device_type = '$device_type' ";
|
||
380 | |||
381 | if (isset($_SESSION["glpiID"])){ |
||
382 | $query .= getEntitiesRestrictRequest(" AND","glpi_docs",'','',true); |
||
383 | } else {
|
||
384 | // Anonymous access from FAQ
|
||
385 | $query .= " AND glpi_docs.FK_entities=0 "; |
||
386 | } |
||
387 | |||
388 | // Document : search links in both order using union
|
||
389 | if ($device_type==DOCUMENT_TYPE){ |
||
390 | $query .= "UNION |
||
391 | SELECT glpi_doc_device.ID as assocID, glpi_entities.ID AS entity,
|
||
392 | glpi_docs.name AS assocName, glpi_docs.* FROM glpi_doc_device
|
||
393 | LEFT JOIN glpi_docs ON (glpi_doc_device.FK_device=glpi_docs.ID)
|
||
394 | LEFT JOIN glpi_entities ON (glpi_docs.FK_entities=glpi_entities.ID)
|
||
395 | WHERE glpi_doc_device.FK_doc = '$ID' AND glpi_doc_device.device_type = '$device_type' ";
|
||
396 | if (isset($_SESSION["glpiID"])){ |
||
397 | $query .= getEntitiesRestrictRequest(" AND","glpi_docs",'','',true); |
||
398 | } else {
|
||
399 | // Anonymous access from FAQ
|
||
400 | $query .= " AND glpi_docs.FK_entities=0 "; |
||
401 | } |
||
402 | } |
||
403 | $query .= " ORDER BY assocName"; |
||
404 | |||
405 | //echo $query;
|
||
406 | |||
407 | $result = $DB->query($query); |
||
408 | $number = $DB->numrows($result); |
||
409 | $i = 0; |
||
410 | |||
411 | if ($withtemplate!=2) { |
||
412 | echo "<form method='post' action=\"".$CFG_GLPI["root_doc"]."/front/document.form.php\" enctype=\"multipart/form-data\">"; |
||
413 | } |
||
414 | echo "<br><br><div class='center'><table class='tab_cadre_fixe'>"; |
||
415 | echo "<tr><th colspan='7'>".$LANG["document"][21].":</th></tr>"; |
||
416 | echo "<tr><th>".$LANG["common"][16]."</th>"; |
||
417 | echo "<th>".$LANG["entity"][0]."</th>"; |
||
418 | echo "<th width='100px'>".$LANG["document"][2]."</th>"; |
||
419 | echo "<th>".$LANG["document"][33]."</th>"; |
||
420 | echo "<th>".$LANG["document"][3]."</th>"; |
||
421 | echo "<th>".$LANG["document"][4]."</th>"; |
||
422 | if ($withtemplate<2)echo "<th> </th>"; |
||
423 | echo "</tr>"; |
||
424 | $used=array(); |
||
425 | if ($number){ |
||
426 | while ($data=$DB->fetch_assoc($result)) { |
||
427 | $docID=$data["ID"]; |
||
428 | $used[$docID]=$docID; |
||
429 | $assocID=$data["assocID"]; |
||
430 | |||
431 | echo "<tr class='tab_bg_1".($data["deleted"]?"_2":"")."'>"; |
||
432 | if ($withtemplate!=3 && $canread |
||
433 | && (in_array($data['FK_entities'],$_SESSION['glpiactiveentities']) || $data["recursive"]) |
||
434 | ){ |
||
435 | echo "<td class='center'><a href='".$CFG_GLPI["root_doc"]."/front/document.form.php?ID=$docID'><strong>".$data["name"]; |
||
436 | if ($CFG_GLPI["view_ID"]) echo " (".$docID.")"; |
||
437 | echo "</strong></a></td>"; |
||
438 | } else {
|
||
439 | echo "<td class='center'><strong>".$data["name"]; |
||
440 | if ($CFG_GLPI["view_ID"]) echo " (".$docID.")"; |
||
441 | echo "</strong></td>"; |
||
442 | } |
||
443 | echo "<td class='center'>".getDropdownName("glpi_entities",$data['entity'])."</td>"; |
||
444 | |||
445 | echo "<td align='center' width='100px'>".getDocumentLink($data["filename"])."</td>"; |
||
446 | |||
447 | echo "<td class='center'>"; |
||
448 | if (!empty($data["link"])) |
||
449 | echo "<a target=_blank href='".$data["link"]."'>".$data["link"]."</a>"; |
||
450 | else echo " "; |
||
451 | echo "</td>"; |
||
452 | echo "<td class='center'>".getDropdownName("glpi_dropdown_rubdocs",$data["rubrique"])."</td>"; |
||
453 | echo "<td class='center'>".$data["mime"]."</td>"; |
||
454 | |||
455 | if ($withtemplate<2) { |
||
456 | echo "<td align='center' class='tab_bg_2'>"; |
||
457 | if ($canedit) |
||
458 | echo "<a href='".$CFG_GLPI["root_doc"]."/front/document.form.php?deleteitem=deleteitem&ID=$assocID&devtype=$device_type&devid=$ID&docid=$docID'><strong>".$LANG["buttons"][6]."</strong></a>"; |
||
459 | else echo " "; |
||
460 | echo "</td>"; |
||
461 | } |
||
462 | echo "</tr>"; |
||
463 | $i++;
|
||
464 | } |
||
465 | } |
||
466 | |||
467 | if ($canedit){ |
||
468 | // Restrict entity for knowbase
|
||
469 | $ci=new CommonItem(); |
||
470 | $entities=""; |
||
471 | $entity=$_SESSION["glpiactive_entity"]; |
||
472 | if ($ci->getFromDB($device_type,$ID) && isset($ci->obj->fields["FK_entities"])) { |
||
473 | $entity=$ci->getField('FK_entities'); |
||
474 | |||
475 | if (isset($ci->obj->fields["recursive"]) && $ci->obj->fields["recursive"]) { |
||
476 | $entities = getEntitySons($ci->obj->fields["FK_entities"]); |
||
477 | } else {
|
||
478 | $entities = $ci->obj->fields["FK_entities"]; |
||
479 | } |
||
480 | } |
||
481 | $limit = getEntitiesRestrictRequest(" AND ","glpi_docs",'',$entities,true); |
||
482 | $q="SELECT count(*) FROM glpi_docs WHERE deleted='0' $limit"; |
||
483 | |||
484 | $result = $DB->query($q); |
||
485 | $nb = $DB->result($result,0,0); |
||
486 | |||
487 | if ($withtemplate<2){ |
||
488 | |||
489 | echo "<tr class='tab_bg_1'><td align='center' colspan='3'>" . |
||
490 | "<input type='hidden' name='FK_entities' value='$entity'>" .
|
||
491 | "<input type='hidden' name='item' value='$ID'>" .
|
||
492 | "<input type='hidden' name='type' value='$device_type'>" .
|
||
493 | "<input type='file' name='filename' size='25'> " .
|
||
494 | "<input type='submit' name='add' value=\"".$LANG["buttons"][8]."\" class='submit'>" . |
||
495 | "</td>";
|
||
496 | |||
497 | if ($device_type==DOCUMENT_TYPE){ |
||
498 | $used[$ID]=$ID; |
||
499 | } |
||
500 | |||
501 | if ($nb>count($used)) { |
||
502 | echo "<td align='left' colspan='2'>"; |
||
503 | echo "<div class='software-instal'>"; |
||
504 | echo "<input type='hidden' name='right' value='item'>"; |
||
505 | dropdownDocument("conID",$entities,$used); |
||
506 | echo "</div></td><td class='center'>"; |
||
507 | echo "<input type='submit' name='additem' value=\"".$LANG["buttons"][8]."\" class='submit'>"; |
||
508 | echo "</td><td> </td>"; |
||
509 | } |
||
510 | else {
|
||
511 | echo "<td colspan='4'> </td>"; |
||
512 | } |
||
513 | echo "</tr>"; |
||
514 | } |
||
515 | } |
||
516 | |||
517 | echo "</table></div>" ; |
||
518 | echo "</form>"; |
||
519 | |||
520 | } |
||
521 | |||
522 | /**
|
||
523 | * Get download link for a document
|
||
524 | *
|
||
525 | * @param filename filename of the document
|
||
526 | * @param $params additonal parameters to be added to the link
|
||
527 | **/
|
||
528 | function getDocumentLink($filename,$params=""){ |
||
529 | global $DB,$CFG_GLPI; |
||
530 | if (empty($filename)) |
||
531 | return " "; |
||
532 | $out=""; |
||
533 | $splitter=split("/",$filename); |
||
534 | if (count($splitter)==2) |
||
535 | $fileout=$splitter[1]; |
||
536 | else $fileout=$filename; |
||
537 | |||
538 | if (strlen($fileout)>20) $fileout=substr($fileout,0,20)."..."; |
||
539 | |||
540 | if (count($splitter)==2){ |
||
541 | |||
542 | $query="SELECT * from glpi_type_docs WHERE ext LIKE '".$splitter[0]."' AND icon <> ''"; |
||
543 | |||
544 | if ($result=$DB->query($query)) |
||
545 | if ($DB->numrows($result)>0){ |
||
546 | $icon=$DB->result($result,0,'icon'); |
||
547 | |||
548 | $out="<a href=\"".$CFG_GLPI["root_doc"]."/front/document.send.php?file=$filename$params\" target=\"_blank\"> <img style=\"vertical-align:middle; margin-left:3px; margin-right:6px;\" alt='".$fileout."' title='".$fileout."' src=\"".$CFG_GLPI["typedoc_icon_dir"]."/$icon\" ></a>"; |
||
549 | } |
||
550 | |||
551 | } |
||
552 | |||
553 | $out.="<a href=\"".$CFG_GLPI["root_doc"]."/front/document.send.php?file=$filename$params\" target=\"_blank\"><strong>$fileout</strong></a>"; |
||
554 | |||
555 | |||
556 | return $out; |
||
557 | } |
||
558 | |||
559 | /**
|
||
560 | * Clean a filename to keep alphanum chars + -_.
|
||
561 | *
|
||
562 | * @param name filename to clean
|
||
563 | **/
|
||
564 | function cleanFilenameDocument($name){ |
||
565 | // See http://en.wikipedia.org/wiki/Filename
|
||
566 | $bad_chars = array("'", "\\", ' ', '/', ':', '*', '?', '"', '<', '>', '|'); |
||
567 | $name = str_replace($bad_chars, '_', $name); |
||
568 | $name = preg_replace("/%(\w{2})/", '_', $name); |
||
569 | return preg_replace("/\\x00-\\x1f/u", '_', $name); |
||
570 | } |
||
571 | |||
572 | /**
|
||
573 | * Show dropdown of uploaded files
|
||
574 | *
|
||
575 | * @param $myname dropdown name
|
||
576 | **/
|
||
577 | function showUploadedFilesDropdown($myname){ |
||
578 | global $CFG_GLPI,$LANG; |
||
579 | |||
580 | if (is_dir(GLPI_DOC_DIR."/_uploads")){ |
||
581 | $uploaded_files=array(); |
||
582 | if ($handle = opendir(GLPI_DOC_DIR."/_uploads")) { |
||
583 | while (false !== ($file = readdir($handle))) { |
||
584 | if ($file != "." && $file != "..") { |
||
585 | $dir=isValidDoc($file); |
||
586 | if (!empty($dir)) |
||
587 | $uploaded_files[]=$file; |
||
588 | } |
||
589 | } |
||
590 | closedir($handle); |
||
591 | } |
||
592 | |||
593 | if (count($uploaded_files)){ |
||
594 | echo "<select name='$myname'>"; |
||
595 | echo "<option value=''>-----</option>"; |
||
596 | foreach ($uploaded_files as $key => $val) |
||
597 | echo "<option value=\"$val\">$val</option>"; |
||
598 | echo "</select>"; |
||
599 | } else echo $LANG["document"][37]; |
||
600 | } else echo $LANG["document"][35]; |
||
601 | } |
||
602 | |||
603 | /**
|
||
604 | * Is this file a valid file ? check based on file extension
|
||
605 | *
|
||
606 | * @param $filename filename to clean
|
||
607 | **/
|
||
608 | function isValidDoc($filename){ |
||
609 | global $DB; |
||
610 | $splitter=split("\.",$filename); |
||
611 | $ext=end($splitter); |
||
612 | |||
613 | $query="SELECT * from glpi_type_docs where ext LIKE '$ext' AND upload='1'"; |
||
614 | if ($result = $DB->query($query)) |
||
615 | if ($DB->numrows($result)>0) |
||
616 | return strtoupper($ext); |
||
617 | |||
618 | return ""; |
||
619 | } |
||
620 | |||
621 | |||
622 | ?> |