dolibarr 24.0.0-beta
photos_resize.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2010-2015 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2009 Meos
4 * Copyright (C) 2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2016 Juanjo Menent <jmenent@2byte.es>
6 * Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
7 * Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
8 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
30// Load Dolibarr environment
31require '../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
34
44// Load translation files required by the page
45$langs->loadLangs(array("products", "other"));
46
47$id = GETPOSTINT('id');
48$action = GETPOST('action', 'aZ09');
49$modulepart = GETPOST('modulepart', 'alpha') ? GETPOST('modulepart', 'alpha') : 'produit|service';
50$original_file = GETPOST("file");
51$backtourl = GETPOST('backtourl');
52$cancel = GETPOST('cancel', 'alpha');
53
54$file = GETPOST('file', 'alpha');
55$num = GETPOST('num', 'alpha'); // Used for document on bank statement
56$website = GETPOST('website', 'alpha');
57
58
59// Security check
60if (empty($modulepart)) {
61 accessforbidden('Bad value for modulepart');
62}
63$accessallowed = 0;
64if ($modulepart == 'produit' || $modulepart == 'product' || $modulepart == 'service' || $modulepart == 'produit|service') {
65 $result = restrictedArea($user, 'produit|service', $id, 'product&product');
66 if ($modulepart == 'produit|service' && (!$user->hasRight('produit', 'lire') && !$user->hasRight('service', 'lire'))) {
68 }
69 $accessallowed = 1;
70} elseif ($modulepart == 'project') {
71 $result = restrictedArea($user, 'projet', $id);
72 if (!$user->hasRight('projet', 'lire')) {
74 }
75 $accessallowed = 1;
76} elseif ($modulepart == 'bom') {
77 $result = restrictedArea($user, $modulepart, $id, 'bom_bom');
78 if (!$user->hasRight('bom', 'read')) {
80 }
81 $accessallowed = 1;
82} elseif ($modulepart == 'member') {
83 $result = restrictedArea($user, 'adherent', $id, '', '', 'fk_soc', 'rowid');
84 if (!$user->hasRight('adherent', 'lire')) {
86 }
87 $accessallowed = 1;
88} elseif ($modulepart == 'user') {
89 $result = restrictedArea($user, $modulepart, $id, $modulepart, $modulepart);
90 if (!$user->hasRight('user', 'user', 'lire')) {
92 }
93 $accessallowed = 1;
94} elseif ($modulepart == 'tax') {
95 $result = restrictedArea($user, $modulepart, $id, 'chargesociales', 'charges');
96 if (!$user->hasRight('tax', 'charges', 'lire')) {
98 }
99 $accessallowed = 1;
100} elseif ($modulepart == 'bank') {
101 $result = restrictedArea($user, 'banque', $id, 'bank_account');
102 if (!$user->hasRight('banque', 'lire')) {
104 }
105 $accessallowed = 1;
106} elseif ($modulepart == 'medias') {
107 $permtoadd = ($user->hasRight('mailing', 'creer') || $user->hasRight('website', 'write'));
108 if (!$permtoadd) {
110 }
111 $accessallowed = 1;
112} elseif ($modulepart == 'facture_fourn' || $modulepart == 'facture_fournisseur') {
113 $result = restrictedArea($user, 'fournisseur', $id, 'facture_fourn', 'facture');
114 if (!$user->hasRight('fournisseur', 'facture', 'lire')) {
116 }
117 $accessallowed = 1;
118} else {
119 // ticket, holiday, expensereport, societe...
120 $result = restrictedArea($user, $modulepart, $id, $modulepart);
121 if (!$user->hasRight($modulepart, 'read') && !$user->hasRight($modulepart, 'lire')) {
123 }
124 $accessallowed = 1;
125}
126
127// Security:
128// Limit access if permissions are wrong
129if (!$accessallowed) {
131}
132
133// Define dir according to modulepart
134$dir = '';
135$object = null;
136if ($modulepart == 'produit' || $modulepart == 'product' || $modulepart == 'service' || $modulepart == 'produit|service') {
137 require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
138 $object = new Product($db);
139 if ($id > 0) {
140 $result = $object->fetch($id);
141 if ($result <= 0) {
142 dol_print_error($db, 'Failed to load object');
143 }
144 $dir = $conf->product->multidir_output[$object->entity ?? $conf->entity]; // By default
145 if ($object->type == Product::TYPE_PRODUCT) {
146 $dir = $conf->product->multidir_output[$object->entity ?? $conf->entity];
147 }
148 if ($object->type == Product::TYPE_SERVICE) {
149 $dir = $conf->service->multidir_output[$object->entity ?? $conf->entity];
150 }
151 }
152} elseif ($modulepart == 'project') {
153 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
154 $object = new Project($db);
155 if ($id > 0) {
156 $result = $object->fetch($id);
157 if ($result <= 0) {
158 dol_print_error($db, 'Failed to load object');
159 }
160 $dir = $conf->project->multidir_output[$object->entity ?? $conf->entity]; // By default
161 }
162} elseif ($modulepart == 'propal') {
163 require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
164 $object = new Propal($db);
165 if ($id > 0) {
166 $result = $object->fetch($id);
167 if ($result <= 0) {
168 dol_print_error($db, 'Failed to load object');
169 }
170 $dir = $conf->propal->multidir_output[$object->entity ?? $conf->entity]; // By default
171 }
172} elseif ($modulepart == 'holiday') {
173 require_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php';
174 $object = new Holiday($db);
175 if ($id > 0) {
176 $result = $object->fetch($id);
177 if ($result <= 0) {
178 dol_print_error($db, 'Failed to load object');
179 }
180 $dir = $conf->$modulepart->dir_output; // By default
181 }
182} elseif ($modulepart == 'member') {
183 require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
184 $object = new Adherent($db);
185 if ($id > 0) {
186 $result = $object->fetch($id);
187 if ($result <= 0) {
188 dol_print_error($db, 'Failed to load object');
189 }
190 $dir = $conf->adherent->dir_output; // By default
191 }
192} elseif ($modulepart == 'societe') {
193 require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
194 $object = new Societe($db);
195 if ($id > 0) {
196 $result = $object->fetch($id);
197 if ($result <= 0) {
198 dol_print_error($db, 'Failed to load object');
199 }
200 $dir = $conf->$modulepart->dir_output;
201 }
202} elseif ($modulepart == 'user') {
203 require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
204 $object = new User($db);
205 if ($id > 0) {
206 $result = $object->fetch($id);
207 if ($result <= 0) {
208 dol_print_error($db, 'Failed to load object');
209 }
210 $dir = $conf->$modulepart->dir_output; // By default
211 }
212} elseif ($modulepart == 'expensereport') {
213 require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
215 if ($id > 0) {
216 $result = $object->fetch($id);
217 if ($result <= 0) {
218 dol_print_error($db, 'Failed to load object');
219 }
220 $dir = $conf->expensereport->dir_output; // By default
221 }
222} elseif ($modulepart == 'tax') {
223 require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
225 if ($id > 0) {
226 $result = $object->fetch($id);
227 if ($result <= 0) {
228 dol_print_error($db, 'Failed to load object');
229 }
230 $dir = $conf->$modulepart->dir_output; // By default
231 }
232} elseif ($modulepart == 'ticket') {
233 require_once DOL_DOCUMENT_ROOT.'/ticket/class/ticket.class.php';
234 $object = new Ticket($db);
235 if ($id > 0) {
236 $result = $object->fetch($id);
237 if ($result <= 0) {
238 dol_print_error($db, 'Failed to load object');
239 }
240 $dir = $conf->$modulepart->dir_output; // By default
241 }
242} elseif ($modulepart == 'bom') {
243 require_once DOL_DOCUMENT_ROOT.'/bom/class/bom.class.php';
244 $object = new BOM($db);
245 if ($id > 0) {
246 $result = $object->fetch($id);
247 if ($result <= 0) {
248 dol_print_error($db, 'Failed to load object');
249 }
250 $dir = $conf->$modulepart->dir_output; // By default
251 }
252} elseif ($modulepart == 'mrp') {
253 require_once DOL_DOCUMENT_ROOT.'/mrp/class/mo.class.php';
254 $object = new Mo($db);
255 if ($id > 0) {
256 $result = $object->fetch($id);
257 if ($result <= 0) {
258 dol_print_error($db, 'Failed to load object');
259 }
260 $dir = $conf->$modulepart->dir_output; // By default
261 }
262} elseif ($modulepart == 'bank') {
263 require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
264 $object = new Account($db);
265 if ($id > 0) {
266 $result = $object->fetch($id);
267 if ($result <= 0) {
268 dol_print_error($db, 'Failed to load object');
269 }
270 $dir = $conf->bank->dir_output; // By default
271 }
272} elseif ($modulepart == 'facture') {
273 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
274 $object = new Facture($db);
275 if ($id > 0) {
276 $result = $object->fetch($id);
277 if ($result <= 0) {
278 dol_print_error($db, 'Failed to load object');
279 }
280 $dir = $conf->$modulepart->dir_output; // By default
281 }
282} elseif ($modulepart == 'facture_fourn' || $modulepart == 'facture_fournisseur') {
283 require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
285 if ($id > 0) {
286 $result = $object->fetch($id);
287 if ($result <= 0) {
288 dol_print_error($db, 'Failed to load object');
289 }
290 $dir = $conf->fournisseur->dir_output.'/facture'; // By default
291 }
292} elseif ($modulepart == 'medias') {
293 $dir = $dolibarr_main_data_root.'/'.$modulepart;
294} else {
295 print 'Bug: Action crop for modulepart = '.$modulepart.' is not supported yet by photos_resize.php.';
296}
297
298if (empty($backtourl)) {
299 $regs = array();
300
301 if (in_array($modulepart, array('product', 'produit', 'service', 'produit|service'))) {
302 $backtourl = DOL_URL_ROOT."/product/document.php?id=".((int) $id).'&file='.urlencode($file);
303 } elseif (in_array($modulepart, array('expensereport'))) {
304 $backtourl = DOL_URL_ROOT."/expensereport/document.php?id=".((int) $id).'&file='.urlencode($file);
305 } elseif (in_array($modulepart, array('holiday'))) {
306 $backtourl = DOL_URL_ROOT."/holiday/document.php?id=".((int) $id).'&file='.urlencode($file);
307 } elseif (in_array($modulepart, array('member'))) {
308 $backtourl = DOL_URL_ROOT."/adherents/document.php?id=".((int) $id).'&file='.urlencode($file);
309 } elseif (in_array($modulepart, array('project'))) {
310 $backtourl = DOL_URL_ROOT."/projet/document.php?id=".((int) $id).'&file='.urlencode($file);
311 } elseif (in_array($modulepart, array('propal'))) {
312 $backtourl = DOL_URL_ROOT."/comm/propal/document.php?id=".((int) $id).'&file='.urlencode($file);
313 } elseif (in_array($modulepart, array('societe'))) {
314 $backtourl = DOL_URL_ROOT."/societe/document.php?id=".((int) $id).'&file='.urlencode($file);
315 } elseif (in_array($modulepart, array('tax'))) {
316 $backtourl = DOL_URL_ROOT."/compta/sociales/document.php?id=".((int) $id).'&file='.urlencode($file);
317 } elseif (in_array($modulepart, array('ticket'))) {
318 $backtourl = DOL_URL_ROOT."/ticket/document.php?id=".((int) $id).'&file='.urlencode($file);
319 } elseif (in_array($modulepart, array('user'))) {
320 $backtourl = DOL_URL_ROOT."/user/document.php?id=".((int) $id).'&file='.urlencode($file);
321 } elseif (in_array($modulepart, array('facture'))) {
322 $backtourl = DOL_URL_ROOT."/compta/facture/document.php?id=".((int) $id).'&file='.urlencode($file);
323 } elseif (in_array($modulepart, array('facture_fourn', 'facture_fournisseur'))) {
324 $backtourl = DOL_URL_ROOT."/fourn/facture/document.php?id=".((int) $id).'&file='.urlencode($file);
325 } elseif (in_array($modulepart, array('bank')) && preg_match('/\/statement\/([^\/]+)\//', $file, $regs)) {
326 $num = $regs[1];
327 $backtourl = DOL_URL_ROOT."/compta/bank/account_statement_document.php?id=".((int) $id).'&num='.urlencode($num).'&file='.urlencode($file);
328 } elseif (in_array($modulepart, array('bank'))) {
329 $backtourl = DOL_URL_ROOT."/compta/bank/document.php?id=".((int) $id).'&file='.urlencode($file);
330 } elseif (in_array($modulepart, array('mrp'))) {
331 $backtourl = DOL_URL_ROOT."/mrp/mo_document.php?id=".((int) $id).'&file='.urlencode($file);
332 } elseif (in_array($modulepart, array('medias'))) {
333 $section_dir = dirname($file);
334 if (!preg_match('/\/$/', $section_dir)) {
335 $section_dir .= '/';
336 }
337 $backtourl = DOL_URL_ROOT.'/website/index.php?action=file_manager'.($website ? '&website='.urlencode($website) : '').'&section_dir='.urlencode($section_dir);
338 } else {
339 // Generic case that should work for everybody else
340 $backtourl = DOL_URL_ROOT."/".$modulepart."/".$modulepart."_document.php?id=".((int) $id).'&file='.urlencode($file);
341 }
342}
343
344
345/*
346 * Actions
347 */
348
349if ($cancel) {
350 if ($backtourl) {
351 header("Location: ".$backtourl);
352 exit;
353 } else {
354 dol_print_error(null, 'Cancel on photo_resize with a not supported value of modulepart='.$modulepart);
355 exit;
356 }
357}
358
359if ($action == 'confirm_resize' && GETPOSTISSET("file") && GETPOSTISSET("sizex") && GETPOSTISSET("sizey")) { // Test on permission already done
360 if (empty($dir)) {
361 dol_print_error(null, 'Bug: Value for $dir could not be defined.');
362 exit;
363 }
364
365 $fullpath = $dir."/".$original_file;
366
367 $result = dol_imageResizeOrCrop($fullpath, 0, GETPOSTINT('sizex'), GETPOSTINT('sizey'));
368
369 if ($result == $fullpath) {
370 // If image is related to a given object, we create also thumbs.
371 if (is_object($object)) {
372 $object->addThumbs($fullpath);
373 }
374
375 // Update/create database for file $fullpath
376 $rel_filename = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $fullpath);
377 $rel_filename = preg_replace('/^[\\/]/', '', $rel_filename);
378
379 include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
380 $ecmfile = new EcmFiles($db);
381 $result = $ecmfile->fetch(0, '', $rel_filename);
382 if ($result > 0) { // If found
383 $filename = basename($rel_filename);
384 $rel_dir = dirname($rel_filename);
385 $rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
386 $rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
387
388 $ecmfile->label = md5_file(dol_osencode($fullpath));
389 $result = $ecmfile->update($user);
390 } elseif ($result == 0) { // If not found
391 $filename = basename($rel_filename);
392 $rel_dir = dirname($rel_filename);
393 $rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
394 $rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
395
396 $ecmfile->filepath = $rel_dir;
397 $ecmfile->filename = $filename;
398 $ecmfile->label = md5_file(dol_osencode($fullpath)); // $fullpath is a full path to file
399 $ecmfile->fullpath_orig = $fullpath;
400 $ecmfile->gen_or_uploaded = 'unknown';
401 $ecmfile->description = ''; // indexed content
402 $ecmfile->keywords = ''; // keyword content
403 $result = $ecmfile->create($user);
404 if ($result < 0) {
405 setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
406 }
407 $result = $ecmfile->create($user);
408 }
409
410 if ($backtourl) {
411 header("Location: ".$backtourl);
412 exit;
413 } else {
414 dol_print_error(null, 'confirm_resize on photo_resize without backtourl defined for modulepart='.$modulepart);
415 exit;
416 }
417 } else {
418 setEventMessages($result, null, 'errors');
419 $action = '';
420 }
421}
422
423// Crop if image
424if ($action == 'confirm_crop') { // Test on permission already done
425 if (empty($dir)) {
426 print 'Bug: Value for $dir could not be defined.';
427 }
428
429 $fullpath = $dir."/".$original_file;
430
431 $result = dol_imageResizeOrCrop($fullpath, 1, GETPOSTINT('w'), GETPOSTINT('h'), GETPOSTINT('x'), GETPOSTINT('y'));
432
433 if ($result == $fullpath) {
434 if (is_object($object)) {
435 $object->addThumbs($fullpath);
436 }
437
438 // Update/create database for file $fullpath
439 $rel_filename = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $fullpath);
440 $rel_filename = preg_replace('/^[\\/]/', '', $rel_filename);
441
442 include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
443 $ecmfile = new EcmFiles($db);
444 $result = $ecmfile->fetch(0, '', $rel_filename);
445 if ($result > 0) { // If found
446 $filename = basename($rel_filename);
447 $rel_dir = dirname($rel_filename);
448 $rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
449 $rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
450
451 $ecmfile->label = md5_file(dol_osencode($fullpath));
452 $result = $ecmfile->update($user);
453 } elseif ($result == 0) { // If not found
454 $filename = basename($rel_filename);
455 $rel_dir = dirname($rel_filename);
456 $rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
457 $rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
458
459 $ecmfile->filepath = $rel_dir;
460 $ecmfile->filename = $filename;
461 $ecmfile->label = md5_file(dol_osencode($fullpath)); // $fullpath is a full path to file
462 $ecmfile->fullpath_orig = $fullpath;
463 $ecmfile->gen_or_uploaded = 'unknown';
464 $ecmfile->description = ''; // indexed content
465 $ecmfile->keywords = ''; // keyword content
466 $result = $ecmfile->create($user);
467 if ($result < 0) {
468 setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
469 }
470 }
471
472 if ($backtourl) {
473 header("Location: ".$backtourl);
474 exit;
475 } else {
476 dol_print_error(null, 'confirm_crop on photo_resize without backtourl defined for modulepart='.$modulepart);
477 exit;
478 }
479 } else {
480 setEventMessages($result, null, 'errors');
481 $action = '';
482 }
483}
484
485
486/*
487 * View
488 */
489
490$head = '';
491$title = $langs->trans("ImageEditor");
492$morejs = array('/public/includes/jquery/plugins/jcrop/js/jquery.Jcrop.min.js', '/core/js/lib_photosresize.js');
493$morecss = array('/public/includes/jquery/plugins/jcrop/css/jquery.Jcrop.css');
494
495llxHeader($head, $title, '', '', 0, 0, $morejs, $morecss);
496
497
498print load_fiche_titre($title);
499
500$infoarray = dol_getImageSize($dir."/".GETPOST("file", 'alpha'));
501$height = $infoarray['height'];
502$width = $infoarray['width'];
503print '<span class="opacitymedium hideonsmartphone">'.$langs->trans("CurrentInformationOnImage").': </span>';
504print '<span class="opacitymedium">';
505print $langs->trans("Width").': <strong>'.$width.'</strong> x '.$langs->trans("Height").': <strong>'.$height.'</strong>';
506print '</span><br>';
507
508print '<br>'."\n";
509
510
511/*
512 * Resize image
513 */
514
515print '<!-- Form to resize -->'."\n";
516print '<form name="redim_file" action="'.$_SERVER["PHP_SELF"].'?id='.((int) $id).($num ? '&num='.urlencode($num) : '').'" method="POST">';
517print '<input type="hidden" name="token" value="'.newToken().'">';
518print '<input type="hidden" name="backtourl" value="'.$backtourl.'">';
519
520print '<fieldset id="redim_file">';
521print '<legend>'.$langs->trans("Resize").'</legend>';
522print $langs->trans("ResizeDesc").'<br>';
523print $langs->trans("NewLength").': <input name="sizex" type="number" class="flat maxwidth75 right"> px &nbsp; <span class="opacitymedium">'.$langs->trans("or").'</span> &nbsp; ';
524print $langs->trans("NewHeight").': <input name="sizey" type="number" class="flat maxwidth75 right"> px &nbsp; <br>';
525
526print '<input type="hidden" name="file" value="'.dol_escape_htmltag($file).'" />';
527print '<input type="hidden" name="action" value="confirm_resize" />';
528print '<input type="hidden" name="product" value="'.$id.'" />';
529print '<input type="hidden" name="modulepart" value="'.dol_escape_htmltag($modulepart).'" />';
530print '<input type="hidden" name="id" value="'.$id.'" />';
531print '<br>';
532print '<input class="button" id="submitresize" name="sendit" value="'.dol_escape_htmltag($langs->trans("Resize")).'" type="submit" />';
533print '&nbsp;';
534print '<input type="submit" id="cancelresize" name="cancel" class="button button-cancel" value="'.dol_escape_htmltag($langs->trans("Cancel")).'" />';
535print '</fieldset>'."\n";
536print '</form>';
537
538print '<br>'."\n";
539
540
541/*
542 * Crop image
543 */
544
545print '<br>'."\n";
546
547if (!empty($conf->use_javascript_ajax)) {
548 $infoarray = dol_getImageSize($dir."/".GETPOST("file"));
549 $height = $infoarray['height'];
550 $width = $infoarray['width'];
551 $widthforcrop = $width;
552 $refsizeforcrop = 'orig';
553 $ratioforcrop = 1;
554
555 // If image is too large, we use another scale.
556 if (!empty($_SESSION['dol_screenwidth'])) {
557 $widthforcroporigin = $widthforcrop;
558 while ($widthforcrop > round($_SESSION['dol_screenwidth'] / 1.5)) {
559 //var_dump($widthforcrop.' '.round($_SESSION['dol_screenwidth'] / 1.5));
560 $ratioforcrop = 2 * $ratioforcrop;
561 $widthforcrop = floor($widthforcroporigin / $ratioforcrop);
562 $refsizeforcrop = 'screenwidth';
563 }
564 }
565
566 print '<!-- Form to crop -->'."\n";
567 print '<fieldset id="redim_file">';
568 print '<legend>'.$langs->trans("Crop").'</legend>';
569 print $langs->trans("DefineNewAreaToPick").'...<br>';
570 print '<br><div class="center">';
571
572 if (empty($conf->dol_no_mouse_hover) && $object !== null) {
573 print '<div style="border: 1px solid #888888; width: '.$widthforcrop.'px;">';
574 print '<img src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.urlencode($modulepart).'&entity='.((int) $object->entity).'&file='.urlencode($original_file).'" alt="" id="cropbox" width="'.$widthforcrop.'px"/>';
575 print '</div>';
576 print '</div><br>';
577
578 print '<form action="'.$_SERVER["PHP_SELF"].'?id='.((int) $id).($num ? '&num='.urlencode($num) : '').'" method="POST">';
579 print '<input type="hidden" name="token" value="'.newToken().'">';
580 print '<input type="hidden" name="backtourl" value="'.$backtourl.'">';
581 print '
582 <div class="jc_coords">
583 '.$langs->trans("NewSizeAfterCropping").':
584 &nbsp; <label>X1=<input type="number" class="flat maxwidth50" id="x" name="x" /></label>
585 &nbsp; <label>Y1=<input type="number" class="flat maxwidth50" id="y" name="y" /></label>
586 &nbsp; <label>X2=<input type="number" class="flat maxwidth50" id="x2" name="x2" /></label>
587 &nbsp; <label>Y2=<input type="number" class="flat maxwidth50" id="y2" name="y2" /></label>
588 &nbsp; <label>W=<input type="number" class="flat maxwidth50" id="w" name="w" /></label>
589 &nbsp; <label>H=<input type="number" class="flat maxwidth50" id="h" name="h" /></label>
590 </div>
591
592 <input type="hidden" id="file" name="file" value="'.dol_escape_htmltag($original_file).'" />
593 <input type="hidden" id="action" name="action" value="confirm_crop" />
594 <input type="hidden" id="product" name="product" value="'.dol_escape_htmltag((string) $id).'" />
595 <input type="hidden" id="dol_screenwidth" name="dol_screenwidth" value="'.($_SESSION['dol_screenwidth'] ?? 'null').'" />
596 <input type="hidden" id="refsizeforcrop" name="refsizeforcrop" value="'.$refsizeforcrop.'" />
597 <input type="hidden" id="ratioforcrop" name="ratioforcrop" value="'.$ratioforcrop.'" /><!-- value in field used by js/lib/lib_photoresize.js -->
598 <input type="hidden" id="imagewidth" name="imagewidth" value="'.$width.'" /><!-- value in field used by js/lib/lib_photoresize.js -->
599 <input type="hidden" id="imageheight" name="imageheight" value="'.$height.'" /><!-- value in field used by js/lib/lib_photoresize.js -->
600 <input type="hidden" name="modulepart" value="'.dol_escape_htmltag($modulepart).'" />
601 <input type="hidden" name="id" value="'.dol_escape_htmltag((string) $id).'" />
602 <br>
603 <input type="submit" id="submitcrop" name="submitcrop" class="button" value="'.dol_escape_htmltag($langs->trans("Crop")).'" />
604 &nbsp;
605 <input type="submit" id="cancelcrop" name="cancel" class="button button-cancel" value="'.dol_escape_htmltag($langs->trans("Cancel")).'" />
606 </form>'."\n";
607 } else {
608 $langs->load("other");
609 print '<div class="opacitymedium">'.$langs->trans("FeatureNotAvailableOnDevicesWithoutMouse").'</div>';
610 }
611 print '</fieldset>'."\n";
612 print '<br>';
613}
614
615/* Check that mandatory fields are filled */
616print '<script nonce="'.getNonce().'" type="text/javascript">
617jQuery(document).ready(function() {
618 $("#submitcrop").click(function(e) {
619 console.log("We click on submitcrop");
620 var idClicked = e.target.id;
621 if (parseInt(jQuery(\'#w\').val())) return true;
622 alert(\''.dol_escape_js($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Size"))).'\');
623 return false;
624 });
625});
626</script>';
627
628llxFooter();
629$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
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:73
Class to manage bank accounts.
Class to manage members of a foundation.
Class for BOM.
Definition bom.class.php:42
Class for managing the social charges.
Class to manage ECM files.
Class to manage Trips and Expenses.
Class to manage suppliers invoices.
Class to manage invoices.
Class of the module paid holiday.
Class for Mo.
Definition mo.class.php:35
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
Class to manage projects.
Class to manage proposals.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
dol_imageResizeOrCrop($file, $mode, $newWidth, $newHeight, $src_x=0, $src_y=0, $filetowrite='', $newquality=0)
Resize or crop an image file (Supported extensions are gif, jpg, png, bmp and webp)
dol_getImageSize($file, $url=false)
Return size of image file on disk (Supported extensions are gif, jpg, png, bmp and webp)
Class to generate the form for creating a new ticket.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.