dolibarr 20.0.0
myobject_card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) ---Put here your own copyright and developer email---
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
18
26// General defined Options
27//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
28//if (! defined('MAIN_AUTHENTICATION_MODE')) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
29//if (! defined('MAIN_LANG_DEFAULT')) define('MAIN_LANG_DEFAULT', 'auto'); // Force LANG (language) to a particular value
30//if (! defined('MAIN_SECURITY_FORCECSP')) define('MAIN_SECURITY_FORCECSP', 'none'); // Disable all Content Security Policies
31//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
32//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
33//if (! defined('NOLOGIN')) define('NOLOGIN', '1'); // Do not use login - if this page is public (can be called outside logged session). This includes the NOIPCHECK too.
34//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
35//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
36//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // Do not load html.form.class.php
37//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // Do not load and show top and left menu
38//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
39//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
40//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
41//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
42//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
43//if (! defined('NOSESSION')) define('NOSESSION', '1'); // On CLI mode, no need to use web sessions
44//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
45//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
46
47
48// Load Dolibarr environment
49$res = 0;
50// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
51if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
52 $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
53}
54// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
55$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
56while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
57 $i--;
58 $j--;
59}
60if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
61 $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
62}
63if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
64 $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
65}
66// Try main.inc.php using relative path
67if (!$res && file_exists("../main.inc.php")) {
68 $res = @include "../main.inc.php";
69}
70if (!$res && file_exists("../../main.inc.php")) {
71 $res = @include "../../main.inc.php";
72}
73if (!$res && file_exists("../../../main.inc.php")) {
74 $res = @include "../../../main.inc.php";
75}
76if (!$res) {
77 die("Include of main fails");
78}
79
80require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
81require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
82require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
83dol_include_once('/mymodule/class/myobject.class.php');
84dol_include_once('/mymodule/lib/mymodule_myobject.lib.php');
85
86// Load translation files required by the page
87$langs->loadLangs(array("mymodule@mymodule", "other"));
88
89// Get parameters
90$id = GETPOSTINT('id');
91$ref = GETPOST('ref', 'alpha');
92$lineid = GETPOSTINT('lineid');
93
94$action = GETPOST('action', 'aZ09');
95$confirm = GETPOST('confirm', 'alpha');
96$cancel = GETPOST('cancel', 'aZ09');
97$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search
98$backtopage = GETPOST('backtopage', 'alpha'); // if not set, a default page will be used
99$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha'); // if not set, $backtopage will be used
100$backtopagejsfields = GETPOST('backtopagejsfields', 'alpha');
101$dol_openinpopup = GETPOST('dol_openinpopup', 'aZ09');
102
103if (!empty($backtopagejsfields)) {
104 $tmpbacktopagejsfields = explode(':', $backtopagejsfields);
105 $dol_openinpopup = preg_replace('/[^a-z0-9_]/i', '', $tmpbacktopagejsfields[0]);
106}
107
108// Initialize technical objects
109$object = new MyObject($db);
110$extrafields = new ExtraFields($db);
111$diroutputmassaction = $conf->mymodule->dir_output.'/temp/massgeneration/'.$user->id;
112$hookmanager->initHooks(array($object->element.'card', 'globalcard')); // Note that conf->hooks_modules contains array
113
114// Fetch optionals attributes and labels
115$extrafields->fetch_name_optionals_label($object->table_element);
116
117$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
118
119// Initialize array of search criteria
120$search_all = trim(GETPOST("search_all", 'alpha'));
121$search = array();
122foreach ($object->fields as $key => $val) {
123 if (GETPOST('search_'.$key, 'alpha')) {
124 $search[$key] = GETPOST('search_'.$key, 'alpha');
125 }
126}
127
128if (empty($action) && empty($id) && empty($ref)) {
129 $action = 'view';
130}
131
132// Load object
133include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
134
135// There is several ways to check permission.
136// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
137$enablepermissioncheck = 0;
138if ($enablepermissioncheck) {
139 $permissiontoread = $user->hasRight('mymodule', 'myobject', 'read');
140 $permissiontoadd = $user->hasRight('mymodule', 'myobject', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
141 $permissiontodelete = $user->hasRight('mymodule', 'myobject', 'delete') || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
142 $permissionnote = $user->hasRight('mymodule', 'myobject', 'write'); // Used by the include of actions_setnotes.inc.php
143 $permissiondellink = $user->hasRight('mymodule', 'myobject', 'write'); // Used by the include of actions_dellink.inc.php
144} else {
145 $permissiontoread = 1;
146 $permissiontoadd = 1; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
147 $permissiontodelete = 1;
148 $permissionnote = 1;
149 $permissiondellink = 1;
150}
151
152$upload_dir = $conf->mymodule->multidir_output[isset($object->entity) ? $object->entity : 1].'/myobject';
153
154// Security check (enable the most restrictive one)
155//if ($user->socid > 0) accessforbidden();
156//if ($user->socid > 0) $socid = $user->socid;
157//$isdraft = (isset($object->status) && ($object->status == $object::STATUS_DRAFT) ? 1 : 0);
158//restrictedArea($user, $object->module, $object, $object->table_element, $object->element, 'fk_soc', 'rowid', $isdraft);
159if (!isModEnabled("mymodule")) {
161}
162if (!$permissiontoread) {
164}
165
166$error = 0;
167
168
169/*
170 * Actions
171 */
172
173$parameters = array();
174$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
175if ($reshook < 0) {
176 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
177}
178
179if (empty($reshook)) {
180 $backurlforlist = dol_buildpath('/mymodule/myobject_list.php', 1);
181
182 if (empty($backtopage) || ($cancel && empty($id))) {
183 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
184 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
185 $backtopage = $backurlforlist;
186 } else {
187 $backtopage = dol_buildpath('/mymodule/myobject_card.php', 1).'?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
188 }
189 }
190 }
191
192 $triggermodname = 'MYMODULE_MYOBJECT_MODIFY'; // Name of trigger action code to execute when we modify record
193
194 // Actions cancel, add, update, update_extras, confirm_validate, confirm_delete, confirm_deleteline, confirm_clone, confirm_close, confirm_setdraft, confirm_reopen
195 include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php';
196
197 // Actions when linking object each other
198 include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php';
199
200 // Actions when printing a doc from card
201 include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
202
203 // Action to move up and down lines of object
204 //include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php';
205
206 // Action to build doc
207 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
208
209 if ($action == 'set_thirdparty' && $permissiontoadd) {
210 $object->setValueFrom('fk_soc', GETPOST('fk_soc', 'int'), '', '', 'date', '', $user, $triggermodname);
211 }
212 if ($action == 'classin' && $permissiontoadd) {
213 $object->setProject(GETPOST('projectid', 'int'));
214 }
215
216 // Actions to send emails
217 $triggersendname = 'MYMODULE_MYOBJECT_SENTBYMAIL';
218 $autocopy = 'MAIN_MAIL_AUTOCOPY_MYOBJECT_TO';
219 $trackid = 'myobject'.$object->id;
220 include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
221}
222
223
224
225
226/*
227 * View
228 */
229
230$form = new Form($db);
231$formfile = new FormFile($db);
232$formproject = new FormProjets($db);
233
234$title = $langs->trans("MyObject")." - ".$langs->trans('Card');
235//$title = $object->ref." - ".$langs->trans('Card');
236if ($action == 'create') {
237 $title = $langs->trans("NewObject", $langs->transnoentitiesnoconv("MyObject"));
238}
239$help_url = '';
240
241llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-mymodule page-card');
242
243// Example : Adding jquery code
244// print '<script type="text/javascript">
245// jQuery(document).ready(function() {
246// function init_myfunc()
247// {
248// jQuery("#myid").removeAttr(\'disabled\');
249// jQuery("#myid").attr(\'disabled\',\'disabled\');
250// }
251// init_myfunc();
252// jQuery("#mybutton").click(function() {
253// init_myfunc();
254// });
255// });
256// </script>';
257
258
259// Part to create
260if ($action == 'create') {
261 if (empty($permissiontoadd)) {
262 accessforbidden('NotEnoughPermissions', 0, 1);
263 }
264
265 print load_fiche_titre($title, '', 'object_'.$object->picto);
266
267 print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
268 print '<input type="hidden" name="token" value="'.newToken().'">';
269 print '<input type="hidden" name="action" value="add">';
270 if ($backtopage) {
271 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
272 }
273 if ($backtopageforcancel) {
274 print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
275 }
276 if ($backtopagejsfields) {
277 print '<input type="hidden" name="backtopagejsfields" value="'.$backtopagejsfields.'">';
278 }
279 if ($dol_openinpopup) {
280 print '<input type="hidden" name="dol_openinpopup" value="'.$dol_openinpopup.'">';
281 }
282
283 print dol_get_fiche_head(array(), '');
284
285
286 print '<table class="border centpercent tableforfieldcreate">'."\n";
287
288 // Common attributes
289 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php';
290
291 // Other attributes
292 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
293
294 print '</table>'."\n";
295
296 print dol_get_fiche_end();
297
298 print $form->buttonsSaveCancel("Create");
299
300 print '</form>';
301
302 //dol_set_focus('input[name="ref"]');
303}
304
305// Part to edit record
306if (($id || $ref) && $action == 'edit') {
307 print load_fiche_titre($langs->trans("MyObject"), '', 'object_'.$object->picto);
308
309 print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
310 print '<input type="hidden" name="token" value="'.newToken().'">';
311 print '<input type="hidden" name="action" value="update">';
312 print '<input type="hidden" name="id" value="'.$object->id.'">';
313 if ($backtopage) {
314 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
315 }
316 if ($backtopageforcancel) {
317 print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
318 }
319
320 print dol_get_fiche_head();
321
322 print '<table class="border centpercent tableforfieldedit">'."\n";
323
324 // Common attributes
325 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_edit.tpl.php';
326
327 // Other attributes
328 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
329
330 print '</table>';
331
332 print dol_get_fiche_end();
333
334 print $form->buttonsSaveCancel();
335
336 print '</form>';
337}
338
339// Part to show record
340if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
341 $head = myobjectPrepareHead($object);
342
343 print dol_get_fiche_head($head, 'card', $langs->trans("MyObject"), -1, $object->picto, 0, '', '', 0, '', 1);
344
345 $formconfirm = '';
346
347 // Confirmation to delete (using preloaded confirm popup)
348 if ($action == 'delete' || ($conf->use_javascript_ajax && empty($conf->dol_use_jmobile))) {
349 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteMyObject'), $langs->trans('ConfirmDeleteObject'), 'confirm_delete', '', 0, 'action-delete');
350 }
351 // Confirmation to delete line
352 if ($action == 'deleteline') {
353 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1);
354 }
355
356 // Clone confirmation
357 if ($action == 'clone') {
358 // Create an array for form
359 $formquestion = array();
360 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneAsk', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
361 }
362
363 // Confirmation of action xxxx (You can use it for xxx = 'close', xxx = 'reopen', ...)
364 if ($action == 'xxx') {
365 $text = $langs->trans('ConfirmActionMyObject', $object->ref);
366 /*if (isModEnabled('notification'))
367 {
368 require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php';
369 $notify = new Notify($db);
370 $text .= '<br>';
371 $text .= $notify->confirmMessage('MYOBJECT_CLOSE', $object->socid, $object);
372 }*/
373
374 $formquestion = array();
375
376 /*
377 $forcecombo=0;
378 if ($conf->browser->name == 'ie') $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
379 $formquestion = array(
380 // 'text' => $langs->trans("ConfirmClone"),
381 // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
382 // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
383 // array('type' => 'other', 'name' => 'idwarehouse', 'label' => $langs->trans("SelectWarehouseForStockDecrease"), 'value' => $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1, 0, 0, '', 0, $forcecombo))
384 );
385 */
386 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('XXX'), $text, 'confirm_xxx', $formquestion, 0, 1, 220);
387 }
388
389 // Call Hook formConfirm
390 $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
391 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
392 if (empty($reshook)) {
393 $formconfirm .= $hookmanager->resPrint;
394 } elseif ($reshook > 0) {
395 $formconfirm = $hookmanager->resPrint;
396 }
397
398 // Print form confirm
399 print $formconfirm;
400
401
402 // Object card
403 // ------------------------------------------------------------
404 $linkback = '<a href="'.dol_buildpath('/mymodule/myobject_list.php', 1).'?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
405
406 $morehtmlref = '<div class="refidno">';
407 /*
408 // Ref customer
409 $morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, $usercancreate, 'string', '', 0, 1);
410 $morehtmlref .= $form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, $usercancreate, 'string'.(getDolGlobalInt('THIRDPARTY_REF_INPUT_SIZE') ? ':'.getDolGlobalInt('THIRDPARTY_REF_INPUT_SIZE') : ''), '', null, null, '', 1);
411 // Thirdparty
412 $morehtmlref .= '<br>'.$object->thirdparty->getNomUrl(1, 'customer');
413 if (!getDolGlobalInt('MAIN_DISABLE_OTHER_LINK') && $object->thirdparty->id > 0) {
414 $morehtmlref .= ' (<a href="'.DOL_URL_ROOT.'/commande/list.php?socid='.$object->thirdparty->id.'&search_societe='.urlencode($object->thirdparty->name).'">'.$langs->trans("OtherOrders").'</a>)';
415 }
416 // Project
417 if (isModEnabled('project')) {
418 $langs->load("projects");
419 $morehtmlref .= '<br>';
420 if ($permissiontoadd) {
421 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
422 if ($action != 'classify') {
423 $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
424 }
425 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
426 } else {
427 if (!empty($object->fk_project)) {
428 $proj = new Project($db);
429 $proj->fetch($object->fk_project);
430 $morehtmlref .= $proj->getNomUrl(1);
431 if ($proj->title) {
432 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
433 }
434 }
435 }
436 }
437 */
438 $morehtmlref .= '</div>';
439
440
441 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
442
443
444 print '<div class="fichecenter">';
445 print '<div class="fichehalfleft">';
446 print '<div class="underbanner clearboth"></div>';
447 print '<table class="border centpercent tableforfield">'."\n";
448
449 // Common attributes
450 //$keyforbreak='fieldkeytoswitchonsecondcolumn'; // We change column just before this field
451 //unset($object->fields['fk_project']); // Hide field already shown in banner
452 //unset($object->fields['fk_soc']); // Hide field already shown in banner
453 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
454
455 // Other attributes. Fields from hook formObjectOptions and Extrafields.
456 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
457
458 print '</table>';
459 print '</div>';
460 print '</div>';
461
462 print '<div class="clearboth"></div>';
463
464 print dol_get_fiche_end();
465
466
467 /*
468 * Lines
469 */
470
471 if (!empty($object->table_element_line)) {
472 // Show object lines
473 $result = $object->getLinesArray();
474
475 print ' <form name="addproduct" id="addproduct" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.(($action != 'editline') ? '' : '#line_'.GETPOST('lineid', 'int')).'" method="POST">
476 <input type="hidden" name="token" value="' . newToken().'">
477 <input type="hidden" name="action" value="' . (($action != 'editline') ? 'addline' : 'updateline').'">
478 <input type="hidden" name="mode" value="">
479 <input type="hidden" name="page_y" value="">
480 <input type="hidden" name="id" value="' . $object->id.'">
481 ';
482
483 if (!empty($conf->use_javascript_ajax) && $object->status == 0) {
484 include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
485 }
486
487 print '<div class="div-table-responsive-no-min">';
488 if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
489 print '<table id="tablelines" class="noborder noshadow" width="100%">';
490 }
491
492 if (!empty($object->lines)) {
493 $object->printObjectLines($action, $mysoc, null, GETPOST('lineid', 'int'), 1);
494 }
495
496 // Form to add new line
497 if ($object->status == 0 && $permissiontoadd && $action != 'selectlines') {
498 if ($action != 'editline') {
499 // Add products/services form
500
501 $parameters = array();
502 $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
503 if ($reshook < 0) {
504 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
505 }
506 if (empty($reshook)) {
507 $object->formAddObjectLine(1, $mysoc, $soc);
508 }
509 }
510 }
511
512 if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action != 'selectlines' && $action != 'editline')) {
513 print '</table>';
514 }
515 print '</div>';
516
517 print "</form>\n";
518 }
519
520
521 // Buttons for actions
522
523 if ($action != 'presend' && $action != 'editline') {
524 print '<div class="tabsAction">'."\n";
525 $parameters = array();
526 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
527 if ($reshook < 0) {
528 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
529 }
530
531 if (empty($reshook)) {
532 // Send
533 if (empty($user->socid)) {
534 print dolGetButtonAction('', $langs->trans('SendMail'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=presend&token='.newToken().'&mode=init#formmailbeforetitle');
535 }
536
537 // Back to draft
538 if ($object->status == $object::STATUS_VALIDATED) {
539 print dolGetButtonAction('', $langs->trans('SetToDraft'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_setdraft&confirm=yes&token='.newToken(), '', $permissiontoadd);
540 }
541
542 // Modify
543 print dolGetButtonAction('', $langs->trans('Modify'), 'default', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=edit&token='.newToken(), '', $permissiontoadd);
544
545 // Validate
546 if ($object->status == $object::STATUS_DRAFT) {
547 if (empty($object->table_element_line) || (is_array($object->lines) && count($object->lines) > 0)) {
548 print dolGetButtonAction('', $langs->trans('Validate'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=confirm_validate&confirm=yes&token='.newToken(), '', $permissiontoadd);
549 } else {
550 $langs->load("errors");
551 print dolGetButtonAction($langs->trans("ErrorAddAtLeastOneLineFirst"), $langs->trans("Validate"), 'default', '#', '', 0);
552 }
553 }
554
555 // Clone
556 if ($permissiontoadd) {
557 print dolGetButtonAction('', $langs->trans('ToClone'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid) ? '&socid='.$object->socid : '').'&action=clone&token='.newToken(), '', $permissiontoadd);
558 }
559
560 /*
561 // Disable / Enable
562 if ($permissiontoadd) {
563 if ($object->status == $object::STATUS_ENABLED) {
564 print dolGetButtonAction('', $langs->trans('Disable'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=disable&token='.newToken(), '', $permissiontoadd);
565 } else {
566 print dolGetButtonAction('', $langs->trans('Enable'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=enable&token='.newToken(), '', $permissiontoadd);
567 }
568 }
569 if ($permissiontoadd) {
570 if ($object->status == $object::STATUS_VALIDATED) {
571 print dolGetButtonAction('', $langs->trans('Cancel'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=close&token='.newToken(), '', $permissiontoadd);
572 } else {
573 print dolGetButtonAction('', $langs->trans('Re-Open'), 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=reopen&token='.newToken(), '', $permissiontoadd);
574 }
575 }
576 */
577
578 // Delete (with preloaded confirm popup)
579 $deleteUrl = $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken();
580 $buttonId = 'action-delete-no-ajax';
581 if ($conf->use_javascript_ajax && empty($conf->dol_use_jmobile)) { // We can use preloaded confirm if not jmobile
582 $deleteUrl = '';
583 $buttonId = 'action-delete';
584 }
585 $params = array();
586 print dolGetButtonAction('', $langs->trans("Delete"), 'delete', $deleteUrl, $buttonId, $permissiontodelete, $params);
587 }
588 print '</div>'."\n";
589 }
590
591
592 // Select mail models is same action as presend
593 if (GETPOST('modelselected')) {
594 $action = 'presend';
595 }
596
597 if ($action != 'presend') {
598 print '<div class="fichecenter"><div class="fichehalfleft">';
599 print '<a name="builddoc"></a>'; // ancre
600
601 $includedocgeneration = 0;
602
603 // Documents
604 if ($includedocgeneration) {
605 $objref = dol_sanitizeFileName($object->ref);
606 $relativepath = $objref.'/'.$objref.'.pdf';
607 $filedir = $conf->mymodule->dir_output.'/'.$object->element.'/'.$objref;
608 $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
609 $genallowed = $permissiontoread; // If you can read, you can build the PDF to read content
610 $delallowed = $permissiontoadd; // If you can create/edit, you can remove a file on card
611 print $formfile->showdocuments('mymodule:MyObject', $object->element.'/'.$objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $langs->defaultlang);
612 }
613
614 // Show links to link elements
615 $linktoelem = $form->showLinkToObjectBlock($object, null, array('myobject'));
616 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
617
618
619 print '</div><div class="fichehalfright">';
620
621 $MAXEVENT = 10;
622
623 $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', dol_buildpath('/mymodule/myobject_agenda.php', 1).'?id='.$object->id);
624
625 // List of actions on element
626 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
627 $formactions = new FormActions($db);
628 $somethingshown = $formactions->showactions($object, $object->element.'@'.$object->module, (is_object($object->thirdparty) ? $object->thirdparty->id : 0), 1, '', $MAXEVENT, '', $morehtmlcenter);
629
630 print '</div></div>';
631 }
632
633 //Select mail models is same action as presend
634 if (GETPOST('modelselected')) {
635 $action = 'presend';
636 }
637
638 // Presend form
639 $modelmail = 'myobject';
640 $defaulttopic = 'InformationMessage';
641 $diroutput = $conf->mymodule->dir_output;
642 $trackid = 'myobject'.$object->id;
643
644 include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
645}
646
647// End of page
648llxFooter();
649$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()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
Class for MyObject.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
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.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
myobjectPrepareHead($object)
Prepare array of tabs for MyObject.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.